Skocz do zawartości

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


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 😉

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ą.

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ć.

  • 10 miesiące później...

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?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...