This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:avr:usart [2010/02/09 18:49] – raivo.sell | 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 lihtsustatud variant - universaalne asünkroonne jadaliides. Vahe seisneb selles, et USART kasutab peale andmeliinide ka taktsignaali liini, millega andmeid sünkroniseeritakse, | + | 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 liini, millega andmeid sünkroniseeritakse, |
| 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, | ||
| Line 11: | Line 11: | ||
| 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. | 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. | ||
| - | ===== Näide | + | <box 100% round #EEEEEE|Näide> |
| - | Seadistada 8 MHz taktsagedusel töötav ATmega128 USART0 liides boodikiirusel 9600 bps asünkroonselt edastama 8-bitiseid sõnu 1 stopp-bitiga ja ilma paarsuse bitita. Saata märk " | + | Seadistada 8 MHz taktsagedusel töötav ATmega128 USART0 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> | ||
| - | #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; | ||
| - | int main() | + | UCSR0B = (1 << TXEN0); // Saatja lubamine |
| - | { | + | |
| - | // Boodi kiiruseks 9600 bps seadmine. Valem: | + | |
| - | // | + | |
| - | // UBRR = 8000000 / 16 / 9600 - 1 = ~51 | + | |
| - | UBRR0H = 0; | + | |
| - | UBRR0L = 51; | + | |
| - | // Saatja lubamine | + | // Asünkroonse režiimi seadistamine, |
| - | UCSR0B | + | // 1 stop-bitt, keelatud paarsuse bitt. |
| + | UCSR0C | ||
| - | // Asünkroonse režiimi seadistamine, andmesõna pikkuseks 8 bitti | + | // Ootame, kuni andmepuhver on tühi ehk eelmine sõna on saadetud |
| - | // 1 stop-bitt, keelatud paarsuse bitt. | + | // Selles näites ei oma see küll mõtet, sest saadetakse alles |
| - | UCSR0C = (1 << UCSZ01) | (1 << | + | // esimest märki, küll tasub seda teha rohkemate märkide korral. |
| + | while (!(UCSR0A & (1 << | ||
| - | // Ootame kuni andmepuhver on tühi ehk eelmine sõna on saadetud | + | // Märgi kirjutamine puhvrisse, kust see ka teele saadetakse |
| - | // Selles näites ei oma see küll erilist mõtet, sest saadetakse | + | UDR0 = ' |
| - | // alles esimest märki, küll tasub seda teha rohkemate märkide korral | + | |
| - | while (!(UCSR0A & (1 << UDRE))) continue; | + | |
| - | // Märgi kirjutamine puhvrisse, kust see ka teele saadetakse | ||
| - | UDR0 = ' | ||
| - | |||
| - | // Lõputu tsükkel | ||
| - | while (1) continue; | ||
| - | } | ||
| </ | </ | ||
| + | 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> | ||
| + | // Boodi kiiruseks 9600 bps seadmine | ||
| + | // Vaja on valida skaala konstant BSCALE -7..7 | ||
| + | // Vaja on leida perioodi seade BSEL | ||
| + | // Valem: BSEL = (F_CPU / (2^BSCALE * 16 * baudrate))-1 | ||
| + | USARTD0.BAUDCTRLA = 12; | ||
| + | USARTD0.BAUDCTRLB = (4<< | ||
| + | |||
| + | USARTD0.CTRLB |= (USART_TXEN_bm); | ||
| + | |||
| + | // 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 = ' | ||
| + | |||
| + | </ | ||
| + | </ | ||