This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| ru:avr:usart [2013/08/14 16:29] – создано eduardtlmk | ru: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, UART aga mitte. AVR-i USART võimaldab täisduplekssidet, 5- kuni 9-bitiseid andmesõnu | + | USART – это универсальный синхронный последовательный интерфейс, UART же является его облегчённым вариантом – универсальным асинхронным последовательным интерфейсом. Разница состоит в том, что |
| - | 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 до 4096, на который будет поделен рабочий такт. Полученный сигнал дополнительно делится на 2, 8 или |
| - | 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 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 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õ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. | + | Буферы передачи и приёма в физическом смысле разные регистры, но имеют один адрес блока памяти и имя. При записи в совместно используемый регистр данных, данные сохраняются в буфере передачи, |
| - | ~~PB~~ | + | < |
| - | <box 100% round #EEEEEE|Näide> | + | <box 100% round #EEEEEE|Пример> |
| - | Seadistada | + | Настроить интерфейс USART0 ATmega128, работающий на тактовой частоте |
| <code c> | <code c> | ||
| Line 22: | Line 22: | ||
| int main() | int main() | ||
| { | { | ||
| - | // Boodi kiiruseks | + | // Установление скорости передачи в бодах на 9600 bps. Формула: |
| - | // Jagamistegur | + | // Делитель |
| // UBRR = 8000000 / 16 / 9600 - 1 = ~51 | // UBRR = 8000000 / 16 / 9600 - 1 = ~51 | ||
| UBRR0H = 0; | UBRR0H = 0; | ||
| UBRR0L = 51; | UBRR0L = 51; | ||
| - | // Saatja lubamine | + | // Разрешение передачи |
| UCSR0B = (1 << TXEN0); | UCSR0B = (1 << TXEN0); | ||
| - | // Asünkroonse režiimi seadistamine, andmesõna pikkuseks | + | // Настройка асинхронного режима, длина слова |
| - | // 1 stop-bitt, keelatud paarsuse bitt. | + | // 1 стоп-бит, запретить бит чётности. |
| UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); | UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); | ||
| - | // 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 (!(UCSR0A & (1 << UDRE))) continue; | while (!(UCSR0A & (1 << UDRE))) continue; | ||
| - | // Märgi kirjutamine puhvrisse, kust see ka teele saadetakse | + | // Записывание знака в буфер, откуда он и будет отправлен |
| UDR0 = ' | UDR0 = ' | ||
| - | // Lõputu tsükkel | + | // Бесконечный цикл |
| while (1) continue; | while (1) continue; | ||
| } | } | ||