Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите забодать UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
M_A
Указанная выше железяка получает от компа через преобразователь из +-12 в ТТЛ постоянно с периодом неск. милисекунд один и тот же байт, который благополучно доходит до ноги RXD контроллера (проверял осцилом). Я сделал прогу, которая при получении чего-то отличного от нуля должна дрыгать ногой контроллера. Результат - нога постоянно в 1. BaudRate на компе и контроллере совпадают (9600). Я думаю я по неумению неправильно настроил UART контроллера. Посмотрите плз, чего не так. Или посоветуйте чего-нить, у меня варианты кончились, и чтение даташита ничего не дает.... мож плохо читаю... Заранее благодарен!!!
Код
.include "2313def.inc"
.def data = r16
.def baudrate = r17
ldi r18, 0b00010000    
out UCR, r18          ;выставляю бит RXEN (Reciever enable)
ldi r18, 0b01000000  ;
ldi r19, 0b01000000  ;два одинаковых регистра, будут нужны для вывода
out DDRD, r18        ;говорю седьмой ноге порта D что она будет выходом
ldi baudrate, 32      ;9600 at 5 MHz посчитал по формуле из даташита...
out UBRR, baudrate    ;...и записываю в Baud Rate Register

recieve:
in data, UDR              ;считываю значение регистра данных UARTа
ser r20                  ;далее проверяю, получил ли чего-нить
ser r21                  ;r20 = r21
eor r21, data            ;если в data что-то было, r21 изменится...
and r20, data            ;...и станет не равно r20...
brne troggle              ;...и произойдет прыжок на переключение ноги
rjmp recieve              ;а если останется равно, значит data = 0, повторяем считывание

troggle:                    ;дрыгалка для ноги

eor r18, r19                ;переключаю состояние r18
out PORTD, r18              ;и сбрасываю на выход

rjmp recieve                ;и все поновой...
.exit
mse
Чё-то странное. А зачем постоянно вычитывать УДР? Вычитывай из флагового регистра состояние и смотри на RXC. Или через sbiс(s) UCR,RXC. Не помню как там у 2313 мона.
Ну и анализ на "0" тоже кривоват.
Код
rx_wait:
    sbis   usr,rxc
    rjmp  rx_wait
    in      data,udr
    cpi    data,0
    brne  rx_wait
   ;шлёп-нога;О)
M_A
Цитата(mse @ Sep 21 2005, 13:49)
Чё-то странное. А зачем постоянно вычитывать УДР? Вычитывай из флагового регистра состояние и смотри на RXC. Или через sbiс(s) UCR,RXC. Не помню как там у 2313 мона.
Ну и анализ на "0" тоже кривоват.
Код
rx_wait:
    sbis   usr,rxc
    rjmp  rx_wait
    in      data,udr
    cpi    data,0
    brne  rx_wait
   ;шлёп-нога;О)

*



И правда заработало, спасибо!!! cheers.gif Только не понял, в чем же была моя ошибка. Хоть все и кривовато и некрасиво было, но работать то по моему должно было... huh.gif
VladislavS
Команда чтения из UDR влияет на конечный автомат USARTа и там что-то сбрасывается при этом. Читай даташит - там английским по белому написано, что признаком приема байта является флаг и генерируемое им прерывание. Зачем изобретать другой механизм, если разработчики чипа тебе все написали. AVR еще очень простой кристалл. Если такие вольности позволять себе на более сложном железе, то ничего никогда не заработает!

А сосвсем "попацановски" будет поместить код считывания UDR и дергания ноги в прерывание и освободить проц от опроса USR.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.