Заблокирован
Регистрация: 03.12.2008
Сообщений: 112
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 22 сообщении(ях)
|
Вывод строки в USART
Есть исходник для ATmega16. который выводит строку в COM порт.
Как изменить его, чтобы вывести кириллицу?
.INCLUDE "m16def.inc"
.equ XTAL = 14318000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
.MACRO putc
ldi R16,@0
rcall uart_snt ; вызываем подпрограмму передачи данных по UART.
.ENDMACRO
.org 0
rjmp reset_handler
.org URXCaddr
rjmp uart_rcvd ;принимать данные будем по прерыванию
reset_handler:
ldi r16,high(RAMEND) ; инициализация стека
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
sei
LDI R16, low(bauddivider) ;инициализация уарта
OUT UBRRL,R16
LDI R16, high(bauddivider)
OUT UBRRH,R16
;LDI R16,0
;OUT UCSRA,R16
LDI R16, (1‹‹RXEN)|(1‹‹TXEN)|(1‹‹RXCIE)|(0‹‹TXCIE)
OUT UCSRB, R16
LDI R16,(1‹‹URSEL)|(1‹‹UCSZ0)|(1‹‹UCSZ1)
OUT UCSRC,R16
putc 'H' ;Приветствие, мол коннект успешен и усарт работает
putc 'e'
putc 'l'
putc 'l'
putc 'o'
putc ','
putc ' '
putc 'm'
putc 'y'
putc ' '
putc 'n'
putc 'a'
putc 'm'
putc 'e'
putc ' '
putc 'i'
putc 's'
putc ' '
putc 'A'
putc 'T'
putc 'm'
putc 'e'
putc 'g'
putc 'a'
putc '1'
putc '6'
putc '!'
putc 0x0D
putc 0x0A
ldi r16,0 ;сброс рабочих регистров, а то малоли
ldi r17,0
ldi r18,0
ldi r19,0
ldi r20,0
start: ;зацикливаем на распознание первого числа, число должно прийти двоичным и дополнено возвратом каретки и переводом строки (!!!)
cpi r16,48 ; это нолик
BREQ label1
cpi r16,49 ; это единичка
BREQ label2
cpi r16,13 ;а вдруг возврат каретки? =)
BREQ label3
cpi r16,10 ;a вдруг перевод строки? =)
breq label4
jmp start
loop:
ldi r16,150; это нужно чтоб цифирка, пришедшая не так давно, не определялась много миллионов раз =)
jmp start
label1:
;putc 'a'
lsl r17 ; r17 будет накапливать двоичное число, если нолик пришел, то просто сдвиг влево
jmp loop
label2:
;putc 'b'
inc r17 ; а если единичка, то увеличим на 1 и сдвинем влево
lsl r17
jmp loop
label3:
;putc 'c'
ldi r18,1 ; r18 будет в качестве переключателя, т.к. как в условии было, что сперва идет возврат каретки, потом переход
jmp loop
label4:
cpi r18,1 ; ура нам повезло, каретка уже вернулась, да еще и переход строки подоспел, а это значит, что мк получил первое число
BREQ start2 ; можно идти за вторым
;putc 'e'
jmp loop
start2: ;тут уже всё зациклино на получение второго числа, все так же как и в первом
cpi r16,48 ; это нолик
BREQ label21
cpi r16,49 ; это единичка
BREQ label22
cpi r16,13 ;а вдруг возврат каретки? =)
BREQ label23
cpi r16,10 ;a вдруг перевод строки? =)
breq label24
jmp start2
loop2:
ldi r16,150;
jmp start2
label21: ;число собираем в r19
lsl r19
jmp loop2
label22:
inc r19
lsl r19
jmp loop2
label23:
ldi r20,1 ; регистр р20 будет переключающим
jmp loop2
label24:
cpi r20,1
BREQ finish ; ура у нас есть два числа можем переходит к их обработке
jmp loop2
finish:
lsr r17 ; регистры сдвинулись влево из-за приема последней цифры надо поправить
andi r17,0b00001111; так как число должно быть 4х значным, то убиваем лишние биты
lsr r19 ; здесь тоже самое что и с r17
andi r19,0b00001111;
add r17,r19 ; складываем их
mov r16,r17 ; и подготавливаем к отправке
ldi r21,48 ; это опционально, перевод в систему ASCII перед отправкой
add r16,r21 ;
rcall uart_snt ;отправляем результат пользователю
putc 10 ;чтоб покрасевей было переведем строку
putc 13 ;
ldi r16,0 ; всё сбрасываем и начинаем сначала
ldi r17,0 ;
ldi r18,0 ;
ldi r19,0 ;
ldi r20,0 ;
jmp start
uart_snt:
sbis UCSRA,UDRE; Ждем пока бит UDRE в регистре UCSRA станет 1, что означет готовность УАРТА к передаче.
rjmp uart_snt
out UDR,R16 ; бросаем число из регистра 16 в регистр приемопередатчика.
ret
uart_rcvd:
in r16,udr
reti
|