Care sunt setările UART din telefon. Explorarea portului serial UART

Deoarece voi folosi UART pentru a lega dispozitivele blogului cu proiectele dvs., vă voi spune puțin despre cum funcționează și cum să îl utilizați.

Universal Asynchronous Transceiver (UART) este o interfață destul de veche și comună. Până de curând conector Port COMși (același UART, doar nivelurile de tensiune sunt diferite) a fost un atribut obligatoriu al fiecărui computer. Acum portul COM se „stinge” treptat și dacă nu este neobișnuit pe „turnuri”, atunci pe laptopuri nu mai este la vedere. Dar, având în vedere simplitatea și popularitatea interfeței, marea majoritate a microcontrolerelor au UART ca parte a perifericelor lor. Si daca Calculator personal UART încetează să mai satisfacă din cauza vitezei reduse și a imposibilității extinderii, atunci interfața este convenabilă pentru microcontrolere și utilizarea acesteia va continua.
Deoarece UART este în multe microcontrolere, atunci îl vom folosi ca una dintre interfețele pentru conectarea dispozitivelor de blog cu dispozitivele dvs. electronice.
A începe o teorie a interfeței(fără detalii suplimentare). Pentru comunicarea prin interfața UART, sunt utilizate două picioare ale controlerului RXD– pentru primirea mesajelor (Receiver) și TXD– pentru a trimite mesaje (Transmitter). UART este o interfață full duplex. Aceasta înseamnă că receptorul și emițătorul funcționează independent unul de celălalt. În plus, emițătorul sau receptorul pot fi oprite separat, eliberând piciorul controlerului pentru alte utilizări. Transmiterea (respectiv, recepția) mesajelor se realizează prin pachete fixe de biți (un astfel de pachet se numește cadru). Cadrul este format din start-bit(fiecare cadru începe cu el), biți de date(poate fi de la 5 la 9 biți), bit de paritate(verificarea corectitudinii transferului de date) și unul sau doi biți de oprire(semnal de sfârșit al cadrului).

Unde:
INACTIV- în așteptarea schimbului - ar trebui să fie 1 ;
Sf- Start-bit - întotdeauna 0 ;
(n)- Biți de date - pot fi de la 5 la 9 biți;
P— bit de paritate;
sp- Oprește-te - întotdeauna 1.

Dacă mesajul conține mai mult de un octet, fiecare octet următor este transmis într-un cadru separat. Transmisia (și recepția) datelor se realizează la anumite frecvențe fixe (măsurate în Baud = bit / sec) de la 600 la 128.000 Baud. Condiția pentru funcționarea corectă a portului este să setați aceiași parametri atât pentru receptor, cât și pentru transmițător (viteză, număr de biți de date, bit de paritate, număr de biți de oprire).

Să cădem de acord asupra formatului cadrului (setări UART) pentru dispozitivele de blog:
Viteza de transmisie - 9600 (acesta este în termen de un kilobyte pe secundă);
Numărul de biți de date - 8 (cel mai convenabil pentru a lucra cu);
bit de paritate - chiar(se efectuează verificarea parității);
Numărul de biți de oprire - 1;
Într-o versiune prescurtată, arată astfel:
Baud Rate: 9600, 8 date, 1 oprire, paritate uniformă

UART poate funcționa și în modul sincron (un alt picior al controlerului este folosit pentru aceasta) și poate accepta adresarea mai multor dispozitive. Dar din moment ce dispozitivele noastre sunt simple și nu avem nevoie de aceste funcții, nu le vom lua în considerare.

Dacă e nevoie caracteristici suplimentare, apoi Descriere completa UART este în fișa de date pentru microcontroler - consultați-l.

Pentru ca dispozitivul de pe blog să înceapă să lucreze cu proiectul dvs. prin interfața UART, trebuie să:
1 Conectați dispozitivul blog la pinii corespunzători ai microcontrolerului.
2 Configurați transceiver-ul UART al controlerului dvs. Pentru a face acest lucru, scrieți anumite valori în porturile I/O corespunzătoare.
3 Aveți (scriere) proceduri pentru primirea/transmiterea mesajelor prin UART în programul dumneavoastră.

Acum să ne uităm la fiecare articol în detaliu:


1 CONECTAREA DISPOZITIVELOR PRIN UART.

Totul este simplu aici:
- dacă sunt planificate atât recepția, cât și transmisia - dispozitivele sunt conectate prin două linii - TX_devices de la RX_project și TX_project de la RX_devices (în continuare, prin „dispozitiv” voi înțelege dispozitivul de pe blog, iar prin „proiect” - proiectul dumneavoastră electronic) ;
- dacă este nevoie doar de recepție (de exemplu, datele sunt primite de la tastatură) - TX_devices de la RX_project;
- dacă este necesar doar transferul (de exemplu, datele sunt transferate pe dispozitivul de afișare) - TX _a proiectului de la RX_device.


2 CONFIGURAREA TRANSMITĂTORULUI UART.

După cum am convenit mai sus, formatul de cadru pentru dispozitivele noastre este:
Baud Rate: 9600, 8 date, 1 oprire, paritate uniformă
Pentru a lucra cu acest format de cadru, în secțiunea de inițializare a dispozitivului a programului dvs., scrieți valorile corespunzătoare în porturile necesare intrare/ieșire controler. Pentru a face acest lucru, deschideți secțiunea de fișă de date USART pentru microcontrolerul dvs. și selectați/calculați valorile necesare. Dar puteți face totul mult mai ușor - utilizați reglajele periferice automate - CodeWisards.
Să luăm ca exemplu microcontrolerul Attiny2313 (prin analogie, puteți configura orice microcontroler) și configurați UART în limbi diferite programare.

Noțiuni introductive - Algorithm Builder.
Totul este extrem de simplu aici - creați un proiect ( Fișier/Nou). Selectăm microcontrolerul și frecvența oscilatorului principal în Opțiuni/Opțiuni de proiect...(ATtiny2313, oscilator de ceas intern la 8MHz). Faceți clic pe butonul de pe bara de instrumente "S"- reglatorul registrelor de control „select USART iar in fereastra care se deschide completati totul ca in poza. Totul este semnat și clar.


Clic "BINE". Terminat - UART este inițializat și gata de funcționare.
Dacă aveți nevoie doar de un receptor sau doar de un transmițător, puneți doar bifa necesară - un picior neutilizat poate fi folosit ca port I/O.

Deoarece întreruperile vor fi permise în program, trebuie să setați indicatorul stivei la sfârșitul memoriei înainte de a inițializa USART ( "S"/Stack Pointer SP) și titlul partea de sus a blocului cu cuvântul cheie " resetare».


În asamblator. Sincer să fiu, nu știu dacă asamblatorii AVR au periferice, dar chiar dacă nu, o soluție simplă este să folosești același Algorithm Builder. În fereastra de setări USART, în partea dreaptă, există comenzi mnemonice (Operațiuni) care oferă caracteristicile selectate. Traducerea lor în cod de asamblare nu este dificilă.

Traducem în comenzi de asamblare.

;Inițializare USART ; Parametri de comunicare: 8 date, 1 oprire, paritate uniformă;Receiver USART: Activat ;Transmițător USART: Activat ;Mod USART: Asincron ;Viteză de transmisie USART: 9600 uart_init: LDI R16, 00 USD OUT UBRRH, R16 LDI R16, 33 USD OUT UBRRL, R16 LDI R16, 26 USD R16, UCSDIRC 00 USD OUT UCSRA, R16 LDI R16, 98 USD OUT UCSRB, R16

