;=======================================================
; Проект 31. Передача по USART
; ATmega8, 8 МГц. Скорость 9600 бод, вывод строки в терминал
; TXD (PD1) через преобразователь уровней на COM или USB-UART
;=======================================================
.include "m8def.inc"

.def tmp  = r16
.def chr  = r17

.cseg
.org 0x0000
        rjmp    RESET

RESET:
        ldi     tmp, low(RAMEND)        ; инициализация стека — обязательна
        out     SPL, tmp
        ldi     tmp, high(RAMEND)
        out     SPH, tmp

        rcall   UsartInit

MAIN:
        ldi     ZL, low(TEXT<<1)        ; адрес строки во flash
        ldi     ZH, high(TEXT<<1)
SEND_LOOP:
        lpm     chr, Z+                 ; читаем байт из памяти программ
        cpi     chr, 0                  ; конец строки?
        breq    PAUSE
        mov     tmp, chr
        rcall   UsartSend
        rjmp    SEND_LOOP
PAUSE:
        rcall   Delay1s
        rjmp    MAIN

;--- настройка USART: 9600 бод при 8 МГц ---
UsartInit:
        ldi     tmp, 0
        out     UBRRH, tmp
        ldi     tmp, 51                 ; UBRR = F_CPU/(16*9600) - 1
        out     UBRRL, tmp
        ldi     tmp, (1<<TXEN)|(1<<RXEN)
        out     UCSRB, tmp
        ldi     tmp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)   ; 8 бит, 1 стоп
        out     UCSRC, tmp
        ret

;--- передача байта из tmp ---
UsartSend:
        sbis    UCSRA, UDRE             ; буфер передатчика свободен?
        rjmp    UsartSend
        out     UDR, tmp
        ret

Delay1s:
        ldi     r18, 41
D1:      ldi     r19, 255
D2:      ldi     r20, 255
D3:      dec     r20
        brne    D3
        dec     r19
        brne    D2
        dec     r18
        brne    D1
        ret

TEXT:   .db "AFON radio - ATmega8", 13, 10, 0
