AFON // радиотехник affonya@mail.ru
← Проекты на AVR

Проект 32. Приём по USART и эхо

Контроллер принимает символы из терминала, показывает их код на светодиодах и отправляет обратно. Классическая проверка связи в обе стороны.

Задача

Принять символ из терминала, показать его код и вернуть отправителю.

Микроконтроллер: ATmega8, кварц 4 МГц. Среда: Atmel Studio / avra (или avra / Atmel Studio). Как настроить среду и прошить контроллер — в статье программирование AVR.

Что понадобится

  • ATmega8
  • кварц 8 МГц + 2×22 пФ
  • преобразователь USB-UART
  • 8 светодиодов + 8×470 Ом

Схема подключения

ВыводПодключение
PD0 / RXDвыход TXD преобразователя
PD1 / TXDвход RXD преобразователя
PB0…PB7светодиоды через резисторы 470 Ом

Алгоритм

  1. Включить приёмник и передатчик битами RXEN и TXEN.
  2. Опрашивать флаг RXC — он поднимается при готовности байта.
  3. Прочитать данные из UDR: чтение автоматически сбрасывает флаг.
  4. Вывести код на светодиоды и отправить символ обратно.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: a32.asm · a32.hex (готовая прошивка).

;=======================================================
; Проект 32. Приём по USART с эхо
; ATmega8, 8 МГц, 9600 бод
; Принятый символ возвращается обратно и дублируется
; на светодиоды PORTB
;=======================================================
.include "m8def.inc"

.def tmp  = r16
.def data = r17

.cseg
.org 0x0000
        rjmp    RESET

RESET:
        ldi     tmp, low(RAMEND)
        out     SPL, tmp
        ldi     tmp, high(RAMEND)
        out     SPH, tmp

        ldi     tmp, 0xFF
        out     DDRB, tmp               ; светодиоды — выходы
        rcall   UsartInit

MAIN:
        rcall   UsartRecv               ; ждём символ
        out     PORTB, data             ; показываем его код
        mov     tmp, data
        rcall   UsartSend               ; отправляем обратно (эхо)
        rjmp    MAIN

UsartInit:
        ldi     tmp, 0
        out     UBRRH, tmp
        ldi     tmp, 51
        out     UBRRL, tmp
        ldi     tmp, (1<<TXEN)|(1<<RXEN)
        out     UCSRB, tmp
        ldi     tmp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
        out     UCSRC, tmp
        ret

;--- ожидание и приём байта в data ---
UsartRecv:
        sbis    UCSRA, RXC              ; принят ли байт?
        rjmp    UsartRecv
        in      data, UDR
        ret

UsartSend:
        sbis    UCSRA, UDRE
        rjmp    UsartSend
        out     UDR, tmp
        ret

Пояснения

  • Флаг RXC сбрасывается самим фактом чтения UDR — отдельной команды сброса не нужно.
  • Приёмник имеет буфер на два байта: пока программа занята, следующий символ не потеряется. При переполнении поднимается флаг ошибки OVR.
  • Эхо — простейший тест кабеля и настроек: если символы возвращаются искажёнными, почти всегда виновата неверная скорость или тактовая частота.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры AVR.