;Inițializare USART ;Parametri de comunicare: 8 date, 1 oprire, paritate uniformă ;Receptor USART: activat ;Transmițător USART: activat ;Mod USART: asincron ;Rată de comunicare USART: 9600 uart_init: LDI R16, 00 USD OUT UBRRH,R16 LDI3 R16 OUT UBRRL, R16 LDI R16, 26 USD OUT UCSRC, R16 LDI R16, 00 USD OUT UCSRA, R16 LDI R16, 98 USD OUT UCSRB, R16

CodeVision conține propriul Peripheral Customizer (CodeWisard), chiar mai rău decât Algorithm Builder. Pentru a genera setări UART, faceți clic pe pictograma roată ( CodeWisardAVR) pe bara de instrumente. În fereastra care se deschide, mai întâi selectați fila cipîn el selectăm microcontrolerul și setăm frecvența cu care va funcționa oscilatorul principal. Apoi, selectați și completați fila USARTîn conformitate cu caracteristicile cerute (dacă aveți nevoie doar de un receptor sau doar de un transmițător, bifați caseta corespunzătoare).

// Inițializare USART // Parametri de comunicare: // 8 date, 1 oprire, paritate uniformă// Receptor USART: Pornit // Transmițător USART: Pornit // Mod USART: Asincron // Rată de transmisie USART: 9600 UCSRA= 0x00 ; UCSRB=0x98 ; UCSRC=0x26 ; UBRRH=0x00; UBRRL=0x33 ;

// Inițializare USART // Parametri de comunicare: // 8 date, 1 oprire, paritate uniformă // Receptor USART: Activat // Transmițător USART: Activat // Mod USART: Asincron // Rată de transmisie USART: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x26; UBRRH=0x00; UBRRL=0x33;

Salvați proiectul generat ( File\Generate, Save and Exit) - gata. A fost creat un proiect cu toate setările necesare pentru UART. Alte periferice (de multe ori nu sunt necesare) sunt, de asemenea, inițializate în proiect. După crearea unui proiect, îl puteți corecta - eliminați tot ce nu aveți nevoie.


3 CREAREA PROCEDURILOR PENTRU PRELUCRAREA MESAJELOR UART.

O mică digresiune.
Lucrul cu UART poate fi organizat căi diferite. De exemplu:
- doar așteptați în corpul programului când sosește mesajul, verificând în mod constant bitul de primire a mesajului;
- activați întreruperea și procesați mesajul în corpul întreruperii;
- creați un buffer în care mesajele vor fi conduse de întreruperi, iar deja în corpul programului, „liber”, citiți valorile din buffer;
Există mai multe opțiuni - alegerea vă aparține.
Dar, pe baza faptului că mesajele de la dispozitive, în cea mai mare parte, sunt simple (un octet) și nu prea frecvente (de exemplu, o tastatură - câteva clicuri pe secundă, nu mai mult), cea mai bună opțiune, în ceea ce privește economisirea memoriei și viteza de procesare, va exista o procesare a mesajului UART în corpul întreruperii. Prin procesare, mă refer la citirea registrelor, verificarea recepției corecte și stocarea octetului primit într-o variabilă globală (un fel de buffer de un octet). Dacă sunt presupuse manipulări simple cu octetul primit, acestea pot fi organizate și în corpul întreruperii.

Pe viitor, mă voi concentra pe un astfel de algoritm de lucru, dacă altul nu este mai justificat.

Generator de algoritmi.
Recepția datelor se efectuează în procedura de gestionare a întreruperilor la sfârșitul primirii unui octet (cadru). Octetul primit este scris în variabila globală De laGCnDevice.În corpul programului, valoarea FromGCnDevice este verificată, dacă este zero, nu se primește nimic.

Dacă lucrul cu valoarea primită nu este dificil, o puteți face chiar în corpul de gestionare a întreruperilor.
Transfer de date să fie efectuată fără a utiliza întreruperi și un buffer (hardware, transmițătorul UART are un buffer de 2 octeți). Aceasta înseamnă că doar un singur octet vor fi transmisi confortabil (care este ceea ce intenționăm să facem). Dacă încărcați o linie de date dintr-o dată, atunci microcontrolerul se va ocupa doar de această linie.

asamblator.
Un octet este primit într-o întrerupere, rezultatul rămâne în registrul r17 (salvare în SRAM dacă este necesar).

; Gestionarea unei întreruperi atunci când este primit un octet PUSH R16 IN R16, SREG PUSH R16 IN R16, UCSRA ;Citiți starea de la UCSRAÎN R17, UDR ;Citiți datele din UDR ANDI R16, $1C BREQ_END ; Verificați dacă există erori CLR-R17_END: ;in R17 este octetul primit POP R16 OUT SREG, R16 POP R16 RETI

;Întreruperea de gestionare la sfârșitul recepției octetului PUSH R16 IN R16,SREG PUSH R16 IN R16,UCSRA ;Citiți starea de la UCSRA IN R17,UDR ;Citiți datele din UDR ANDI R16,$1C BREQ _END ;Verificați erorile CLR R17 _END:​ ​;în R17 este octetul primit POP R16 OUT SREG,R16 POP R16 RETI

Transfer de octeți

LDI R16, valoarea SBIS UCSRA, UDRE RJMP PC-1 ; așteptarea pregătirii pentru a primi un octet OUT UDR, R16; octet de cască


C - în programul CodeVisionAVR.
Totul este doar CodeWizard, împreună cu inițializarea UART, creează și proceduri pentru recepție și transmitere. Singurul lucru care poate fi modificat aici este să aruncați tamponul de recepție (dacă activați întreruperile de recepție sau transmitere, se creează automat un buffer). Dacă acest buffer nu este necesar, rutina de întrerupere a primirii octet și rutina de transmisie ar putea arăta astfel:

// Variabilă globală - date primite de la dispozitiv // Dacă FromGCnDevice==0 - nu s-a primit nimic char FromGCnDevice; // Gestionarea întreruperii de primire a sfârșitului de octetîntrerupe [ USART_RXC] void usart_rx_isr(void ) ( stare caracter; // Obține starea și octetul de date status= UCSRA; FromGCnDevice=UDR; // Dacă a apărut o eroare la primirea unui octet, atunci FromGCnDevice=0 if ((stare & amp; (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN) ) != 0 ) FromGCnDevice= 0 ; ) // Procedura de transfer de octeți void ToGCnDevice(car c)( // Așteptăm sfârșitul transferului octetului anteriorîn timp ce ((UCSRA & amp; DATA_REGISTER_EMPTY) == 0 ) ; // Trimite un octet UDR= c; )

// Variabilă globală - date primite de la dispozitiv // If FromGCnDevice==0 - nimic primit char FromGCnDevice; // Gestionarea sfârșitului de întrerupere a octetului de primire void usart_rx_isr(void) ( starea caracterului; // Obține starea și starea octetului de date=UCSRA; FromGCnDevice=UDR; // Dacă a apărut o eroare la primirea octetului, atunci FromGCnDevice=0 if ((status & ( FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))!=0)FromGCnDevice=0; ) // Procedura de transfer de octeți void ToGCnDevice (car c) ( // Așteptați sfârșitul transferului de octet anterior în timp ce ((UCSRA & DATA_REGISTER_EMPTY)==0); // Transfer octet UDR=c; )


În și despre UART. Acest lucru ar trebui să fie suficient pentru a conecta dispozitivul la proiectul dvs. Conform analogiei cu exemplele de mai sus, totul poate fi făcut cu ușurință pentru alte microcontrolere ATS.
Mai jos las arhivele programelor cu exemple de operare UART pentru ATtiny2313.
- Un exemplu de proiect creat automat de CodeWisionsAVR
- Un exemplu de program pentru lucrul cu UART în Algorithm Builder


