Configurarea uart avr, mainloop

UART este un transmițător universal de transmițător asincron, un transmițător universal asincron. Dar atunci când este vorba mai ușor, acesta este un port serial obișnuit (de asemenea, cunoscut sub numele de COM-port, de asemenea, cunoscut sub numele de RS-232), care au fost adesea folosite în calculatoarele personale pentru a se conecta la șoareci, modem și alte dispozitive periferice. Odată cu extinderea omniprezentă a portului USB, portul serial și-a pierdut popularitatea, dar în microcontrolere este încă destul de des folosit, deoarece aceasta este una dintre cele mai ușoare căi de a conecta două dispozitive. Utilizând uart, puteți conecta un modem GSM, un receptor GPS sau alt microcontroler la microcontroler. În funcție de convertoarele de nivel folosite, pot fi obținute rs232 sau rs485. Există, de asemenea, convertoare RS232-USB, RS232-Ethernet, RS232-bluetooth, care permite să vă conectați dispozitivul la un microcontroler cu interfețe RS232 folosind mai moderne.







UART utilizează două linii (ieșiri microcontroler): rx pentru recepție și tx pentru transmisie. În USART, se adaugă o linie clk suplimentară pentru a sincroniza receptorul și emițătorul, ceea ce vă permite să măriți rata de schimb.

Datele uart sunt transmise în următorul format:

Bit inițial - servește pentru a determina începutul pachetului
Biturile de date - pot fi de la 5 la 9 biți, dar cel mai adesea 8 biți sunt utilizați - un octet.
Bit bit - vă permite să verificați dacă a apărut o eroare în timpul transmisiei.
Biti de stop - 1 sau 2 biți, servesc pentru a determina sfârșitul trimiterii.

Pentru uart în avr atmega, sunt configurați mai mulți parametri:

  1. cursul de schimb
  2. numărul de biți de date
  3. verificarea parității
  4. numărul de biți stop

Luați în considerare configurarea uart / usart pentru avr atmega8.

Stabilirea cursului de schimb de către uart în avr

Pentru a regla viteza, utilizați registrul UBRR (Usart Boud Rate Register)

Pentru a seta viteza în acest registru, trebuie să notați valoarea calculată de formula:

  • F - frecvența ceasului pe care funcționează microcontrolerul avr, de exemplu 11059200 pentru cuartul 11.0592 MHz
  • B - viteza necesară, de exemplu 115200 (bps)

Un exemplu de calcul pentru cuarț 11.0592 MHz și o viteză de 115200 bps:

Rezultatul este scris în UBRR, tk. acest registru este de 16 biți, apoi accesul este organizat prin intermediul a două registre pe 8 biți

UBRRH = 0; // mare octet UBRRL = 5; // low byte

Dacă, ca urmare a calculării UBRR, nu a fost obținut un întreg, o valoare rotunjită este înscrisă în registru, cursul de schimb va fi diferit de cel specificat în calcul. Discrepanța în frecvență poate duce la funcționarea defectuoasă a schimbului de date, deci trebuie să alegeți un cuarț în care pentru o anumită rată de schimb UBRR va fi un număr întreg.

De asemenea, în registrul UCSRA există un bit U2X, care permite dublarea ratei de schimb. În cazul în care acest bit este setat, se folosește următoarea formulă pentru a calcula valoarea UBBR:

Ajustați numărul de biți de date pentru uart în avr

Dependența numărului de biți de date de la starea de biți UCSZx a registrului UCSRC pentru uart / usart în atmega8

Multumesc pentru articol. Totul este foarte clar.
În primul rând mi-am scris programul, dă un nonsens.
Cred că poate sunt curvoruk, ți-am marcat ... De asemenea, nu simboluri clare.
Cazul unui curs de schimb clar nu se potrivește. Firește, m-am bazat pe magicianul meu. Există un cuarț la 5MHz, dar fyuzy stand în mod implicit, astfel încât mega funcționează de la un generator intern cu o frecvență de 1MHz.






înseamnă (1000 000 / (9600 * 16)) -1 = 5,5 au luat 5 și 6 pentru UBRRL / Nici unul nu este potrivit. Circuitul este OK, deoarece a blocat deja programul pentru UART, a lucrat la reguli. În cod, calculul UBRRL a fost "automat" la 9600, și că în loc de frecvența MC acolo nu a fost înțeles, nu pot găsi un prog ...
Spune-mi ce poate fi? (Poate că frecvența MK nu este chiar 1 MHz. Puteți afla cum?)

Artem Dvinin spune:

foton6, care este microcontrolerul dvs.?
Pentru a verifica frecvența, puteți modifica starea oricărei ieșiri după o anumită perioadă de timp și puteți vedea osciloscopul. Ei bine, sau ca o ultimă soluție, LED-ul clipește o dată pe secundă și văd de câte ori va lumina intermitent timp de un minut.

Artem Dvinin spune:

Vreme bună, Vital.
Ați înțeles corect, atunci când faceți schimb de-a lungul rețelei, există un maestru și mai mulți sclavi.
Frecvența ceasului poate fi diferită, dar frecvența schimbului ar trebui să fie aceeași, dacă se folosește un oscilator RC intern, este mai bine să o calibrați, încât să existe mai puține erori.

