Skocz do zawartości

[C] UART Atmega8 przesylanie wartosci z ADC i generowanie PWM


idzik15

Pomocna odpowiedź

Witam,

Tworzę prosty nadajnik i odbiornik do sterowania wykorzystujący do tego dwie Atmegi8. W nadajniku mam potencjometry. Sygnal jest konwertowany przez ADC i nastepnie wysylany do odbiornika, gdzie generowany jest sygnal PWM do serwomechanizmów.

Problem polega na tym żeby odbiornik rozróżniał, z którego potencjometry wysyłana jest wartość i żeby odpowiedni serwomechanizm tą wartość otrzymał.

Myślałem nad jakimś sposobem adresowania każdego potencjometru i póki co najbliżej działający pomysł wygląda tak:

while(1) //petla glowna
   { if ( (PINC & 1<<PC3) )
   	{
   	USART_transmit(0b11111111); //wartosc "adresu"
   	USART_transmit(pwm1); //pwm1 - to wartosc z ADC
   	}

   	if ( (PINC & 1<<PC2) )
      	{
      	USART_transmit(0b10000001);
     	USART_transmit(pwm2);
      	}

//kawalek funkcji odbierajacej

while (! (UCSRA & (1 << RXC)) );
	{
		receiveData = UDR;
if (receiveData == 0b11111111)
		{
			pwm1 = UDR;
		}
		if (receiveData == 0b10000001)
		{
			pwm2 = UDR;
		}

Generalnie pomysł polega na tym, że idzie 1 bajt "adres", następnie 1 bajt "dana". I tak w kółko. Tylko mam problem z zaimplementowaniem tego.

Sam ADC, PWM, UART itd działają OK kiedy przesyłam jedną wartość ( to jest tylko z jednego potencjometru, drugi mam zakomentowany). Kiedy mam oba to też działa ale ewidentnie sypią się błędy bo jednym potencjometrem czasami steruję jednym serwem a czasami dwoma.

Za wszelką pomoc i sugestie dzięki 🙂

Link do komentarza
Share on other sites

sugeruję ci żebyś zrobił na swoje potrzeby własny protokół transmisji.

Zacznij od określenia początku transmisji, może to być np. wysłanie pod rząd 4 bajtów 0xff, wtedy odbiornik będzie wiedział że na pewno jest w dobrym miejscy transmisji. Następnie zaczynasz wysyłać dane z potencjometrów,(adresy już nie są potrzebne) i na końcu wysyłasz np 0x00, żeby zakończyć transmisję. W takim sposobie realizacji będziesz miał kontrolę nad poprawnością odbieranych danych. Wszystkie ramki które nie spełniają kryterium -> 0xff - 0xff - 0xff - 0xff - data - 0x00. Przy takim założeniu potencjometr nie mógłby mieć wartości 0x00 i 0xff.

Jeśli jest lepszy sposób na to chętnie poznam 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.