P.S. Am puține cunoștințe despre C și Asm, așa că este permis să dau cu picioarele și să arunci papucii! Învățăm cu toții.


Inițializat

(Vizitat de 10 796 de ori, 2 vizite astăzi)

Protocolul de comunicare UART
Transceiver asincron universal

cuvânt înainte

Electronica digitală modernă este întotdeauna conexiuni între circuite (procesoare, controlere etc.) pentru a crea un sistem simbiotic. Pentru ca microcircuitele individuale să se „înțeleagă” între ele, trebuie să împărtășească un protocol de comunicare comun. De-a lungul anilor de existență a tehnologiei digitale, au fost dezvoltate multe protocoale. În general, toate pot fi împărțite în două grupuri mari - paralele și secvențiale.

Paralel sau serial?

Interfețele paralele transmit simultan (în paralel) mai multe biți de informație (de unde, de fapt, numele acestora). Aceste interfețe necesită magistrale de 8, 16 sau mai mulți conductori pentru transferul de date.

Diagrama unei interfețe paralele pe 8 biți. Transferul de date este controlat de semnalul de ceas CLK. Un octet de date este transmis la fiecare impuls CLK. Se folosesc 10 fire.

Spre deosebire de paralel, interfețele seriale transmit câte un bit. Teoretic, o astfel de interfață poate funcționa pe un singur fir. În practică, se folosesc până la patru.

Aceste două interfețe pot fi comparate cu fluxul mașinilor. Interfața paralelă este o autostradă largă cu mai mult de opt benzi, în timp ce interfața serială seamănă mai mult cu un drum de țară cu două benzi. Mega - Autostrada, posibil are o mai mare debitului dar foarte scump din punct de vedere al construcției. Un drum rural își îndeplinește pur și simplu funcția și costă de multe ori mai puțin decât o mega-autostradă cu mai multe benzi.

Fără îndoială, interfețele paralele au avantajele lor. Este directitatea, viteza și ușurința de implementare. Dar o primim pe cheltuiala un numar mare fire (linii) de transmisie a datelor. Dacă ați dezvoltat vreodată programe pentru microcontrolere (de exemplu, în mediul Arduino), probabil știți cât de prețioase pot fi liniile I/O. Prin urmare, optăm adesea pentru comunicarea în serie, sacrificând viteza, dar economisind porturi prețioase pentru microcontroler.

Interfață serială asincronă

În timpul existenței tehnologiei digitale, au fost create zeci de protocoale seriale. USB (Universal Serial Bus) și Ethernet sunt două dintre cele mai populare protocoale seriale în prezent. Alte interfețe seriale foarte populare sunt SPI, I2C și interfața serială, care vor fi discutate în acest articol. Fiecare dintre aceste interfețe poate fi atribuită unuia dintre cele două subgrupuri - asincron și sincron.

Protocolul sincron include întotdeauna o linie de ceas. Acest lucru asigură un transfer de date mai ușor (și adesea mai rapid), dar necesită cel puțin un fir suplimentar. Un exemplu de interfețe sincrone este SPI și I2C.

O interfață asincronă înseamnă că datele sunt transferate fără suportul unui semnal extern de ceas.Această metodă de transfer este ideală pentru a minimiza numărul de fire, dar înseamnă că este necesar un efort suplimentar pentru a transmite și a primi datele în mod fiabil. Interfața serială, despre care vom discuta în acest articol, este cel mai comun și mai vechi protocol asincron. Se întâmplă adesea ca atunci când o persoană spune „serial”, el să spună exact acest protocol.

Interfață serială asincronă, despre care aici în cauză, este utilizat pe scară largă în sistemele încorporate. Dacă doriți să adăugați un modul GPS, Bluetooth, XBee, LCD-uri seriale sau multe alte dispozitive externe la proiectul dvs., probabil că va trebui să vă ocupați de una dintre interfețele seriale.

Regulile interfeței seriale.
Protocolul serial asincron are o serie de reguli încorporate, mecanisme care ajută la asigurarea că datele sunt transmise în mod fiabil și fără erori. Acestea sunt mecanismele care vă permit să transferați date fără a utiliza un semnal extern de ceas:

Biți de date
- Biți de sincronizare
- Biți de paritate
- Viteza de transmisie

Datorită combinației acestor reguli - parametri, protocolul este foarte flexibil. Pentru o comunicare de succes, trebuie să vă asigurați că ambele dispozitive de pe magistrală sunt configurate să utilizeze aceleași reguli.

Viteza de transmisie

Acest parametru determină viteza de transmisie a liniei seriale. Aceasta este de obicei exprimată în unități de biți pe secundă (bps sau baud). Dacă inversați acest parametru baud, obțineți timpul necesar pentru a transmite un bit. Această valoare determină cât timp transmițătorul menține linia serială înaltă/scăzută sau cât timp dispozitivul receptor preia linia sa.

Viteza de transfer poate fi aproape orice în rațiune. Singura cerință este ca ambele dispozitive să funcționeze la aceeași viteză. Una dintre cele mai comune rate de biți, în special pentru aplicațiile simple în care viteza nu este critică, este 9600 bps. Alte viteze „standard” sunt 1200, 2400, 4800, 19200, 38400, 57600 și 115200.

Cu cât viteza de transmisie este mai mare, cu atât datele sunt transmise și recepționate mai rapid. Dar există limite fizice pentru viteza maximă. De obicei, în practică, nu veți vedea viteze care depășesc 115200. Pentru majoritatea microcontrolerelor, aceasta viteza maxima. Dacă selectați o viteză prea mare, erorile vor apărea inevitabil pe
partea care primește.

cadre de date

Fiecare bloc de date (de obicei un octet) este de fapt trimis într-un pachet sau cadru de biți. Cadrele sunt create prin adăugarea unui bit de sincronizare și a unui bit de paritate la biții de date.

Să ne uităm la fiecare parte a cadrului mai detaliat.

Bucățiune de date

Cea mai importantă parte a fiecărui pachet este blocul de date, deoarece acest bloc este cel care transportă Informatii utile. Ne referim în mod deliberat la acest bloc ca o „bucătură”, deoarece dimensiunea sa nu este specificată în mod specific. Cantitatea de date din fiecare pachet poate fi setată la orice - de la 5 la 9 biți. Desigur, dimensiunea standard a datelor este octetul nostru principal de 8 biți, dar sunt utilizate și alte dimensiuni. Un bloc de date pe 7 biți poate fi mai eficient decât unul pe 8 biți, mai ales dacă doar împachetați caractere ASCII pe 7 biți (text).

După ce au convenit asupra lungimii caracterelor, ambele dispozitive de pe magistrala serială trebuie să fie de acord și asupra validității datelor lor. Este bitul cel mai semnificativ de date (msb) cel mai mic bit sau invers? Dacă nu este menționat altfel, de obicei presupunem că bitul cel mai puțin semnificativ (lsb) este transmis primul.

Biți de sincronizare

Biții de sincronizare sunt doi sau trei biți speciali transmiși cu fiecare parte de date. Aceștia sunt biții de pornire și oprire. Acești biți marchează începutul și sfârșitul unui pachet. Există întotdeauna un singur bit de pornire, dar numărul de biți de oprire este configurabil. Pot exista unul sau doi biți de oprire (unul este cel mai frecvent utilizat).

Bitul de pornire este întotdeauna determinat de linia de date de pe marginea sa descendentă (tranziția de la 1 la 0), în timp ce biții de oprire sunt determinați de linia ascendentă, adică de la tranziția de la 0 la 1.

Biți de paritate

