Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отладка UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
-=A.N.G.E.R=-
Нужна помощь!
Не могу отладить кусок проги для AT90S8515 по работе с UART
Пишу на C в AtmanAVR
Суть: МК должен принимать по UART код и сравнивать его со списком кодов, при совпадении с кодом из списка выполнять соотв. коду действия.
Что делаю: в пошаговом режиме симуляции (пробовал и AtmanAVR и AVRStudio) после перехода в режим ожидания кода от UART руками загоняю нужный код в UDR, ставлю флаг RXC - происходит прерывание, в обработчике читаю UDR в переменную
Вижу: флаг RXC сбрасывается, что говорит об успешном чтении, однако, переменная, в которую считываю UDR ,что бы в ней не было, сбрасывается в 0х00.
Вся голову сломал, что может быть?
kamedi_clab
используйте VMLAB или PROTEUS - это настоящие симуляторы а не обрубки. например vmlab на .nm.ru
Dog Pawlowa
Цитата(-=A.N.G.E.R=- @ Dec 5 2006, 11:19) *
Вижу: флаг RXC сбрасывается, что говорит об успешном чтении, однако, переменная, в которую считываю UDR ,что бы в ней не было, сбрасывается в 0х00.

Объявлена правильно?
-=A.N.G.E.R=-
Цитата
Объявлена правильно?

да, конечно же, что я только не пробовал и extern, и volatile и просто char , int все одно - сбрасывается в ноли при чтении UDR - такое ощущение, что руками позволено менять только UDR на передачу, что у меня и происходит, а как чтение смоделировать - ума не приложу...

Цитата(kamedi_clab @ Dec 5 2006, 11:48) *
используйте VMLAB или PROTEUS - это настоящие симуляторы а не обрубки. например vmlab на .nm.ru

пробовал я VMLAB, мельком правда, сложен он в настройке и не все работает, в частности, моя прога там не сработала - похоже, не те данные передает, что я задаю, либо не въехал, как их гнать
а вот PROTEUS никак не могу найти для скачивания - только форумы и отзывы, буду примного благодарен за ссылку на сей продукт
ahulap
У меня при отладке в AVR studio UDR сбрасывается в 0 после выполнения любой инструкции. Так что заношу туда значение непосредственно перед считыванием UDR.
-=A.N.G.E.R=-
Цитата(ahulap @ Dec 5 2006, 12:16) *
У меня при отладке в AVR studio UDR сбрасывается в 0 после выполнения любой инструкции. Так что заношу туда значение непосредственно перед считыванием UDR.

пробовал и это, сбрасывается в ноль в момент любой операции и в переменную сохраняется 0
Dog Pawlowa
Цитата(-=A.N.G.E.R=- @ Dec 5 2006, 12:07) *
Цитата

Объявлена правильно?

да, конечно же, что я только не пробовал и extern, и volatile и просто char , int все одно - сбрасывается в ноли при чтении UDR - такое ощущение, что руками позволено менять только UDR на передачу, что у меня и происходит, а как чтение смоделировать - ума не приложу...

Где объявлена? Внутри - снаружи прерывания? Если внутри, static пробовали?
В какой момент сбрасывается? Стек не затирает?
-=A.N.G.E.R=-
Цитата(Dog Pawlowa @ Dec 5 2006, 12:20) *
Где объявлена? Внутри - снаружи прерывания? Если внутри, static пробовали?
В какой момент сбрасывается? Стек не затирает?

объявление делал в начале файла работы с UART - особенность Atmanavr в том, что она делает несколько файлов для каждого периферийного у-ва
делал и statik, все равно происходит сброс переменной в момент сохранения в нее UDR
defunct
Проверяйте в железе.
MichaelU
При входе в прерывание по приему данных при отладке UDR вроде обнуляется - поэтому при отладке нужно заносить в него данные уже после входа в прерывание.
И еще если будет что нибудь вроде:

