|
отладка UART |
|
|
|
Dec 5 2006, 11:19
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Нужна помощь! Не могу отладить кусок проги для AT90S8515 по работе с UART Пишу на C в AtmanAVR Суть: МК должен принимать по UART код и сравнивать его со списком кодов, при совпадении с кодом из списка выполнять соотв. коду действия. Что делаю: в пошаговом режиме симуляции (пробовал и AtmanAVR и AVRStudio) после перехода в режим ожидания кода от UART руками загоняю нужный код в UDR, ставлю флаг RXC - происходит прерывание, в обработчике читаю UDR в переменную Вижу: флаг RXC сбрасывается, что говорит об успешном чтении, однако, переменная, в которую считываю UDR ,что бы в ней не было, сбрасывается в 0х00. Вся голову сломал, что может быть?
|
|
|
|
|
Dec 5 2006, 12:07
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Цитата Объявлена правильно? да, конечно же, что я только не пробовал и extern, и volatile и просто char , int все одно - сбрасывается в ноли при чтении UDR - такое ощущение, что руками позволено менять только UDR на передачу, что у меня и происходит, а как чтение смоделировать - ума не приложу... Цитата(kamedi_clab @ Dec 5 2006, 11:48)  используйте VMLAB или PROTEUS - это настоящие симуляторы а не обрубки. например vmlab на .nm.ru пробовал я VMLAB, мельком правда, сложен он в настройке и не все работает, в частности, моя прога там не сработала - похоже, не те данные передает, что я задаю, либо не въехал, как их гнать а вот PROTEUS никак не могу найти для скачивания - только форумы и отзывы, буду примного благодарен за ссылку на сей продукт
Сообщение отредактировал -=A.N.G.E.R=- - Dec 5 2006, 12:13
|
|
|
|
|
Dec 5 2006, 12:16
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
У меня при отладке в AVR studio UDR сбрасывается в 0 после выполнения любой инструкции. Так что заношу туда значение непосредственно перед считыванием UDR.
|
|
|
|
|
Dec 5 2006, 12:19
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Цитата(ahulap @ Dec 5 2006, 12:16)  У меня при отладке в AVR studio UDR сбрасывается в 0 после выполнения любой инструкции. Так что заношу туда значение непосредственно перед считыванием UDR. пробовал и это, сбрасывается в ноль в момент любой операции и в переменную сохраняется 0
|
|
|
|
|
Dec 5 2006, 12:20
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(-=A.N.G.E.R=- @ Dec 5 2006, 12:07)  Цитата Объявлена правильно?
да, конечно же, что я только не пробовал и extern, и volatile и просто char , int все одно - сбрасывается в ноли при чтении UDR - такое ощущение, что руками позволено менять только UDR на передачу, что у меня и происходит, а как чтение смоделировать - ума не приложу... Где объявлена? Внутри - снаружи прерывания? Если внутри, static пробовали? В какой момент сбрасывается? Стек не затирает?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Dec 5 2006, 12:34
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Цитата(Dog Pawlowa @ Dec 5 2006, 12:20)  Где объявлена? Внутри - снаружи прерывания? Если внутри, static пробовали? В какой момент сбрасывается? Стек не затирает? объявление делал в начале файла работы с UART - особенность Atmanavr в том, что она делает несколько файлов для каждого периферийного у-ва делал и statik, все равно происходит сброс переменной в момент сохранения в нее UDR
|
|
|
|
|
Dec 6 2006, 09:10
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 1-02-06
Пользователь №: 13 867

|
При входе в прерывание по приему данных при отладке UDR вроде обнуляется - поэтому при отладке нужно заносить в него данные уже после входа в прерывание. И еще если будет что нибудь вроде:
if UDR=='a' //вот здесь UDR уже обнулится { mydata[asd]=UDR; //будут нули ... } else if ...
Нужно: _TmpChar=UDR; if _TmpChar=='a' { mydata[asd]=_TmpChar; ... } else if ...
Сообщение отредактировал MichaelU - Dec 6 2006, 09:13
|
|
|
|
|
Dec 6 2006, 12:04
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Цитата(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.
|
|
|
|
|
Dec 6 2006, 13:55
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896

|
Цитата(-=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
|
|
|
|
|
Dec 6 2006, 15:48
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Цитата(okela @ Dec 6 2006, 14:29)  А в принципе, IMHO, такой способ проверки (с симулятором AVRStudio) не есть корректный. Регистр UDR физически состоит из двух регистров на одном адресе : один на запись (Тх) , а другой на чтение (Rx) . И ваша запись в UDR соответствует попытке отправить байта на передачу. А в регистре приема информация появится только посля физического приема данных по линии RxD. Эт все так, вот только как на уровне программной отладки проверить работоспособность приема? Буду мичить протеус, может так получится. Всем, откликнувшимся, огромное спасибо за ответы и поддержку!
|
|
|
|
|
Dec 6 2006, 16:01
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896

|
Цитата(-=A.N.G.E.R=- @ Dec 6 2006, 16:48)  Цитата(okela @ Dec 6 2006, 14:29)  А в принципе, IMHO, такой способ проверки (с симулятором AVRStudio) не есть корректный. Регистр UDR физически состоит из двух регистров на одном адресе : один на запись (Тх) , а другой на чтение (Rx) . И ваша запись в UDR соответствует попытке отправить байта на передачу. А в регистре приема информация появится только посля физического приема данных по линии RxD.
Эт все так, вот только как на уровне программной отладки проверить работоспособность приема? Буду мичить протеус, может так получится. Всем, откликнувшимся, огромное спасибо за ответы и поддержку! Получится без проблем , сам не раз пробовал...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|