Paritatea este o formă de verificare a erorilor foarte simplă, la nivel scăzut. Pot exista două opțiuni pentru o astfel de verificare: par sau impar. Pentru a crea un bit de paritate, toți cei 5-9 biți ai blocului de date sunt adăugați împreună, iar paritatea sumei determină dacă bitul de paritate este setat sau nu. De exemplu, să ne imaginăm că avem verificarea setată la modul paritate. Octetul de date în reprezentare binară este 01011101. Vedem că octetul are un număr impar de unități (cinci unități). În acest caz, bitul de paritate va fi setat la 1. Dacă setăm modul de paritate la impar, atunci bitul de paritate va fi setat la 0 în mod corespunzător.

Exemplu de setare a protocolului: 9600 8N1

9600 8N1 - 9600 baud, 8 biți de date, fără paritate și 1 bit de oprire este una dintre setările protocolului serial cel mai frecvent utilizate. Deci, cum arată un pachet sau două de date 9600 8N1? Iată un exemplu:


De fapt, sunt trimiși 10 biți pentru fiecare octet de date transmise: un bit de pornire, 8 biți de date și un bit de oprire. Deci, la 9600 bps, trimitem de fapt 9600 bps sau 960 (9600/10) octeți pe secundă.

Acum că știți cum să creați pachete seriale, putem trece la secțiunea hardware.
Vom vedea cum vor fi implementate toate acestea la nivel de semnal.

Autobuzul serial este format din doar două fire: unul pentru trimiterea datelor și celălalt pentru recepție. Deci, dispozitivele seriale trebuie să aibă doi pini seriali: receptor, ( RX) și transmițător ( TX).

Este important să înțelegeți că denumirile RX și TX se referă la dispozitivul în sine. De aceea RX un dispozitiv trebuie să se conecteze TX celălalt, și invers. Acest lucru poate părea ciudat dacă sunteți obișnuit să conectați VCC la VCC, GND la GND, MOSI la MOSI etc. Dar totuși are sens, deoarece transmițătorul ( TX) trebuie să vorbească cu receptorul ( Rx), nu cu un alt emitator.

Este apelată o interfață serială în care ambele dispozitive pot trimite și primi date duplex sau semi-duplex . Duplex înseamnă că ambele dispozitive pot trimite și primi în același timp. semi-duplex comunicare înseamnă că dispozitivele seriale trebuie să trimită și să primească date pe rând.

Unele magistrale seriale pot fi operate cu un singur fir între dispozitivul de expediere și de primire. De exemplu, LCD-urile conectate în lanț nu trimit de fapt nicio dată înapoi la dispozitivul de control. Se numeste simplex comunicare în serie. Tot ce ai nevoie este un fir TX maestru de contactat RX gestionate.

Implementare in hardware

Deci, am luat în considerare protocolul serial asincron din partea conceptuală. Știm de ce fire avem nevoie. Dar cum funcționează comunicația serială la nivel de semnal? De fapt, este diferit. Există tot felul de standarde. Să ne uităm la câteva dintre cele mai populare implementări hardware ale interfeței seriale: nivelul logic (TTL) și RS-232.

Când microcontrolerele și alte circuite integrate de nivel scăzut comunică între ele printr-un protocol serial, de obicei o fac la nivel TTL (logica tranzistorului-tranzistor). Semnalele seriale TTL trăiesc între intervalul de tensiune de alimentare al microcontrolerului - de obicei de la 0 la 3,3 V sau 5 V. Un semnal la nivel VCC (3,3 V, 5 V etc.) indică fie inactiv, fie este bit 1 de date sau bit de oprire. Un semnal de 0 V (GND) este fie un bit de pornire, fie un bit de date cu valoarea 0.

Interfața găsită pe unele computere și periferice mai vechi este similară cu seria TTL obișnuită. Au doar niveluri diferite de tensiune. De obicei, semnalele RS-232 variază de la -13V la +13V, deși specificația permite orice în intervalul +/- 3V până la +/- 25V. Tensiunea joasă (-5V, -13V, etc.) indică fie un inactiv, un bit de oprire sau un bit de date cu valoarea 1. Un semnal RS-232 ridicat indică fie un bit de pornire, fie un bit de date 0. Polaritatea semnalelor este exact opusul TTL serial.

În circuitele încorporate (în cadrul unui singur dispozitiv), este mult mai ușor să utilizați semnalele seriale TTL. Dar în cazul liniilor lungi de date niveluri scăzute TTL este mult mai susceptibil la pierderi și interferențe. RS-232 sau standardele mai sofisticate, cum ar fi RS-485, sunt mai potrivite pentru transmisiile seriale pe distanțe lungi.

Când conectați două dispozitive seriale împreună, este important să vă asigurați că tensiunile semnalului acestora se potrivesc. Nu puteți conecta direct un dispozitiv serial TTL la magistrala RS-232. Va trebui să le convertiți nivelurile pentru interoperabilitate.

UART

Receptorul/Transmițătorul asincron universal (UART) este blocul de circuit responsabil pentru implementarea comunicației seriale. În esență, UART acționează ca un intermediar între interfețele paralele și seriale. Un capăt al UART are o magistrală de opt (sau cam asa ceva) linii de date (plus câțiva pini de control), celălalt capăt are două fire seriale - RX și TX.

Interfețele UART există ca cipuri separate, dar cel mai adesea sunt încorporate în microcontrolere. Pentru a afla dacă MK-ul dvs. are un protocol UART, va trebui să citiți fișa de date pentru acest controler. Unii nu au unul, alții au, alții au mai mult de unul. De exemplu, Arduino Uno, bazat pe vechiul ATmega328, are un singur UART, în timp ce Arduino Mega - construit pe ATmega2560 - are până la patru UART-uri.

R și T în terminologia UART sunt responsabile pentru trimiterea și primirea datelor seriale. Pe partea de transmisie, UART trebuie să creeze un pachet de date - adăugând biți de sincronizare și paritate - și să trimită acel pachet prin linia TX în funcție de rata de transmisie setată. Pe partea de recepție, UART trebuie să verifice linia RX la o viteză corespunzătoare ratei de transmisie așteptată, să selecteze biții de ceas și să extragă datele.

Există un microcircuit minunat - FT2232D. Acesta este un convertor USB la UARTx2. Este convenabil atunci când trebuie să obțineți două cozi UART de la un fir USB. Dar acestea sunt semințe în comparație cu faptul că FTDI a introdus suport hardware puternic pentru MPSSE (Multi-Protocol Synchronous Serial Engine) în acest mikruha, care vă permite să implementați o grămadă de interfețe diferite precum SPI sau JTAG numai pe acest mikruha.
Ceea ce oferă cel mai mare domeniu de aplicare pentru construirea de programatori de dimensiuni diferite pentru orice. Pe acest moment Am văzut scheme pentru firmware AVR, ARM, Altera și Dumnezeu știe ce altceva.

Teoretic, cu ajutorul lui poți să flashi orice, ar exista suport software și un protocol deschis și documentat.

Prin urmare, sub o asemenea drăgălășenie, nu m-am rupt și am făcut o eșarfă universală, care mai târziu, prin agățarea unei eșarfe de mezanin, se va transforma în diferite fulgerări și depanatoare.

Programul terminat trebuie să fie împins cumva în controler. Există multe moduri de a face acest lucru.

Adaptor JTAG/SWD
Deoarece JTAG este adesea folosit pentru depanare sub ARM, această metodă este probabil cea mai populară. În acest scop este folosit un adaptor. De exemplu, folosesc așa că voi arăta exemplul lui. Totul este simplu acolo - conectați adaptorul la controler cu un cablu standard SWD sau JTAG. Prin linii NRST/TDI/TDO/TCK/TMS pentru JTAG sau prin SWO/SWOCLK/SWDIO/NRST pentru modul SWD. Pe adaptorul versiunii mele de CoLinkEX, ambii acești conectori sunt aduși în același bloc, așa că se dovedește, parcă, atât o conexiune JTAG, cât și o conexiune SWD. Și acolo ce este necesar așa și tu alegi. Nu există nicio diferență specială în depanare / firmware între ele.

