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

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

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.