Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART ATmega48
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Alt.F4
МК не хочет осуществлять передачу до принятия любого символа. Причем не зависает, просто проходит подпрограмму передачи, и работает дальше.
Но если сперва принять хотя бы один символ, то передача работает.
Код
    clr        temp            ;
    sts        UCSR0B,temp        ;
    ldi        temp,0b00000110    ; 8бит, 1стоповый бит, нет четности, асинхронный режим
    sts        UCSR0C,temp        ;
    ldi        temp,0x80        ; сброс
    sts        CLKPR,temp        ; делителя
    ldi        temp,0x00        ; тактовой
    sts        CLKPR,temp        ; частоты
    clr        temp            ;
    sts        UBRR0H,temp        ;
    ldi        temp,29            ; ubrr=29
    sts        UBRR0L,temp        ; 9600 бод/сек
    ldi        temp,0b00011000    ; установка TXEN RXEN
    sts        UCSR0B,temp        ; USART вкл
Код
USART_transmit:
    lds        temp2,UCSR0A    ;
    sbrs    temp2,(UDRE0)    ;ждем пока содержимое из UDR0 перегрузится в сдвиговый регистр
    rjmp    USART_transmit    ;
    sts        UDR0,temp        ;отправляем
    ret                        ;возврат из процедуры отправки

USART_receive:
    lds        temp2,UCSR0A    ;
    sbrs    temp2,(RXC0)    ;ждем приема символа (установка RXC)
    rjmp    USART_receive    ;
    lds        temp,UDR0        ;читаем
    ret                        ;возврат из процедуры приема
В чем может быть дело?
Спасибо.
Alt.F4
Прогоняю в AVR Studio - все работает. sad.gif
abi
По вашему коду программа зацикливается в процедуре приема, ожидая установки флага RXC0, т.е. выход из процедуры возможен после приема байта.
Alt.F4
Да, я знаю. Вопрос в другом: если сперва делать передачу, то МК ничего не отсылает по USART, а вот если сперва прием, а затем передачу, то все работает.
Может это компилятор AVR Studio виноват?
Т.к. есть глюк с передачей символов из таблиц. Если таблица написана так:
Код
.db 'R','e','z','h','i','m',0x20,'"','O','h','r','a';
.db 'n','a','"',0x20,'a','k','t','i','r','o','v','a';
.db 'n','.'                               ;
то в HyperTerminal'е наблюдаю: Rezhim "OhАEЫ›ААP0ч*™*˜
А если так:
Код
.db 'R','e','z','h','i','m',0x20,'"','O','h';
.db 'r','a','n','a','"',0x20,'a','k','t','i';
.db 'v','i','r','o','v','a','n','.'   ;
то уже почему-то: RezhАEЫ›ААP0ч*™*˜B™B˜
Проблема решается добалвением 3-х пустых строк между таблицами. unsure.gif
з.ы. и еще понять не могу, почему когда загружаю прошивку в UniProf, он в окне EEPROM грузит какие-то данные и шьет их в МК. Ведь эта же память по программе пуста!
Спасибо.
alexeyv
А какой драйвер RS-232 стоит? Может он находится в спячке пока не примет байт.
У некоторых есть режим типа shutdown (точно не помню)
Alt.F4
Цитата
А какой драйвер RS-232 стоит?
max3232, но с ним все в порядке 100%
Я думаю может компилятор глючит. Бывает такое?
Alt.F4
Пробовал передавать по установке TXC0 из UCSR0A - тоже самое.
Нашел такую же тему в "телесиське", но вопрос так и не решили...
Deka
Делал девайс, который при включении отсылает версию фирмари в терминал. Т.е. контроллер отсылает инфу первым. Всё работало. Никаких граблей замечено небыло. Правда контроллер был мега8.
Alt.F4
Цитата
ldi temp,0b00011000 ; установка TXEN RXEN
sts UCSR0B,temp ; USART вкл

start1:
lds temp2,UCSR0A ;
sbrs temp2,(RXC0) ;ждем приема символа (установка RXC)
rjmp PC+2 ;
lds temp,UDR0 ;читаем
ldi temp,0x31 ;
lds temp2,UCSR0A ;
sbrs temp2,(UDRE0) ;ждем пока содержимое из UDR0 перегрузится в сдвиговый регистр
rjmp start1 ;
sts UDR0,temp ;отправляем
rjmp start1
а на TXD тишина, но стоит отправить символ, и понеслась... crying.gif
з.ы. можно как-то программно симулировать прием по уарт? установку RXC0 пробовал, не прокатывает.
rx3apf
Цитата(Alt.F4 @ Sep 25 2010, 22:34) *
а на TXD тишина, но стоит отправить символ, и понеслась... crying.gif
з.ы. можно как-то программно симулировать прием по уарт? установку RXC0 пробовал, не прокатывает.


Эй, вот _так_ делать не надо:

rjmp PC+2 ;
lds temp,UDR0 ;читаем

Потому как LDS - это два слова, и rjmp попадает в середину команды. Знакомые грабельки, наступаем иногда wink.gif
Alt.F4
Смысл от этого все равно какбе не меняется... sad.gif

Чуть позже:
Е-мана, это что за полтэргейс? написал чисто отправление (прием выключен), по TXD тишина, но как только я в HiperTerminal'е клацнул символ на отправление, МК сразу же начал отвечать!!!
max3232 не виноват, я передергивал его питание при передаче от МК, все отображается нормально.
Это что за приколы такие? sad.gif
Alt.F4
Твою мать, пятые сутки не сплю, а это HyperTerminal отказывается принимать символы до нажатия клавиши!!! angry.gif
Александр77
С каких пор гипертерминал не принимает до нажатия?
У меня он все глотает...
Alt.F4
Цитата
С каких пор гипертерминал не принимает до нажатия?
У меня он все глотает...
Без понтия, раньше тоже вроде работало нормально. Как узнал: МК значит молчит, отсоединил max3232 от МК, клацнул в гипертерминале, подсоединяю к МК, все принимает blink.gif
alexeyv
Тогда попробуй использовать не ГиперТерминал, а какую-нибудь другую прогу. В свое время я сам писал проги по обмену ПК и процов
tazik
А Вы на телефончики вверху гипертерминала смотрели? Которые Вызов и Отключить?
Если даже гипертерминал отключен от ком-порта, то при нажатии любой клавиши он подключается автоматически. Это не Ваш случай?
Alt.F4
Да, я в курсе про "телефончики", но терминал у меня всегда подключен. (Когда загружаешь сохраненное соединение коннект происходит автоматически).
Deka
Возьмите другую терминалку.
IgorKossak
Например такую.
Сергей Борщ
Цитата(Alt.F4 @ Sep 27 2010, 10:06) *
(Когда загружаешь сохраненное соединение коннект происходит автоматически).
А у вас там управление потоком случайно не включено? Симптомы с ним должны быть другие, но все же?
MrYuran
Цитата(Alt.F4 @ Sep 26 2010, 21:01) *
Без понтия, раньше тоже вроде работало нормально. Как узнал: МК значит молчит, отсоединил max3232 от МК, клацнул в гипертерминале, подсоединяю к МК, все принимает blink.gif

Редкая гадость, этот ваш гипертерминал...
Глючит как всегда на ровном месте.
Lisitsin
У меня UART тоже глючил на AT90S2313. Всю голову сломал: AVRStudio совсем было не при чём. Уже не помню конкретно, но пришлось играться с флагами прерываний приёмника и передатчика: вместе они отказывались работать, а по отдельности работали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.