Sau folosind utilitarul CoFlash de la CooCox.com

Unul dintre avantajele majore ale controlerelor AVR este numărul sălbatic de întreruperi. De fapt, fiecare dispozitiv periferic are un vector sau chiar mai mult de unul. Deci, puteți declanșa o grămadă de procese paralele pe întreruperi. Rularea pe întreruperi este o modalitate de a crea un mediu pseudo multitasking.

Ideal pentru transmiterea datelor și procesarea proceselor lungi.

De exemplu, voi afișa datele de ieșire în buffer prin USART la întreruperi.

În exemplele anterioare, a existat acest cod:

// Trimiterea unui șir void SendStr(char *string) ( while (*string!="\0") ( SendByte(*string); șir++; ) ) // Trimiterea unui singur caracter void SendByte(char byte) ( while( !( UCSRA&(1<

Această metodă este evident complet ineficientă. Faptul este că avem aici cea mai stupidă așteptare de la un eveniment - ridicarea steagului de pregătire USART. Și depinde, în primul rând, de viteza de transfer a datelor. De exemplu, la o viteză de 600 baud, transferul a aproximativ 600 de caractere va dura 9 secunde, blocând funcționarea întregului program, care nu urcă în nicio poartă.

Odată am avut nevoie de un dispozitiv care să se conecteze la un server la distanță și să trimită octeți. Desigur, un computer poate fi folosit în aceste scopuri, dar este greoi și incomod, iar fiabilitatea unui astfel de sistem lasă de dorit - dispozitivul este prea complicat. Un alt lucru este un microcontroler, cum ar fi Microchip PIC, MSC-51 sau Atmel AVR - simplu, fiabil, consumă un minim de energie și este capabil să efectueze în mod fiabil o gamă restrânsă de sarcini. De exemplu, monitorizarea alarmei prin Internet sau rețeaua Ethernet. Totul ar fi bine, dar aici apare o altă problemă - protocolul TCP/IP. Implementarea unei stive de protocol TCP/IP pe un AVR sau PIC este o sarcină fezabilă, dar este nevoie de timp, iar timpul, după cum știți, înseamnă bani. Era necesar urgent și cu hemoroizi minime. Și aici mi-a venit în ajutor modulul de interfață Ethernet - RS232. Sarcina este standard, așa că există o mulțime de oferte pe piață pentru module gata făcute, dar nu trebuie să vă grăbiți. Există o serie de subtilități asociate cu caracteristicile funcționării acestor dispozitive. De exemplu, marea majoritate a modulelor pot funcționa exclusiv ca un server care necesită o adresă IP dedicată. Dispozitivul client funcționează numai cu software specializat, de obicei sub Windows, și deschide un port COM virtual care se conectează la un sistem la distanță (UART - modul Ethernet) și oferă schimb de date. Nu este cea mai convenabilă opțiune. Pentru sarcina mea, acest design a fost complet nepotrivit. Prin urmare, am început să caut mai departe, în curând a fost descoperit un modul minunat EG-SR-7100, iar apoi modificarea sa mai nouă WIZ100SR. Am citit caracteristicile - este! Totul pentru a-mi rezolva problema!

Mi-am cumpărat câteva module HM-TR433. Da, chin. O astfel de bucurie costă în prezent aproximativ 800 de ruble. Acesta este un transceiver, adică poate primi și transmite. Mai mult, aici există un controler de control, care codifică informația în sine, o conduce în canalul radio și decodifică cele prinse. Adică, de fapt, primim un cablu de prelungire UART și tot felul de probleme, cum ar fi zgomotul după o defecțiune a purtătorului, care erau în pachet HM-T433/HM-R433 nu ne mai pasa. Un minus - canalul este semi-duplex, adică recepția și transmisia sincronă sunt imposibile, doar la rândul lor. Dar aceasta nu este o problemă mare - adesea semi-duplex este suficient pentru ochi.


Există două versiuni ale acestui modul. Unul are un final TTL, celălalt este RS232. Singura diferență este în niveluri și în faptul că la început chinezii au uitat să lipize MAX232 și conductele condensatoarelor, dar au pus jumperi. Deci, cu mâinile drepte și instrumentul potrivit, puteți face RS232 din TTL și invers. Cu toate acestea, pentru prețul ei merg penny la penny.

Tax, în ordinea lucrului la un proiect comercial (și nu mă întrebați despre asta - nu vă spun), care mi-a înghițit tot timpul liber cu o lingură uriașă zimțată, a luminat modulele radio până la capăt. cenusa HopeRF HM-R433/HM-T433. Astăzi am asamblat un circuit semi-duplex pe patru module și am condus o sesiune de transceiver cu rază lungă.

Deci, cum a fost configurația?

Blocul A:

  • Transmiţător: HM-T433
  • Receptor: HM-R433
  • Locație bloc: etajul 5, pe masă. La peretele de nord.
  • Alimentare: 5 volți.
  • Rata de transfer: 4800 baud.
  • Lungimea pachetului de date: 10 octeți.

Blocul B:

  • Transmiţător: HM-T433
  • Receptor: HM-R433
  • Antena emițătorului: O bucată de fir MGTF de 17 cm lungime (1/4 din lungimea de undă a semnalului 433 MHz) oricum îndoită.
  • Antena receptor: același gunoi.
  • Amplasarea modulelor: paralele între ele, la o distanță de 2 cm, antenele antenelor sunt împrăștiate în direcții diferite, în felul unui gândac.
  • Locația blocului: În mâinile mele, pe pământ. Pe partea de sud a casei (vezi diagrama)
  • Alimentare: 5 volți.
  • Rata de transfer: 4800 baud.
  • Lungimea pachetului de date: 10 octeți.

Stare de transfer:
Blocul B dă un pachet de zece octeți blocului A, care, după ce s-a asigurat că pachetul a fost primit fără distorsiuni, trimite o confirmare înapoi blocului B, aceiași zece octeți. Blocul B, după ce a primit confirmarea, aprinde dioda verde. Transmisia merge cu o pauză în purtător. Acestea. după trimiterea pachetului, emițătorul este tăiat complet.


În timpul testelor inițiale, această bucată de fier și-a arătat cea mai bună parte, dar, în practică, nu au ieșit doar gândaci, ci și gândaci ucigași ucigași. S-ar părea, de ce să nu lucrezi acolo? Și, după cum sa dovedit, există ceva. Mai precis, acestea nu sunt bug-uri, ci caracteristici despre care producătorul a tăcut cel mai josnic în fișele de date. Dacă aș ști despre ele, m-aș gândi în continuare dacă merită să le cumpăr. Asa de:

Purtător
Receptorul prinde schimbarea purtătorului pe care o generează emițătorul. Și dacă nu există emițător, ce va prinde receptorul? În teorie, nu ar trebui să prindă nimic, dar în practică? Dar, în practică, un srach sălbatic !!! Zgomot alb în mod natural pe întreaga gamă de la 0 la 255. La naiba, nu? Dar bine, la naiba cu acest zgomot alb, la urma urmei, îl puteți filtra, puteți urmări prezența a ceva rezonabil în el și abia apoi începeți să primiți.

