Skocz do zawartości

[C] Komunikacja między atmegą8 i atmegą16


Mily2001

Pomocna odpowiedź

Zakodziłem coś takiego:

void convert(int a, int *tab)
{
int tmp=1024;
for(int i=0; i<11; i++)
{
	if(tmp<=a)
	{
		tab[i]=1;
		a-=tmp;
	}else
	{
		tab[i]=0;
	}
	tmp/=2;
}
}
void UART_Wyslij(int liczba) 
{
while(bit_is_clear(UCSRA,UDRE)) {}
UDR=15;
_delay_ms(1);
int mail[11];
convert(liczba, mail);
for(int i=0; i<11; i++)
{
	while(bit_is_clear(UCSRA,UDRE)) {}

	UDR=mail[i];
	_delay_ms(1);
	while(bit_is_clear(UCSRA,UDRE)) {}
	UDR=3;
	_delay_ms(1);
}
}

oraz dla odbiornika:

int UART_Odbierz() 
{
int tmp=1024, wyn=0;
while(UDR!=15){}
for(int i=0; i<11; i++)
{
	while(UDR==15||UDR==3){}
	wyn+=tmp*UDR;
	tmp/=2;
	while(UDR!=3){}

}
return wyn;
}

Niestety to nie działa tak jak powinno. W googlu nie znalazłem niczego co mogłoby pomóc w rozwiązaniu przesyłania liczb >255. Jeśli ktoś ma jakieś pomysły to proszę, niech się z nami podzieli 😉

Link do komentarza
Share on other sites

Mnie C nie mówi zupełnie nic, za cholerę nie rozumiem tej symboliki, ale....

Umiesz odebrać jedną daną typu byte i to różną od "znaczników" 15 i 3? Wstawiaj więc dane odebrane w tablicę typu byte.

Po odebraniu zanku stopu przetwórz właściwe elementy tablicy w pętli I, przepisując zmiennej int tablica * 256 + tablica[i+1] i już masz zmienną dwubajtową.

Link do komentarza
Share on other sites

Ok, poradziłem sobie poprzez wysyłanie każdej cyfry liczby po kolei. Kody, może komuś się przydadzą:

Wysyłanie:

void UART_Wyslij (int liczba)
{
int czy;
if(liczba<10){czy=1;}
if(liczba>9 && liczba<100){czy=2;}
if(liczba>99 && liczba<1000){czy=3;}
if(liczba>999){czy=4;}
w8;
UDR=32;
w8;
int tmp=liczba%10;
UDR=tmp;
w8;
UDR=16;
if(czy>1){
	liczba=liczba/10;
	tmp=liczba%10;
	w8;
	UDR=tmp;
	w8;
	UDR=16;
	if(czy>2){
		liczba=liczba/10;
		tmp=liczba%10;
		w8;
		UDR=tmp;
		w8;
		UDR=16;
		if(czy>3){
			liczba=liczba/10;
			tmp=liczba%10;
			w8;
			UDR=tmp;
			w8;
			UDR=16;
		}else{
			w8;
			UDR=0;
			w8;
			UDR=16;
		}
	}else{
		w8;
		UDR=0;
		w8;
		UDR=16;
		w8;
		UDR=0;
		w8;
		UDR=16;
	}
}else{
	w8;
	UDR=0;
	w8;
	UDR=16;
	w8;
	UDR=0;
	w8;
	UDR=16;
	w8;
	UDR=0;
	w8;
	UDR=16;
}
}

i odbieranie:

int UART_Odbierz()
{
int tmp, x=1, wyn=0;
while(tmp!=32)
{
	tmp=UDR;
}
for(int i=0; i<4; i++)
{
	tmp=UDR;
	while(tmp==32 || tmp==16)
	{
		tmp=UDR;
	}
	tmp=UDR;
	if(tmp>9){i--; continue;}else{
		wyn+=tmp*x;
		x*=10;
	}
	while(tmp!=16)
	{
		tmp=UDR;
	}
}
return wyn;
}

Wiem że kody nie są najładniejsze ale liczy się to że działają 😋

W wysyłaniu jest jeszcze #define w8 while(bit_is_clear(UCSRA,UDRE))

Oba programy działają tylko dla liczb <10000 ale można to łatwo rozszerzyć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Hej,

Bardzo pilnie potrzebuję zrealizować takie coś. Mam dwie atmegi, 8 i 32. Do mniejszej podłączony jest wyświetlacz 2x siedmiosegmentowy. Procek ten realizuje odliczanie na tym wyświetlaczu. Jedno z przerwań służy do zatrzymywania tego odliczania. Potrzbuję bardzo aby z Atmegi32 móc wysłać od ilu ma się zacząć odliczanie (wartość z przedziału 1 do 99). Próbowałem za pomocą kodu, który jest na forum. Nie zrozumiałem tej części o odczycie w przerwaniu. Podłączyłem linie zgodnie z zaleceniem i wkleiłem kody. Jednak nie działa. Mógłbyś mi ktoś jakoś pomóc?

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.