Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:avr:usart [2010/01/05 17:11] mikk.leiniet:avr:usart [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-===== USART =====+====== USART ======
  
-USART on universaalne sünkroonne jadaliides, UART aga selle lihtustatud variant - universaalne asünkroonne jadaliides. Vahe seisneb selles, et USART kasutab peale andmeliinide ka taktsignaali liini millega andmeid sünkroniseeritakse, UART mitte. AVR-i USART võimaldab täis-dupleks sidepidamist, 5 kuni 9 bitiseid andmesõnasid (8 biti puhul sõna = bait), 1 või 2 stopp-bitti, kolme paarsuse režiimi ja laia boodikiiruste valikut. AVR mikrokontrolleritel on üldiselt kuni 2 USART liidest, mõnel see ka puudub. Andmete edastamine toimub sõna kaupa, ehk AVR teeb riistavara tasandil kasutaja edastatud sõna bittideks ja edastab selle iseseisvalt ning vastupidi. Kasutaja juhib USART tööd seade-, oleku- ja andmeregistreid kirjutades ning lugedes.+USART on universaalne sünkroonne jadaliides, UART aga selle lihtsustatud variant - universaalne asünkroonne jadaliides. Vahe seisneb selles, et USART kasutab peale andmeliinide ka taktsignaali liinimillega andmeid sünkroniseeritakse, UART aga mitte. AVR-i USART võimaldab täisduplekssidet, 5kuni 9-bitiseid andmesõnu (8 biti puhul sõna = bait), 1 või 2 stoppbitti, kolme paarsuse režiimi ja laia boodikiiruste valikut. AVR mikrokontrolleritel on üldiselt kuni 2 USART liidest, kuid mõnel puudub USART üldse. Andmete edastamine toimub sõna kaupa, ehk AVR teeb riistvara tasandil kasutaja edastatud sõna bittideks ja edastab selle iseseisvalt ning vastupidi. Kasutaja juhib USART tööd seade-, oleku- ja andmeregistreid kirjutades ning lugedes.
  
-Kõikide seadistuste jaoks on olemas vastavad registrid mida on üsna lihtne andmelehe abil seadistada. Natuke keerulisem on boodikiiruse seadmine. Taktsignaal andmete edastamiseks genereeritakse töötaktist ja kasutaja saab valida teguri 1-st 4096-ni millega töötakt läbi jagatakse. Täiendavalt jagatakse saadud taktisignaali olenevalt režiimist veel 2, 8 või 16-ga. Probleem on selles, et kõiki taktsagedusi ei saa jagada nii, et tekiks standardne boodikiirus. Mõnede mikrokontrolleri taktsageduste puhul on boodikiiruse erinevus soovitust ligikaudu 10%. AVR andmelehtedes on toodud tabelid tüüpilistest taktsagedustest, boodikiirustest ja nende saamiseks vajalikust jagamistegurist ning tekkida võivast veast.+Kõikide seadistuste jaoks on olemas vastavad registridmida on üsna lihtne andmelehe abil seadistada. Natuke keerulisem on boodikiiruse seadmine. Taktsignaal andmete edastamiseks genereeritakse töötaktist ja kasutaja saab valida teguri 1-st 4096-nimillega töötakt läbi jagatakse. Täiendavalt jagatakse saadud taktisignaali olenevalt režiimist veel 2, 8 või 16-ga. Probleem on selles, et kõiki taktsagedusi ei saa jagada nii, et tekiks standardne boodikiirus. Mõnede mikrokontrolleri taktsageduste puhul on boodikiiruse erinevus soovitust ligikaudu 10%. AVR andmelehtedes on toodud tabelid tüüpilistest taktsagedustest, boodikiirustest ja nende saamiseks vajalikust jagamistegurist ning tekkida võivast veast.
  
-Kuna andmete edastus toimub protsessorist sõltumata ja oluliselt aeglasemalt tuleb enne saatmist veenduda, et liides on valmis uut sõna edastama. Selleks tuleb jälgida saatepuhvri valmisoleku olekubitti mis näitab kas sinna võib saatmiseks uue sõna kirjutada või mitte. Kui mikrokontroller käivitada on see luba vaikimisi kohe olemas. Niipea kui sõna on saadetud ja puhvrisse pole uut sõna saatmiseks kirjutatud, muudetakse kõrgeks saatmise õnnestumise olekubitt.+Kuna andmete edastus toimub protsessorist sõltumata ja oluliselt aeglasemalttuleb enne saatmist veenduda, et liides on valmis uut sõna edastama. Selleks tuleb jälgida saatepuhvri valmisoleku olekubittimis näitabkas sinna võib saatmiseks uue sõna kirjutada või mitte. Kui mikrokontroller käivitadaon see luba vaikimisi kohe olemas. Niipea kui sõna on saadetud ja puhvrisse pole uut sõna saatmiseks kirjutatud, muudetakse saatmise õnnestumise olekubitt kõrgeks.
  
-Sõna saabumist tähistab samuti spetsiaalne olekubitt. Lisaks on olekubitid vastuvõtmisel tekkiva kaadri vea, paarsuse vea ja vastuvõtja puhvri ületäitumise tähistamiseks. Puhvri ületäitumine tekib näiteks siis kui eelmist saabunud sõna pole vastuvõtu puhvrist välja loetud - seepärast on oluline saabuvad sõnad kiiresti programmi lugeda, näiteks katkestusega. Kokku on kolm võimalikku katkestuse põhjust: saatepuhvri valmisolek, saatmise õnnestumine ja vastuvõtmise õnnestumine.+Sõna saabumist tähistab samuti spetsiaalne olekubitt. Lisaks on olekubitid vastuvõtmisel tekkiva kaadri vea, paarsuse vea ja vastuvõtja puhvri ületäitumise tähistamiseks. Puhvri ületäitumine tekib näiteks siiskui eelmist saabunud sõna pole vastuvõtu puhvrist välja loetud - seepärast ongi oluline saabuvad sõnad kiiresti programmi lugeda, kasutades selleks näiteks katkestust. Kokku on kolm võimalikku katkestuse põhjust: saatepuhvri valmisolek, saatmise õnnestumine ja vastuvõtmise õnnestumine.
  
-Muide, saatepuhver ja vastuvõtu puhver on füüsiliselt küll erinevad registrid, kuid jagavad nad sama mäluaadressi ja omavad ühist nime. Ühine andmeregister toimib sedasi, et sellesse kirjutades jõuab sõna saatepuhvrisse ja sellest lugedes tuleb see vastuvõtu puhvrist. Veel ühe täpsustusena tuleks arvestada, et 9-bitiste andmesõnade puhul edastatakse ja loetakse üheksandat bitti hoopis ühe seaderegistri kaudu.+Muide, saatepuhver ja vastuvõtupuhver on füüsiliselt küll erinevad registrid, kuid jagavad sama mäluaadressi ja neil on ühine nimi. Ühine andmeregister toimib nii, et sellesse kirjutades jõuab sõna saatepuhvrisse ja sellest lugedes tuleb see vastuvõtupuhvrist. Veel ühe täpsustusena tuleks arvestada, et 9-bitiste andmesõnade puhul edastatakse ja loetakse üheksandat bitti hoopis ühe seaderegistri kaudu.
  
-Peale asünkroonse ja sünkroonse režiimi toetab AVR USART ka mitme-protsessori vahelist sidet. See on +<box 100% round #EEEEEE|Näide>
  
-===== Näide ===== +Seadistada 8 MHz taktsagedusel töötav ATmega128 USART0 liides boodikiirusel 9600 bps asünkroonselt edastama 8-bitiseid sõnu stop-bitiga ja ilma paarsuse bitita. Saata märk "X".
- +
-Seadistada 8MHz taktsagedusel töötava ATmega8 UART liides boodikiirusel 9600bps edastama 8 bitiseid sõnasid, stopp-bitiga ja ilma paarsuse bitita. Saata üle liidese sõnum "Tere"+
  
 <code c> <code c>
-#include <avr/io.h>+// Boodi kiiruseks 9600 bps seadmine 
 +// Valem: jagamistegur = taktsagedus / 16 / boodi kiirus - 1 
 +// UBRR = 8000000 / 16 / 9600 - 1 = ~51 
 +UBRR0H = 0; 
 +UBRR0L = 51;
  
-// Märgi saatmise funktsioon +UCSR0B = (1 << TXEN0)// Saatja lubamine
-void send_char(char c) +
-+
-  // Ootame kuni andmepuhver on tühi, ehk eelmine sõna on saadetud +
-  while (!(UCSRA & _BV(UDRE))) {}+
  
-  // Märgi kirjutamine puhvrisse kust see ka teele saadetakse+// Asünkroonse režiimi seadistamine, andmesõna pikkuseks 8 bitti 
-  UDR c; +// 1 stop-bitt, keelatud paarsuse bitt
-}+UCSR0C (1 << UCSZ01) | (1 << UCSZ00);
  
-// Peafunktsioon +// Ootame, kuni andmepuhver on tühi ehk eelmine sõna on saadetud 
-int main() +// Selles näites ei oma see küll mõtet, sest saadetakse alles 
-+// esimest märki, küll tasub seda teha rohkemate märkide korral. 
-  // Boodi kiiruseks 9600bps seadmine +while (!(UCSR0A & (<< UDRE))) continue;
-  // UBRR registri väärtus = taktsagedus / 16 / boodi kiirus - 1 +
-  // UBRR = 8000000 / 16 / 9600 - = ~51 +
-  UBRRH = 0; +
-  UBRRL = 51;+
  
-  // Saatmise funktsiooni lubamine +// Märgi kirjutamine puhvrisse, kust see ka teele saadetakse 
-  UCSRB _BV(TXEN);+UDR0 'X';
  
-  // Asünkroonse režiimi seadistamine, andmesõna pikkuseks 8 bitti 
-  // 1 stop bitt, keelatud paarsuse bitt. 
-  // ATmega8 eripära tõttu tuleb UCSRC registrisse kirjutamiseks ka URSEL bitt kõrgeks seada. 
-  UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); 
- 
-  // Teate saatmine 
-  // Selleks kasutame ühe märgi saatmise alamfunktsiooni 
-  send_char('T'); 
-  send_char('e'); 
-  send_char('r'); 
-  send_char('e'); 
-  send_char('\r'); // Reavahetuse märgid ASCII-s 
-  send_char('\n'); 
-} 
 </code> </code>
  
-See näide sisaldab küll kõike hädavajalikku saatmiseks, kuid reaalses rakenduses on soovitatav boodi kiiruse seadistamise registri väärtuse arvutamiseks kasutada makrosidNing teksti on palju mugavam saata mitte tähthaaval vaid ühe korraga. Allpool on ka näide teksti saatmise kohta, kuid kuna see töötab viitadega (//pointer//), mille kohta võiks eraldi juhendi kirjutada, siis ei ole ka siin pikalt koodi lahti selgitatud.+Seadistada 32 MHz taktsagedusel töötav ATxmega128A1U USARTD0 liides boodikiirusel 9600 bps asünkroonselt edastama 8-bitiseid sõnu 1 stop-bitiga ja ilma paarsuse bititaSaata märk "X".
  
 <code c> <code c>
-// Teksti (märgijada) saatmise funktsioon +// Boodi kiiruseks 9600 bps seadmine 
-void send_text(char *text) +// Vaja on valida skaala konstant BSCALE -7..7 
-+// Vaja on leida perioodi seade BSEL  
-  // Iga märgi saatmine kuni tuleb 0 märk +// Valem: BSEL = (F_CPU / (2^BSCALE 16 * baudrate))-1 
-  // mis näitab sisuliselt teksti lõppu. +USARTD0.BAUDCTRLA = 12; 
-  while (*text != 0+USARTD0.BAUDCTRLB = (4<<USART_BSCALE_gp);
-  { +
-    send_char(*text++);  +
-  } +
-}+
  
-// Teksti saatmise funktsiooni väljakutsumine +USARTD0.CTRLB |= (USART_TXEN_bm); // Saatja lubamine
-send_text("Tere\r\n"); +
-</code>+
  
 +// Asünkroonse režiimi seadistamine, andmesõna pikkuseks 8 bitti
 +// 1 stop-bitt, keelatud paarsuse bitt.
 +USARTD0.CTRLC |= (  USART_CMODE_ASYNCHRONOUS_gc|
 +                    USART_PMODE_DISABLED_gc|
 +                    USART_CHSIZE_8BIT_gc);
 +
 +// Ootame, kuni andmepuhver on tühi ehk eelmine sõna on saadetud
 +// Selles näites ei oma see küll mõtet, sest saadetakse alles
 +// esimest märki, küll tasub seda teha rohkemate märkide korral.
 +while (!(USARTD0.STATUS & (USART_DREIF_bm)));
 +
 +// Märgi kirjutamine puhvrisse, kust see ka teele saadetakse
 +USARTD0.DATA = 'X';
 +
 +</code>
 +</box>
et/avr/usart.1262711519.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0