Modul de așteptare
Emițătorul, spre surprinderea mea, precum și un număr de cititori atenți, nu are intrare permite. Receptorul are. Rare prostii, mai ales având în vedere faptul că după 70mS inactiv pe linia de DATE, emițătorul intră în hibernareși ... așa este, oprește purtătorul - la ieșirea receptorului, începe un srach groaznic în acest moment. Deci, fie datele au venit într-un flux continuu, fie a existat un pachet de identificare înainte de fiecare trimitere. Și fără a uita să avertizam receptorul că transmisia s-a încheiat și nu mai este nimic de prins.

Colaborare
Totul este simplu aici, două transmițătoare nu pot funcționa simultan. De la cuvânt la toate. Fie individual, fie deloc. Acest lucru era de așteptat și trebuia luat în considerare.

Transfer bug-uri
Dar ceea ce m-a atras cel mai mult au fost bug-urile. Dacă primele trei puncte pot fi luate în considerare și procesate programatic fără probleme inutile, atunci cu ultimul totul este deja mult mai distractiv.

Printre alte bunătăți, pe lângă telemetrul cu ultrasunete, mi-au venit și module radio într-un pachet de la Terra. Sper HM-T433Și Sper HM-R433 Pentru transmisie și, respectiv, recepție. Modulul în sine este o eșarfă mică 15x25 mm cu un conector care iese din acesta. Transmițătorul are un conector cu trei pini - GND, DATA și Vcc receptorul are o altă intrare PERMITE atunci când aplică la care un nivel înalt este permis să primească.

Am avut nevoie să-mi iau un dispozitiv, astfel încât să-l pot folosi pentru a distribui octeți eu 2 cȘi UART, precum și primiți octeți folosind aceleași protocoale și afișați-i pe ecran. Atât unul câte unul și în loturi. Un astfel de depanator.

Ei bine, a spus gata. blocat ATMega8535- primul care s-a întors sub brațul celor cu multe picioare. A scos tot ce era posibil afară, a adăugat un mic Matrice de tastatură 4x4 și ecran LCD. ecran mic WH0802A Caractere 8x2, dar ce era. Nu am văzut altele la reducere, dar îmi este prea lene să comand. Da, și cred că nu este nevoie de mai mult.

Și din moment ce o astfel de băutură a dispărut, am scos la iveală câteva canale PWM, da, câteva intrări ADC. Bine SPIîn același timp – a merge așa că a merge. Acolo poti si tu Dallas 1 fir Organizați un protocol, atașați un contor de frecvență, un indicator de semnal, un voltmetru și, în general, puteți face o mulțime de lucruri, dacă doriți. Din nou, există o mulțime de linii de intrare/ieșire, așa că puteți face o unitate principală a unei case inteligente sau un controler pentru ceva din ea.

Corpul a primit un freebie, PAC-TEC‘ovsky care namutili acum vreo doi ani. Deci cutia va veni la îndemână :) Trebuie să spun PAC-TEC face cutii uimitoare. Nu ca rahatul care se vinde în magazinele noastre de radio. Nu scârțâie, nu se joacă, sunt ferm construite, bine tăiate și arată cool. Unde altundeva ar fi vândute.

Până acum, doar consiliul de conducere a divorțat, mai lipsesc câteva detalii. Într-una din aceste zile voi grava placa, o voi asambla și o voi programa. Apoi veți avea exemple de cod live și o descriere detaliată SPI, i2c, UART, tastatura si LCD. Apropo, acordați atenție cât de ușor este să combinați butoanele de tact obișnuite. Și totul datorită faptului că au patru ieșiri conectate în perechi.

Între timp, din moment ce este încă sub formă de desen, aruncă în comentarii ideile tale despre caracteristicile viitorului dispozitiv.

În timp ce scria un articol despre UART, mi-a venit în minte o idee pervertită - pe baza UART, puteți organiza cel mai natural PWM low-discret!

Este suficient doar să facem o variabilă undeva în memorie, unde vom lipi un număr cu un ciclu de lucru dat de zerouri și unu, iar când golirea tamponului este întreruptă, acest număr va fi împins din nou în registrul UDRE. Astfel, generația PWM va fi spontană, fără gesturi inutile. Adevărat, puteți obține doar 10 valori PWM diferite, dar gratuit !!!

Pentru cei care nu înțeleg cum, voi da numerele care vor trebui trimise continuu prin UART:
vom obține două valori suplimentare datorită biților de pornire și oprire.

00000000 — 1/10
00000001 — 2/10
00000011 — 3/10
00000111 — 4/10
00001111 — 5/10
00011111 — 6/10
00111111 — 7/10
01111111 — 8/10
11111111 — 9/10

Da, iar frecvențele de acolo pot fi obținute nefigovye!
Frumusețe! =))))

Aproape fiecare microcontroler are o interfață serială universală la bord - UART. AVR aceasta nu face excepție și acceptă acest protocol în volum complet complet în hardware. Din punct de vedere structural, acesta este un lucru comun asincron protocol serial, adică partea de transmisie iese pe rând 0 și 1 în linie, iar partea de recepție le urmărește și le amintește. Sincronizarea este în timp - receptorul și emițătorul convin în prealabil asupra frecvenței care va avea loc schimbul. Acesta este un punct foarte important! Dacă viteza emițătorului și a receptorului nu se potrivesc, atunci este posibil să nu existe deloc o transmisie sau se vor citi date greșite.

Protocol
În primul rând, emițătorul aruncă linia jos - asta este start bit. Simțind că linia a scăzut, receptorul așteaptă intervalul T1 și citește primul bit, apoi biții rămași sunt selectați la intervale T2. Ultimul bit este oprește puțin. Indică faptul că transferul acestui octet este complet. Acesta este în cel mai simplu caz.

La sfârșitul octetului, înainte de bitul de oprire, poate exista un bit de paritate. Care se obține dacă toți biții sunt încrucișați între ei, pentru a controla calitatea transmisiei. Pot exista și două opriri, din nou pentru fiabilitate. Biții nu pot fi 8, ci 9. Toți acești parametri sunt conveniți pe mal, înainte de începerea transmisiei. Cel mai popular este 8 biți, o pornire cu o oprire, fără paritate.

Mai mult, nu trebuie să vă deranjați cu protocolul în sine - totul este implementat în hardware. Dacă nu doriți să porniți un al doilea UART, atunci trebuie să o faceți programatic.

Portul COM al computerului funcționează după același protocol, diferența este doar în diferența de tensiune, așa că voi folosi acest protocol pentru a conecta microcontrolerul la computer. Un convertor RS232-TTL poate fi folosit pentru a converti tensiunile. Port COM. Dar există o problemă aici - adevărul este că computerul RS232 el ia pentru niveluri logice +/- 12 volt, a UART funcționează la niveluri de cinci volți. Cum să le combini? Pentru aceasta, există mai multe opțiuni pentru circuitele convertoare de nivel, dar cea mai populară este încă pe un convertor special. RS232-TTL. Acesta este un microcip MAX232și analogii săi.
Aproape fiecare companie își face propriul convertor, așa că se va potrivi aici ST232, Și ADM232, Și HIN232. Circuitul este la fel de simplu ca trei bănuți - intrare, ieșire, putere și conducte de cinci condensatoare. Condensatorii sunt de obicei plasați 1uF electroliți, dar în unele modificări 0,1 uF ceramică. Am lipit peste tot 0,1 uF ceramica si de obicei asta era de ajuns. :) Funcționează ca un ceas. Dacă la viteze mari va eșua, atunci va fi necesară creșterea capacității.


Apropo, există și MAX3232 asta este la fel, dar la iesire nu are 5 volti TTL, ci 3,3 volti TTL. Este folosit pentru controlere de joasă tensiune.

