Периферійний послідовний інтерфейс UART

Схема периферійного послідовного порта UART наведена на рисунку 1

Рисунок 1 – Схема периферійного послідовного порта UART

 

До складу мікроконтролера AT90S2313 входить універсальний дуплексний послідовний порт (UART). Його основні можливості: широкий діапазон швидкостей обміну даними; висока швидкість передачі при низькій частоті XTAL; 8 або 9-розрядний формат даних; виявлення помилок утрати даних при прийомі; виявлення помилок формату кадрів; виявлення помилкового стартового біта; три окремих переривання: по завершенню передачі, по порожньому регістру передавача і по завершенню прийому.

При передачі модуль UART додає до вхідного символу (8 або 9 біт) на початку — старт-біт (нуль), а в кінці — стоп-біт (одиниця), формуючи таким чином 10- або 11-бітову послідовність. Отримані значення передаються до регістра зсуву, який по черзі передає біти на вихід передавача TXD (вивід PD1). Швидкість видачі біт на вихід передавача визначається параметром baud rate (швидкість передачі інформації; вимірюється в бодах), яким можна керувати.

Приймач модуля UART безперервно перевіряє стан входу RXD, на якому за відсутності даних встановлюється рівень «1». Приймач зчитує інформацію з входу в 16 разів швидше. При виявленні на виводі RXD  рівня «0» (тобто можливого старт-біта) мікроконтролер пропускає шість відліків, а потім робить три вибірки. Ці вибірки доводяться на відліки 8, 9 і 10 для кожного біта, що приймається, і, таким чином, зчитування значення біта відбувається в середині інтервалу його передачі, що дозволяє працювати з сигналами, що мають фронти великої тривалості. Якщо мікроконтролер виявляє, що на виводі RXD все ще присутній рівень «0», тобто прийшов стар-біт, модуль UART переходить в робочий режим і починає зчитувати байт. Якщо ж на виводі RXD вже присутній рівень «1», вважається, що перший відлік був просто шумом, і модуль переходить до очікування коректного символу. Якщо приймач визначив, що прийшов дійсний символ, він починає брати по три відліки кожного біта в середині інтервалу його передачі. Якщо значення всіх трьох відліків біта не збігаються, то значення біта набуває рівним значенню двох однакових відліків. На завершення модуль зчитує вибірки, що відносяться до стоп-біту. Для того, щоб було вирішено про коректний прийом символу, принаймні, дві з цих вибірок мають дорівнювати одиниці. Інакше модуль вважає символ за невірно кадрований і реєструє помилку кадрування (framing error).

Всі ці операції виконує модуль UART. Цей модуль містить 4 регістри вво­ду/виводу:

  UDR (UART Data  Register $0C) — регістр даних UART, містить байт даних, що приймається або передається;

  UCR (UART Control Register  $0A) — регістр керування, управляє конфігурацією UART, а також містить  8-й біт даних;

  USR (UART Status Register  $0B) — регістр статусу UART, відображає  стан модуля UART, зокрема прапорів переривань;

  UBRR (UART Baud Rate Register, $09) — регістр швидкості передачі, за­дається швидкість передачі даних по UART.

Швидкість передачі визначається за формулою:

BAUD=FCK/16(UBRR+1),

де  BAUD - частота в бодах;

      FCK - частота мікроконтролера;

      UBRR -уміст регістра UBRR (0 -255).

Якщо використовується резонатор 4 МГц, а в регістрі UBRR записане 25, швидкість передачі дорівнює 9615 біт/с. Існує певний набір стандартних швидкостей передачі: 2400,4800, 9600, якого бажано дотримуватися для забезпече­ння сумісності з іншими пристроями. З цієї причини «рівні» значення тактових частот, наприклад 4 МГц, не дуже підходять  для пристроїв, що, використовують UART, оскільки в цьому випадку важко набути точних стандартних значень швидкості. Набагато зручніше використовувати резонатори з такими частотами, як 1.8432 МГц, 2.4576 МГц, 3.6864 МГц, 4.608 МГц, 7.3728 МГц і 9.216 МГц. Якщо взяти частоту 3.6864 МГц, то при UBRR= 23 швидкість передачі буде 9600.

Призначення біт регістрів UCR і USR приведені у таблиці 1, 2.  Регістр UBRR використовується для управління швидкістю передачі даних.  Вона має бути однаковою для приймаючого і передавального пристроїв.

 

Таблиця 1 – UCR  регістр керування UART ($0A)

Біт

7

6

5

4

3

2

1

0

Назва

RXCIE

TXCIE

UDRIE

RXEN

TXEN

CHR9

RXB8

TXB8

 

TXB8 – 8-й біт даних, що передаються (при обміні 9-бітними даними містить 9-біт символа, що передається);

RXB8 8-й біт даних, що приймаються (при обміні 9-бітними даними містить 9-біт символа, що примається);

CHR9 – формат посилок (0– 8 бітні данні плюс старт-біт або стоп-біт; 1– 9 бітні данні плюс старт-біт або стоп-біт);

 TXENдозвіл передачі (0- заборона але тільки після завершення поточої передачі, 1 – дозволена робота передавача)

RXEN дозвіл прийому (0- заборона, 1 – дозволена робота приймача);

UDRIE – дозвіл переривання, коли очищений регістр даних UART (0 –переривання заборонено, 1 – дозволено);

TXCIE – дозвіл переривання по завершенню передачі (0 – переривання заборонено, 1 – дозволено)

RXCIE – дозвіл переривання по завершенню прийому (0 – переривання заборонено, 1 – дозволено)

 

  Таблиця 2 – USR  регістр стану UART ($0В)

Біт

7

6

5

4

3

2

1

0

Назва

RXC

TXC

UDRE

FE

OR

-

-

-

 

OR – переповнення: 0–зміст UDR був вдало перезавантажений у регістр зсуву, 1– зміст UDR було перезаписано до того, як байт скопійований у регістр зсуву;

FE –помилка кадрування: 0– помилка відсутня (коректний стоп-біт), 1 – помилка виявлена (некоректний стоп-біт)

UDRE – регістр даних UART пуст: 0 – байт, що знаходиться в регістрі UDR ще не перевантажений до регістра зсуву, 1 – зміст регістра UDR перевантажений до регістра зсуву

TXC – передача завершена (встановляється в 1 після передачі символу, якщо відсутні інші дані у UDR)

RXC – прийом завершений (встановлюється в1після прийому символу й збережені його у UDR)

$007

rjmp UART_RXC;

Оброблювач завершення прийому UART (UART RX Complete  Handler)

$008

rjmp UART_DRE;

Оброблювач порожнього регістра даних (UDR Empty Handler)

$009

rjmp UART_TXC;

Оброблювач завершення передачі UART (UART TX

Приклад налаштування приймача та передавача UART

 

; Дозволити роботи приймама UART

; Дозволити переривання по завершенню прийому

 

;Set PULL-UP Resistors

sbi   PORTD,0

sbi   PORTD,1

;Set Baud Rate

Ldi    R17,47

out UBRR, r17

;Set Control Register

Ldi    R16, $90

Out   UCR,r16

 

;Interrupt handler

UART_UDRE:

in  R16, UDR

reti

 

 

; Дозволити роботи передавача UART

; Дозволити переривання коли очищений регістр даних

 

;Set PULL-UP Resistors

sbi   PORTD,0

sbi   PORTD,1

;Set Baud Rate

Ldi    R17,47

out UBRR, r17

;Set Control Register

Ldi    R16, $28

Out   UCR,r16

 

;Interrupt handler

UART_TXC:

- - program code - -

reti

 

;Interrupt handler

UART_UDRE:

Out   UDR,  R16

reti

 

 

 

Приклад програми передавача та приймача по інфрачервоному каналу для кодового замка з використанням   UART

 

; Передача 5 байт по UART

.include "tn2313def.inc"

                                ; тактова частота 3.6864 МГц

     .ORG 000

     .equ   s0 = 0b00100100

     .equ   s1 =0b11000000     ;

     .equ   s2 = 0b11100000    ;

     .equ   s3 = 0b11110000    ;

     .equ   s4 = 0b11111000

     .def  tmp= r16

     rjmp reset

reset:

     ldi tmp,0b00001001

     out UCR,tmp           ; установлений біт TXEN=1 (дозвіл передачі)   

                            ;TXB8=1 (після байту) передається 1

     ldi tmp,23            ; налаштування швидкості передачі

     out UBRR, tmp        ; BAUD=9600

     ldi tmp, low(RAMEND)

     out SPL, tmp

     ldi tmp,0b00000001;

     out ddrb, tmp   ;

     out portb, tmp  ;

scan:

     ldi tmp, 0b00000000;

     sbis pinb, 0    ;

     rjmp load ;

     rcall trans     ;

     rjmp scan ;

load: ;

     ldi tmp, s0     ;

     rcall trans

     ldi tmp, s1     ;

     rcall trans     ;

     ldi tmp,s2

     rcall trans     ;

     ldi tmp,s3 ;

     rcall trans     ;

     ldi tmp,s4

     rcall trans

     rjmp scan ;

trans:               ;

     sbis USR, UDRE  ; якщо регістр даних UART пустий, то в регістр

     rjmp trans      ; UDR завантажуємо нове число

     out UDR, tmp    ;

     ret  ;

.EXIT

 

; Прийом 5 байт по UART для кодового замка

 

.include "tn2313def.inc"

      .ORG 0

      .equ   s0 = 0b00100100

      .equ   s1 = 0b11000000  ;

      .equ   s2 = 0b11100000  ;

      .equ   s3 = 0b11110000  ;

      .equ   s4 = 0b11111000  ;

      .def tmp = r16

      rjmp reset

reset:

;======================= Ініціалізація стека =======================      

      ldi tmp, low(RAMEND)

      out SPL, tmp

;======================= Ініціалізація  UART =======================

      ldi tmp,0b00010001  ; установлений біт TXEN=1 (дозвіл передачі)

      out UCR, tmp         ; TXB8=1 (після байту) передається 1

      ldi tmp,23         ;налаштування швидкості передачі

      out UBRR, tmp       ; BAUD=9600

;======================= Ініціалізація портів В и D.=================

      ldi tmp,0b11111111

      out ddrb, tmp

      ldi tmp,0b11111100

      out ddrd, tmp

      cbi portd,5          ;закриваємо замок

      ldi r25, 0b00000000

      rjmp main

;======================= Основний цикл =================

; прийом даних по UART

scan:

      sbis USR, RXC ; якщо прийом завершений, то RXC=1

      rjmp scan

      in tmp, UDR   ; то читаємо дані з регістра даних UDR

      ret

main: ;Порівнюємо прийняті слова з кодами

ss0:

      rcall scan

      cpi tmp, s0

      brne ss0

ss1:

      rcall scan

      cpi tmp,s1

      brne ss0

ss2:

      rcall scan

      cpi tmp,s2

      brne ss0

ss3:

      rcall scan

      cpi tmp,s3

      brne ss0

ss4:

      rcall scan

      cpi tmp,s4

      brne ss0

;======================= Якщо все співпало, то

      sbi portd,5        ; відкриваємо замок

      ldi r27,20

      cbi portd,5        ; закриття замку

      rjmp main          ; повернення до початку

.EXIT

 

 

http://easyelectronics.ru/avr-uchebnyj-kurs-peredacha-dannyx-cherez-uart.html