În acest caz, RS485 este de obicei utilizat. Nu există o sincronizare suplimentară. Eșecurile și pierderile sunt urmărite cu timeouts și cu sumele de control.

Acesta poate fi luat ca bază modbus.

Dacă există mai multe întrebări - scrieți, voi încerca să răspund.

P / S Dacă nu este un secret, ce fel de rețea de dispozitive?

Da, totul este Artem prozaic până când toate dispozitivele din capul meu), nu a fost o lucrare practică obișnuită într-o lectură live și imaginația, atât de multe întrebări. În ceea ce privește protocolul în cap, de asemenea, au o idee ca apa pura programator structuri de date diferite algoritmi sofisticați este ușor pentru mine, lucrul cu rețele de aproape și protocoalele sale sunt folosite și altele ascultat), dar experiența cu circuitele nu a fost, și în valoare de gândire la nivelul dispozitivului și ținând seama de practica de gândire eșantionate cu privire la modul în care o bucată de lucrări de fier este logica în capul meu ca funcționează fără lecturi, dar într-adevăr doriți să vedeți ce proiectele finalizate cu schemele de diferite construi și de a planta codul sursă, poate avea astfel și Točník care mi-ar servi lucrurile bune?) Multumesc

de îndată ce am percep cel puțin competențele minime să înceapă practica, și asigurați-vă că pentru a partaja toate iluzii) contează de fapt mult diferite și în diferite discipline, dacă sunteți interesat de a transfera abilitățile sau pot ajuta la găsirea unor soluții la problemele de tortură)

Artem Dvinin spune:

Vă rugăm să explicați linia
uart_puts ("Salut uart \ r \ n"); În principiu înțeleg că trimitem aici valori Bună ziua și mutați cursorul pe linia următoare. Aici, din nou, condiția dacă ((c == \\ n ') || (c == \ r')) îmi spune de ce \ n și de ce există mai multe astfel de notații. și cum să luați în mod corect o linie cu C #

Artem Dvinin spune:

Serghei,
ai dreptate, uart_puts ( «Bună ziua UART \ r \ n») transmite linia UART «Bună ziua» și apoi UART transferă simbolul koretki '\ r' și linefeed '\ n'.
Dacă luăm această linie în terminal, atunci când primesc caracterul „\ r“ poziția curentă se mută la începutul liniei, iar atunci când primesc caracterul „\ n“ a trece la o nouă linie.
În plus față de aceste simboluri, '\ t' este de asemenea folosit, caracterele tab, '\ 0' este caracterul nul (sfârșitul liniei).

La introducerea unei linii de la terminal, intrarea se termină cu apăsarea tastei ENTER și, în funcție de setările terminalelor, trimite fie '\ r \ n', fie '\ n \ r' sau '\ n'. Terminăm această linie și acceptăm linia și mergem la procesarea acesteia.

Nu sunt un expert C #, dar vă pot spune că într-un mediu Net2.0 pentru a lucra cu un port COM, puteți utiliza clasa SerialPort și apelați metoda ReadLine pentru a citi linia.

// Măsurați DC cu AVR #include #include #include nesemnate int tensiune, curent, adc_counter; volatilă nesemnată lungă valoare_value, valoarea curentă; // Funcțiile de lucru cu LCD #define RS PD0 #define EN PD2 // Funcția de transfer a comenzii void lcd_com (char unsigned)

(1 lt; lt; / RTI & gt; RS); // RS = 0 (comenzi de scriere) PORTD | = (1 lt; lt; / RTI & gt; RO); // EN = 1 (începe scrierea comenzii în LCD) PORTD - = 0x0F; PORTD | = (p - 0xF0); // cel mai mare număr este _delay_us (100); PORTD - =

(1 lt; lt; / RTI & gt; RO); // EN = 0 (sfârșitul înregistrării comenzii pe ecranul LCD) _delay_us (100); PORTD | = (1 lt; lt; / RTI & gt; RO); // EN = 1 (începe scrierea comenzii în LCD) PORTD - = 0x0F; PORTD | = (p lt; lt; / RTI & gt; 4); // jubilă junior _delay_us (100); PORTD - =

(1 lt; lt; / RTI & gt; RO); // EN = 0 (sfârșitul comenzii de scriere în LCD) _delay_us (100);> // Funcția de transfer de date void lcd_data (caracterele nesemnate)

(1 lt; lt; / RTI & gt; RO); // EN = 0 (sfârșitul înregistrării comenzii pe ecranul LCD) _delay_us (100); PORTD | = (1 lt; lt; / RTI & gt; RO); // EN = 1 (începe scrierea comenzii în LCD) PORTD - = 0x0F; PORTD | = (p lt; lt; / RTI & gt; 4); // jubilă junior _delay_us (100); PORTD - =

(1 lt; lt; / RTI & gt; RO); // RO = 0 (sfârșitul comenzii scrie în LCD) _delay_us (100) linia> // funcție de ieșire de pe ecranul LCD void lcd_string (comanda unsigned char, char * string)



Trimiteți-le prietenilor: