Задача
Принять символ из терминала, показать его код и вернуть отправителю.
Микроконтроллер: 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 Ом |
Алгоритм
- Включить приёмник и передатчик битами RXEN и TXEN.
- Опрашивать флаг RXC — он поднимается при готовности байта.
- Прочитать данные из UDR: чтение автоматически сбрасывает флаг.
- Вывести код на светодиоды и отправить символ обратно.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: 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.