Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.04.2008, 15:39
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
Вопрос по 16F877A
Господа. Прошу Вашей помощи. Сделал девайс на PIC 16F877А. Программа используетс в общей сложности не более 30% ресурсов процессора. Но при работе данный девайс зависает через различные промежутки времени 10 -30 минут. Подключение ICD2 помогло установить место где стопроится программа- она скачет между 3-мя командами RETURN - RETURN - RETFIE и обратно. Кто сталкивался с подобным подскажите -это указывает на переполнение стека или может какой еще баг возможен?
|
|
|
|
29.04.2008, 15:41
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
Вроде нашел проблему. Обработчик прерывания не сбрасывал GIE и похоже оно забивало стек адресам возврата...
|
|
|
|
29.04.2008, 17:39
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
похоже проблема не ушла....Не до конца ясно что происходит. команда очистить бит GIE есть, она выполняется, но в watch - окне бит не меняется.
мало того, таймер ТМР0 считает после каждого такта и увеличивает значение на разную величину....
сброс битов в INTCON не всегда происходит... Хотя по шагам команда формально выполняется
Может контроллер глюкавый? или ICD2 или MPLAB?
|
|
|
|
29.04.2008, 18:31
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Без исходника тебе никто не поможет.
|
|
|
|
29.04.2008, 18:48
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
A gie чистить зачем ??? При возникновении прерывания он автоматом сбрасывается в 0, затем через retfie возвращается обратно...
контекст сохранили ?
|
|
|
|
29.04.2008, 18:57
|
|
Прохожий
Регистрация: 28.06.2006
Сообщений: 9
Сказал спасибо: 36
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Может АН576 поможет
Прикрепленный файл: 7643426.pdf
|
|
|
|
29.04.2008, 21:28
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
Спасибо за ответы. Буду пробовать разбираться. С исходником напрягать не хочется. все- таки более 2-х кило ассеблера, скомпилированного из басика. Вкратце ситуация вырисовалась такая. Программа прерывания вызывает подпрограмму 1, по ее RETURN следом вызывается подпрограмма восстановления контекста (это басик ее откомпилил как подпрограмму, хот можно было и просто восстанавливать)-по ее RETURN идет выход на выход RETFIE . Вот между этими-то метками и мечется курсор MPLAB IDE после зависания), иногда игнорируя промежуточные команды, иногда нет....
Для меня пока кажется странным отображение регистров в MPLAB при работе с ICD2. Вызывают опасение следующие странности: если в пошаговом режиме курсор проходит команду bcf intcon,tmr0 в окне watch этот бит не сбрасывается!!!!, так-же остается стоять бит GIE! хотя формально процессор в мечется в обработке прерывания.
С каждым шагом ТМR0, увеличивается не на 1 а, на 25, 75, 45 (в общем любое случайное число). Если -бы раньше не пользовался ICD2, то наверное подумал, что не так что-то делаю...Поменял версию 7.64 на 8.10, но ничего не поменялось - та-же шняга. Единственное что остается проверить - сам ПИК (его перешивали уже раз 100), но это-же никак не должно влиять...
|
|
|
|
29.04.2008, 22:37
|
|
Прописка
Регистрация: 15.03.2008
Сообщений: 115
Сказал спасибо: 29
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Похожую замуту как-то наблюдал. Возможно нет начальной инициализации какого-нибудь регистра SFR. Кстати уровень вложенности подпрограмм не более 8. Не превышаешь? Да, и ты писал что-то про Бейсик, может компилятор некорректно местами работает. 16f877 не такая сложная штука, по моему лет 10.выпускается. Их, конечно, на.асме надо программировать.
|
|
|
|
30.04.2008, 12:54
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
|
|
|
|
30.04.2008, 13:34
|
|
Прописка
Регистрация: 22.08.2006
Сообщений: 168
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 11 сообщении(ях)
|
Похоже нашел бяку в программе. Подпрограмма клавиатуры вызывалась по прерыванию TMR0 и в целях экономии написана на асме. Возврат значения идет через RETLW. Но компилятор требует установки родного
REturn. Формально он не должен был влиять никак (до него подпрограмма просто не доходила)..Но видно она как-то изредка проходила через команду RETLW (хотя выхода из подпрограммы не происходило) и выходила на return - из стека при этом почему-то выпихивало оба значения возврата и программа вылетала совсем не туда..
стек не переполнялся, а наоборот опустошался... и усе - оставались работать только команды RETURN
Получается RETLW не всегда корректно работает что-ли?
в программах табличной конвертации почему-то таких засад не происходит....
В общем заменил RETLW на movlw 0xXX и GOTO exit и вот уже больше часа работает без сбоев....
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:56.
|
|