if UDR=='a' //вот здесь UDR уже обнулится
{
mydata[asd]=UDR; //будут нули
...
}
else if ...

Нужно:
_TmpChar=UDR;
if _TmpChar=='a'
{
mydata[asd]=_TmpChar;
...
}
else if ...
-=A.N.G.E.R=-
Цитата(MichaelU @ Dec 6 2006, 09:10) *
При входе в прерывание по приему данных при отладке UDR вроде обнуляется - поэтому при отладке нужно заносить в него данные уже после входа в прерывание.
И еще если будет что нибудь вроде:

if UDR=='a' //вот здесь UDR уже обнулится
{
mydata[asd]=UDR; //будут нули
...
}
else if ...

Нужно:
_TmpChar=UDR;
if _TmpChar=='a'
{
mydata[asd]=_TmpChar;
...
}
else if ...


Да, я это пробовал, UDR обнуляется в момент начала выполнения команды чтение, т.е. как только читаю UDR ( x=UDR ) UDR уже обнулился и в x заносятся нули.
Я склоняюсь к мысли, что это косяк в отладчике. Попробую ввести временную отладочную переменную и изменять ее руками, а не UDR.
okela
Цитата(-=A.N.G.E.R=- @ Dec 5 2006, 13:07) *
пробовал я VMLAB, мельком правда, сложен он в настройке и не все работает, в частности, моя прога там не сработала - похоже, не те данные передает, что я задаю, либо не въехал, как их гнать
а вот PROTEUS никак не могу найти для скачивания - только форумы и отзывы, буду примного благодарен за ссылку на сей продукт


http://kazus.ru/programs/viewdownload/kz_0/cid_7.html

Там куча версий Proteus, последняя 6.9
okela
А в принципе, IMHO, такой способ проверки (с симулятором AVRStudio) не есть корректный.
Регистр UDR физически состоит из двух регистров на одном адресе : один на запись (Тх) , а другой на чтение (Rx) . И ваша запись в UDR соответствует попытке отправить байта на передачу.
А в регистре приема информация появится только посля физического приема данных по линии RxD.
-=A.N.G.E.R=-
Цитата(okela @ Dec 6 2006, 14:29) *
А в принципе, IMHO, такой способ проверки (с симулятором AVRStudio) не есть корректный.
Регистр UDR физически состоит из двух регистров на одном адресе : один на запись (Тх) , а другой на чтение (Rx) . И ваша запись в UDR соответствует попытке отправить байта на передачу.
А в регистре приема информация появится только посля физического приема данных по линии RxD.

Эт все так, вот только как на уровне программной отладки проверить работоспособность приема?
Буду мичить протеус, может так получится.

Всем, откликнувшимся, огромное спасибо за ответы и поддержку!
okela
Цитата(-=A.N.G.E.R=- @ Dec 6 2006, 16:48) *
Цитата(okela @ Dec 6 2006, 14:29) *

А в принципе, IMHO, такой способ проверки (с симулятором AVRStudio) не есть корректный.
Регистр UDR физически состоит из двух регистров на одном адресе : один на запись (Тх) , а другой на чтение (Rx) . И ваша запись в UDR соответствует попытке отправить байта на передачу.
А в регистре приема информация появится только посля физического приема данных по линии RxD.

Эт все так, вот только как на уровне программной отладки проверить работоспособность приема?
Буду мичить протеус, может так получится.

Всем, откликнувшимся, огромное спасибо за ответы и поддержку!


Получится без проблем , сам не раз пробовал...
chief_olimp
попробуйте использовать ASM вставку если так не получается. У меня на асме все работает
prottoss
Цитата(-=A.N.G.E.R=- @ Dec 6 2006, 19:48) *
Всем, откликнувшимся, огромное спасибо за ответы и поддержку!
Зачем терять время, и изобретать то, что уже изобретено?

Здесь http://electronix.ru/forum/index.php?showtopic=10934 есть готовый драйвер USART (мой) на Си, пользуйтесь... Или по крайней мере поймете, как все работает
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.