Mi-am făcut un astfel de cablu universal, astfel încât să fie convenabil să mă agăți de controlere UART. Pentru compactitatea generală, am băgat întregul circuit direct în conector, de când am avut ST232 in caz soic. Rezultatul a fost o batistă nu mai mult de o monedă de rublă. Deoarece nu erau condensatoare SMD mici la îndemână, a trebuit să lipim conderele de sus, oricine era în ce mult. Principalul lucru funcționează, deși nu a ieșit foarte frumos.


Dacă te îndoiești că vei reuși o instalare atât de mică, atunci am împărțit placa pentru tine într-o carcasă PDIP standard. Va avea dimensiunea unei cutii de chibrituri, dar nu trebuie să măcinați.


După asamblare, se verifică pur și simplu:
Se conectează la priză COM port. Aplicați 5 volți de alimentare la circuit și apoi închideți Rx pe Tx(Am fire verzi și galbene).

Apoi deschideți orice terminal, cel puțin HyperTerminal, se agață de port și începe să trimită octeți, ar trebui să revină imediat. Dacă acest lucru nu se întâmplă, verificați circuitul, undeva există un jamb.

Dacă funcționează, atunci totul este simplu. Firul care vine de la pinul 9 al cipului MAX232 acest ieșire de transmisie, pune-l pe picior RxD controlor. Și cel de la picior 10 - primind, nu ezitați să-l puneți pe concluzie TxD controlor.


Placa a fost realizata folosind metoda LUT, intr-un singur loc, din cauza nerespectarii mele, grosimea golului s-a dovedit a fi de 0,05 mm, a fost gravata, dar cu varfuri, a trebuit sa o zgarieam. Dar, în general, prima dată și fără probleme. Mi-am dorit imediat să fac ceva mic, mic, umplut :)

Receptor-Transmițător asincron universal, UART - un nod de dispozitive de calcul concepute pentru a organiza comunicarea cu alte dispozitive digitale. Convertește datele transmise într-o formă serială, astfel încât să fie posibil să le transfere pe o linie digitală către un alt dispozitiv similar. Metoda de conversie este bine standardizată și utilizată pe scară largă în tehnologia computerelor.

Este un circuit logic, pe de o parte conectat la magistrala unui dispozitiv de calcul, iar pe de altă parte, având doi sau mai mulți pini pentru conexiune externă.

Un UART poate fi un cip separat sau poate face parte dintr-un circuit integrat mare (cum ar fi un microcontroler). Folosit pentru a transfera date prin portul serial al computerului, adesea încorporat în microcontrolere.

Port serial

port serial, Port COM, portul de comunicații) - denumirea din argou pentru interfața standard RS-232, care a fost echipată masiv cu computere personale. Portul se numește „serial” deoarece informațiile sunt transmise prin el, câte un bit, serial bit cu bit (spre deosebire de un port paralel). În ciuda faptului că unele interfețe de computer (de exemplu, Ethernet, FireWire și USB) folosesc și o modalitate serială de schimb de informații, numele „port serial” a fost atribuit portului standardului RS-232.

În prezent, computerele IBM compatibile cu PC-urile au fost practic înlocuite de interfața USB.

Există standarde pentru emularea portului serial prin USB și prin Bluetooth (această tehnologie a fost concepută în mare parte ca „port serial fără fir”).

Metoda de transmisie și recepție

Transferul de date către UART se efectuează pe un bit la intervale regulate. Acest interval de timp este determinat de data Viteza UART iar pentru o anumită conexiune este indicat în baud (care în acest caz corespunde biților pe secundă).

Există o gamă general acceptată de viteze standard: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 baud.

Viteza (, baud) și durata biților (, secunde) sunt legate de

Rata baud este uneori numităargou cuvânt rata de biți.

În plus față de fluxul de informații real, UART inseră automat mărci de sincronizare în flux, așa-numitele biți de pornire și oprire. La recepție, acești biți suplimentari sunt eliminați din flux. De obicei, biții de pornire și oprire încadrează un octet de informații (8 biți), cu toate acestea, există implementări UART care vă permit să transferați 5, 6, 7, 8 sau 9 biți.

Biții de pornire și oprire încadrați sunt premisa minimă. Unele implementări UART permit inserarea a doi biți de oprire în timpul transmisiei pentru a reduce șansa de desincronizare a receptorului și emițătorului în timpul traficului intens. Receptorul ignoră al doilea bit de oprire, tratându-l ca pe o scurtă pauză pe linie.

Este de acord că starea pasivă (în absența fluxului de date) a intrării și ieșirii UART este logic 1.

Bitul de pornire este întotdeauna 0 logic, prin urmare, receptorul UART așteaptă o tranziție de la 1 la 0 și numără de la acesta un interval de timp de jumătate din durata bitului (mijlocul transmisiei bitului de pornire). Dacă în acest moment intrarea este încă 0, atunci se începe procesul de primire a mesajului minim. Pentru a face acest lucru, receptorul numără duratele de 9 biți la rând (pentru date pe 8 biți) și surprinde starea intrării în fiecare moment. Primele 8 valori sunt date primite, ultima valoare este o valoare de test (bit de oprire).

Valoarea bitului de oprire este întotdeauna 1, dacă valoarea reală primită este diferită, UART remediază o eroare.

Pentru a forma intervale de timp, UART-urile de transmisie și de recepție au sursa timpului(pontaj). Precizia acestei surse trebuie să fie astfel încât suma erorilor (ale receptorului și emițătorului) în setarea intervalului de timp de la începutul impulsului de pornire până la mijlocul impulsului de oprire să nu depășească jumătate (sau mai bine, cel puțin un sfert) din intervalul de biți. Pentru un mesaj pe 8 biți, 0,5 / 9,5 = 5% (în realitate, nu mai mult de 3%). Deoarece aceasta este suma erorilor receptorului și emițătorului plus posibila distorsiune a semnalului în linie, toleranța recomandată pentru precizia tacării UART nu este mai mare de 1,5%.

Deoarece biții de sincronizare ocupă o parte a fluxului de biți, rezultatul debitului UART nu este egal cu viteza conexiunii. De exemplu, pentru pachetele în format 8-N-1 pe 8 biți, biții de sincronizare ocupă 20% din flux, ceea ce pentru o rată fizică de 115.200 baud oferă o rată de biți de date de 92.160 bps sau 11.520 octeți/s.

Verificarea parității

Articolul principal:Bit de paritate

Multe implementări UART au capacitatea de a verifica automat integritatea datelor folosind paritatea de biți. Când această caracteristică este activată, ultimul bit de date din cadrul minim ("bit de paritate") este monitorizat de logica UART și conține informații de paritate despre numărul de 1 biți din acest cadru minim. Distinge între verificarea parității Chiar și paritate), când suma numărului de 1 biți din mesaj este un număr par și paritate impară (ing. paritate impară) când această sumă este impară. La primirea unui astfel de pachet, UART poate verifica automat bitul de paritate și poate seta semnele adecvate de recepție corectă sau eronată.

Scurtarea parametrilor

A fost dezvoltată și adoptată o modalitate scurtă de a scrie parametrii UART, cum ar fi

numărul de biți de date - prezența și tipul de bit de paritate - numărul de biți de oprire.

Pare un record număr-litera-număr, Unde:

  • Primul numărul indică numărul de biți de date, de exemplu 8.
  • Litera indică prezența și tipul bitului de paritate.

N(Fără paritate) - fără bit de paritate;

E(Even parity) - cu un bit de paritate uniformă,

O(Odd parity) - cu un bit de paritate impar;

  • Ultimul numărul indică lungimea bitului de oprire.

Există valori de 1, 1,5 și 2 pentru lungimi de bit de oprire de intervale de 1, 1,5 și, respectiv, 2 biți.

