Vizitator wavve Postat Februarie 7, 2010 Partajează Postat Februarie 7, 2010 Buna seara,Doresc sa realizez o comunicare seriale intre un aparat a carui propietati le voi mentiona mai jos si PC. Pentru acest scop am ales utilizarea unui Atmega128 tocmai datorita celor 2 Usart-uri pe care le are la dispozitie.Aparatul de care vorbesc foloseste protocolul MDB (Multi Drop Bus):- BAUD = 9600 NRZ-1 Start/1Stop bit-8 biti de date-1 bit MODE ( in functie de acest bit "0/1" se selecteaza daca datele "sosite" reprezinta o adresa sau comenzi)Astfel am legat Usart1 la TX/RX de la aparat si Usart0 la PC (hyperterminal).Momentan vreau sa testez daca receptia pe 9 biti functioneaza si primesc corect.Am facut initializarile pentru Usart1 si Usart0 in modul de comunicare pe 9biti respectiv 8biti.Practic comunicarea functioneaza in felul urmator:Aparatul transmite pe 9 biti -> USART0 Mega128 primeste pe 9 biti -> USART1 MEGA128 transmite 2 caractere pe 8 biti catre hyperterminal ( primul reprezint primii 8 biti iar cel de-al doilea ultimul bit).Am facut si niste teste dar se pare ca sunt niste probleme de nesicronizare undeva la comunicarea intre aparat si atmega.Daca cineva aici are experienta cu modul de lucru pe 9 biti poate imi da o mana de ajutor.O sa adaug si codul.Astept niste pareri cu eventuale cauze care pot provoca aceste nesincronizari de care vb ca raman fara idei.Poate influenta clock-ul cumva comunicarea intre cele 2 cu toate ca baud-ul este acelasi la amandoua?Am pe Atmega un clock extern de 3.6864 ales tocmai pt ca are eroare 0.Multumesc. Link spre comentariu
Vizitator wavve Postat Februarie 7, 2010 Partajează Postat Februarie 7, 2010 /*************************************************************************** Receptie USART1 - Recepetie pe 9 biti***************************************************************************/unsigned int USART1_Receive( void ){ unsigned char resh, resl; unsigned char status; unsigned int data_received = 0; /* Wait for data to be received */ while ( !(UCSR1A & (1<<RXC1)) ) ; /* Get status and 9th bit, then data */ /* from buffer */ status = UCSR1A; resh = UCSR1B; resl = UDR1; /* If error, return -1 */ if ( status & (1<<DOR1)) return 0xffff; /* Filter the 9th bit, then return */ resh = (resh >> 1) & 0x01; data_received = ((unsigned int) resh << 8) | resl ; //return ((resh << 8) | resl); //return resh; return data_received;} Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum