This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:avr:usart [2010/01/05 17:11] – mikk.leini | et: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 | + | USART on universaalne sünkroonne jadaliides, UART aga selle lihtsustatud |
| - | 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, | + | 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, |
| - | 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 | + | 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 saatmise õnnestumise olekubitt |
| - | 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 | + | 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 |
| - | Muide, saatepuhver ja vastuvõtu puhver | + | Muide, saatepuhver ja vastuvõtupuhver |
| - | Peale asünkroonse ja sünkroonse režiimi toetab AVR USART ka mitme-protsessori vahelist sidet. See on | + | <box 100% round # |
| - | ===== Näide ===== | + | Seadistada |
| - | + | ||
| - | Seadistada | + | |
| <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) | + | |
| - | { | + | |
| - | | + | |
| - | while (!(UCSRA & _BV(UDRE))) {} | + | |
| - | | + | // Asünkroonse režiimi seadistamine, |
| - | | + | // 1 stop-bitt, keelatud paarsuse bitt. |
| - | } | + | UCSR0C |
| - | // 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. |
| - | | + | while (!(UCSR0A & (1 << UDRE))) continue; |
| - | // UBRR registri väärtus = taktsagedus / 16 / boodi kiirus - 1 | + | |
| - | // UBRR = 8000000 / 16 / 9600 - 1 = ~51 | + | |
| - | UBRRH = 0; | + | |
| - | UBRRL = 51; | + | |
| - | | + | // Märgi kirjutamine puhvrisse, kust see ka teele saadetakse |
| - | | + | UDR0 = ' |
| - | // Asünkroonse režiimi seadistamine, | ||
| - | // 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(' | ||
| - | send_char(' | ||
| - | send_char(' | ||
| - | send_char(' | ||
| - | send_char(' | ||
| - | send_char(' | ||
| - | } | ||
| </ | </ | ||
| - | See näide sisaldab küll kõike hädavajalikku saatmiseks, kuid reaalses rakenduses on soovitatav boodi kiiruse seadistamise registri väärtuse arvutamiseks kasutada makrosid. Ning 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 (// | + | 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 bitita. Saata märk " |
| <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 |
| - | | + | // Valem: BSEL = (F_CPU / (2^BSCALE |
| - | // mis näitab sisuliselt teksti lõppu. | + | USARTD0.BAUDCTRLA = 12; |
| - | | + | USARTD0.BAUDCTRLB = (4<< |
| - | { | + | |
| - | | + | |
| - | } | + | |
| - | } | + | |
| - | // Teksti saatmise funktsiooni väljakutsumine | + | USARTD0.CTRLB |= (USART_TXEN_bm); // Saatja lubamine |
| - | send_text(" | + | |
| - | </code> | + | |
| + | // Asünkroonse režiimi seadistamine, | ||
| + | // 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 = ' | ||
| + | |||
| + | </ | ||
| + | </ | ||