De exemplu, intrarea 8-N-1 înseamnă că UART este setat la 8 biți de date, fără paritate și un bit de oprire. Pentru caracterul complet al parametrilor, această intrare este prevăzută cu o indicație.

Pauză

Pachet special - este format din

o stare zero continuă a liniei cu o durată evident mai mare decât mesajul minim, de obicei 1,5 mesaje minime (pentru 8N1 este vorba de intervale de 15 biți). Unele protocoale de comunicare folosesc această proprietate, de exemplu, protocolul LIN utilizează Break pentru a indica un nou cadru.

Controlul debitului

Dispozitivele UART timpurii ar putea fi atât de lente încât să nu poată ține pasul cu fluxul de date primite.

Pentru a rezolva această problemă, modulele UART erau uneori prevăzute cu ieșiri separate și intrări de control al fluxului. Când tamponul de intrare era plin, logica UART-ului de recepție ar seta ieșirea corespunzătoare să dezactiveze, iar UART-ul de transmitere ar suspenda transmisia.

Ulterior, controlul fluxului a fost atribuit protocoalelor de comunicare (de exemplu, metoda XOn / XOff), iar nevoia de linii separate de control al fluxului a dispărut treptat.

Strat fizic

Circuitul logic UART are intrări/ieșiri cu niveluri logice corespunzătoare tehnologiei semiconductoare a circuitului: CMOS, TTL, etc. Acest nivel fizic poate fi utilizat într-un singur dispozitiv, dar nu este potrivit pentru conexiuni lungi comutate din cauza protecției scăzute împotriva electricității. distrugere și imunitate la zgomot .

UART de microcontrolere AVR.

Unul dintre cele mai comune protocoale pentru interacțiunea microcontrolerului cu dispozitivele externe este UART (Universal Asynchronous Receiver-Transmitter) - Transceiver asincron universal. Acest protocol este implementat în hardware în majoritatea microcontrolerelor AVR, ceea ce permite dezvoltatorului să nu intre în detaliile implementării acestei interfețe. Pentru a-l folosi, trebuie doar să configurați câteva registre!

Să luăm în considerare pe scurt principiul de funcționare al UART.

Acest protocol este secvenţial, adică datele merg strict una după alta, ceea ce limitează într-o oarecare măsură viteza de lucru. Deoarece protocolul este asincron, receptorul și emițătorul trebuie să funcționeze strict pe aceeași frecvență, care trebuie configurată înainte de a începe lucrul.

Când transmite un octet, transmițătorul setează inițial un 0 logic pe pinul TX (Transmitter). Acesta este așa-numitul bit de pornire, ceea ce înseamnă începutul transmisiei. După aceea, emițătorul expune biții octetului transmis la anumite intervale specificate de frecvență. În continuare, poate fi transmis un bit de paritate, care servește la verificarea calității transmisiei. Când toți biții au fost transmisi, este setat un bit de oprire, adică un 1 logic pe linia de transmisie. Numărul de biți de oprire poate fi diferit: 1 ; 15; 2.

Un mare avantaj al acestei interfețe este capacitatea de a o utiliza pentru a seta comunicarea cu un PC. Pentru a face acest lucru, trebuie să faceți adaptoare UART-RS 232 sau UART-USB bazate pe cipuri MAX 232 și, respectiv, FT 232RL.

Citiți mai multe despre adaptoare aici.

Următoarele registre sunt responsabile pentru lucrul cu UART (de fapt USART, dar, pentru noi, acest lucru nu este important acum):

UDR - Registrul de dateUART. La transmitere, scrie datele care trebuie trimise, iar la citire, scrie datele primite. Totul este simplu.

UCSRA - Registrul de control și stareUART . Luați în considerare fragmentele acestui registru mai detaliat:

  • RXC (a primi complet ) - steag al sfârșitului recepției datelor. Setați la 1 când există date necitite și resetat la 0 când sunt primite date.
  • TXC (Transmite complet ) - steag al sfârșitului transferului de date. Resetați la 0 la sfârșitul transferului de date și setați la 1 dacă există date netransmise.
  • UDRE (Date Inregistreaza-te Gol ) - un steag care indică disponibilitatea registrului UDR de a primi date noi. Când UDRE este 1, registrul UDR este gol și gata să primească date noi.
  • FE (Eroare de cadru)- flag de eroare a cadrului.
  • DOR (Date Depășire ) - flag de depășire a registrului de date.
  • PE (Eroare de paritate)- flag de eroare de paritate
  • U 2 X- un pic care dubleaza viteza de transmisie. Scrierea unui 1 la acest bit reduce la jumătate prescalerul de ceas al UART, care dublează rata de date.
  • MPCM- modul de comunicare multiprocesor.

UCSRB - Registrul de control și stareUART .

  • RXCIE (RX complet Întrerupe permite ) - Un bit care activează sau dezactivează generarea unei întreruperi la sfârșitul recepției. Când scrieți 1 pe acest bit, întreruperea la sfârșitul recepției este activată, când scrieți 0, este dezactivată.
  • TXCIE (TX complet Întrerupe permite ) - La scrierea 1 pe acest bit, întreruperea la sfârșitul transferului de date este activată, la scrierea 0, este dezactivată.
  • UDRIE (Date Inregistreaza-te gol Întrerupe permite ) - Un bit care activează sau dezactivează apariția unei întreruperi pe pavilionul UDRE.
  • RXEN (Receptor permite ) - Scrierea 1 pe acest bit activează receptorul UART al modulului, scrierea 0 îl dezactivează.
  • TXEN (transmiţător permite ) - Scrierea 1 pe acest bit activează transmițătorul UART al modulului, scrierea 0 îl dezactivează.
  • UCSZ 2 (caracter mărimea ) - Împerecheată cu biții UCSZ 1 și UCSZ 0 setează numărul de biți transmiși, adică putem transmite nu numai octet cu octet, ci și 5,6,7,8,9 biți.
  • RXB 8 (a primi Date Pic 8) - 9 biți de date recepționate la transmiterea a 9 biți. Trebuie citit înainte de operațiunile pe registrul UDR.
  • TXB 8 (Transmite Date Pic 8) - 9 biți de date trimiși la transmiterea a 9 biți. Trebuie să fie scris înainte ca alți biți să fie scrieți în UDR.

UCSR DIN- Registrul de control și stareUART .


  • UCPOL - Acest bit vă permite să setați pe ce margine va avea loc schimbul de date în modul de transfer sincron. Când funcționează în modul de transfer asincron, acest bit trebuie setat la 0.

Registrele UBRRL și UBRRH sunt responsabile pentru setarea vitezei transceiver-ului. Rețineți că atunci când lucrați cu registrul UBRRH, bitul URSEL trebuie setat la 0.

Pentru a obține viteza necesară a UART, valoarea UBRR (Register Pairs UBRRH și UBRRL) se calculează folosind următoarea formulă:

UBRR = (F osc /(B*16))-1

Unde,

F osc - frecvența microcontrolerului (Hz).

B - viteza UART necesară (biți/sec).

De exemplu, trebuie să setați viteza de transmisie la 9600 bps când microcontrolerul rulează la 8 MHz (8000000 Hz).

UBRR = (8000000/(9600*16))-1 = 51,083333

Rotunjim la un număr întreg, adică până la 51. Și scriem acest număr în registrele UBRRL:UBRRH.

Lecția s-a dovedit a fi destul de voluminoasă, așa că vom lua în considerare implementarea practică a protocolului UART pe microcontrolere AVR în lecția următoare.

Orice copiere, reproducere, citare a materialului, sau părți ale acestuia, este permisă numai cu acordul scris al administrației MKPROG .RU. Copierea, citarea, reproducerea ilegală se pedepsește prin lege!