|
|
  |
Странное поведение ATmega 16L |
|
|
|
Jul 18 2007, 06:28
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(kanzler @ Jul 18 2007, 05:39)  Это стало проявляться когда к программе присоединил программный модуль, без этого модуля программа работает нормально. А этот модуль к портам доступ имеет ? Может с питанием что то происходит ? У меня были подвисания отладки и уход на конец области памяти.... Можно еще предположить стек, но тогда обычно просто зависает. но посмотреть стоит.
|
|
|
|
|
Jul 18 2007, 07:44
|
Участник

Группа: Свой
Сообщений: 71
Регистрация: 7-07-06
Из: Новосибирск
Пользователь №: 18 652

|
Уточняющий вопрос - насколько все одинаково в проектах на M16 и M16L: частота кварца (кстати, какая?), настройки компилятора, установки BOD. У меня есть 2 предположения по симптоматике - сброс по сторожевому таймеру или переполнение стека.
|
|
|
|
|
Jul 18 2007, 15:00
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата Странное поведение ATmega 16L Господа, чтобы помощь была эффективной, а поведение МК не казалось странным. 1. Внимательно смотрим в исходник. 2. Если не понимаем почему код приводит к "странному" поведению МК - то исходник (в данном случае - присоединяемый модуль) выкладываем сюда. Цитата Кто сталкивался с такой проблемой? Посоветуйте как избавиться от этого. Видать каждый на этом форуме может ответить что сталкивался. А чтобы избавиться посоветовать протереть пыль и постучать в бубен. Еще можно посоветовать - отсоединить модуль.
|
|
|
|
|
Jul 18 2007, 17:53
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
WDT срабатывает вряд ли, так как я его не включаю. Переполнение стека - вполне возможно, но дело в том что у меня переменных огромных размеров нет. Ну а код, то могу предоставить полный проект, он не большой. Подключаемый модуль, это обработка двух кнопок (hardScanKey и keyboard). Если в файле hard.c в обработчике прерывания таймера 2 закомментировать строку systemFlag.KEYSCAN_FLAG = 1; и в основном цикле сделать условие if(systemFlag.TIMER0_FLAG), то сброс пропадает и программа работает нормально. Плюс я обнаружил в каком месте программы происходит сброс. Это - if(channelDetect[3]) { countOnChannel[3]++; countOnChannel[0] = 0; countOnChannel[1] = 0; countOnChannel[2] = 0; if(countOnChannel[3] == 50) { hardLedsIndication(RED_LIGHT, RED_LIGHT, RED_LIGHT, GREEN_LIGHT); countOnChannel[3] = 0; } } файла hard.c функции void hardShowChannel(void)
|
|
|
|
|
Jul 20 2007, 18:48
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(defunct @ Jul 18 2007, 21:00)  Господа, чтобы помощь была эффективной, а поведение МК не казалось странным. 1. Внимательно смотрим в исходник. 2. Если не понимаем почему код приводит к "странному" поведению МК - то исходник (в данном случае - присоединяемый модуль) выкладываем сюда. Видать каждый на этом форуме может ответить что сталкивался. А чтобы избавиться посоветовать протереть пыль и постучать в бубен. Еще можно посоветовать - отсоединить модуль. Молчание ягнять часть номер 5. Нафига было отправлять исходник, распинаться и кланяться? Ясно одно - ни кто помочь не может ... пиво пьют, но только не "Клинское". А то что отсоеденить модуль, то это я исам знаю, писалось в самом начале.
|
|
|
|
|
Jul 20 2007, 19:31
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(kanzler @ Jul 20 2007, 21:48)  Молчание ягнять часть номер 5. Только сейчас появилась возможность детально посмотреть код. Код названной вами функции сильно перегружен индексными операциями. Ответьте на пару вопросов: 1. if(systemFlag.DETECT_FULL_FLAG) { hardShowChannel(); systemFlag.DETECT_FULL_FLAG = 0; } если закоментировать hardShowChannel(); в этом месте, то проблема исчезает. Верно? 2. Чему равен CSTACK? 3. Чему равен RSTACK? Функция hardShowChannel() - в вашей программе ведь ничего не делает. ChanCounters (все) всегда == 0, т.о. никакой активности на портах нет. Проблема явно не с питанием, и явно не с M16L. Программа должна одинаково сбоить и на m16 и на m16L. Если есть возможность, бросте мне файлы проекта (*.ewp/ewd), попробую под отладкой.
|
|
|
|
|
Jul 21 2007, 02:48
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(defunct @ Jul 21 2007, 01:31)  Только сейчас появилась возможность детально посмотреть код. Код названной вами функции сильно перегружен индексными операциями.
Ответьте на пару вопросов: 1. if(systemFlag.DETECT_FULL_FLAG) { hardShowChannel(); systemFlag.DETECT_FULL_FLAG = 0; } если закоментировать hardShowChannel(); в этом месте, то проблема исчезает. Верно? 2. Чему равен CSTACK? 3. Чему равен RSTACK? Функция hardShowChannel() - в вашей программе ведь ничего не делает. ChanCounters (все) всегда == 0, т.о. никакой активности на портах нет. Проблема явно не с питанием, и явно не с M16L. Программа должна одинаково сбоить и на m16 и на m16L. Если есть возможность, бросте мне файлы проекта (*.ewp/ewd), попробую под отладкой. Хммм ... у меня есть проект где этих индексных операций больше чем в данном проекте, но тем не менее проект работает замечательно. 1. Нет, как раз этот модуль я не выключаю, а вот выключив: #pragma vector=TIMER2_OVF_vect __interrupt void timer2Handle(void) { //systemFlag.KEYSCAN_FLAG = 1; } И сделав условие в главном цикле: if(systemFlag.TIMER0_FLAG) вместо if((systemFlag.TIMER0_FLAG) && (modeWork == 2)) таким образом работает только автоматический режим и программа работает без сбоев. п.2 так и п.3 ответить не могу так как значения посмотреть не могу по причине того что монитор стека в AVR Studio показывает - disabled В прилогаемом файле то что вы просили.
|
|
|
|
|
Jul 21 2007, 11:58
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(kanzler @ Jul 21 2007, 05:48)  1. Нет, как раз этот модуль я не выключаю, а вот выключив: __interrupt void timer2Handle(void) Этим отключается сканирование клавиатуры? Цитата И сделав условие в главном цикле: if(systemFlag.TIMER0_FLAG) вместо if((systemFlag.TIMER0_FLAG) && (modeWork == 2)) не совсем понимаю это ваше условие. modeWork устанавливается в 2 два при нажатии какой-то кнопки. Какой кнопки? Цитата таким образом работает только автоматический режим и программа работает без сбоев. Изъясняйтесь проще ;> Мне не ведомо, что означает у вас автоматический режим, а что не автоматический. Опишите как можно более подробно условия сбоя, например так: Нажимаю кнопку которая коротит PINX с землей, по этой кнопке устанавливается флажек modeWork в 2. После очередного переполения таймера T0 этот флаг проверяется, вызывается функция hardShowChannel(); в которой происходит прыжек в начало программы. Цитата В прилагаемом файле то что вы просили. Вы пользуете только ewd сборку, и код приведенный в предыдущем посте точно сбоит? Под отладкой погонял - но ничего не перезагружается. Видать не выполняются какие-то условия. Подправьте код main() сл. образом: Код { resetB = MCUCSR; MCUCSR = 0; // CLEAR OLD RESET FLAGS и посмотрите чему равен resetB после сбоя.
|
|
|
|
|
Jul 22 2007, 15:17
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(defunct @ Jul 21 2007, 17:58)  Этим отключается сканирование клавиатуры? Да, отключается клавиатура. Цитата(defunct @ Jul 21 2007, 17:58)  не совсем понимаю это ваше условие. modeWork устанавливается в 2 два при нажатии какой-то кнопки. Какой кнопки? Нажимаю кнопку которая коротит PINB2 с землей, по этой кнопке устанавливается флажек modeWork в 2. Цитата(defunct @ Jul 21 2007, 17:58)  2. После очередного переполения таймера T0 этот флаг проверяется, вызывается функция hardShowChannel(); в которой происходит прыжек в начало программы. Вы пользуете только ewd сборку, и код приведенный в предыдущем посте точно сбоит? Да имменно так и происходит и код сбоит. Правда я не совсем понял что есть ewd сборка? Цитата(defunct @ Jul 21 2007, 17:58)  Под отладкой погонял - но ничего не перезагружается. Видать не выполняются какие-то условия. Подправьте код main() сл. образом: Код { resetB = MCUCSR; MCUCSR = 0; // CLEAR OLD RESET FLAGS и посмотрите чему равен resetB после сбоя. Хорошо попробую. После сбоя содержимое регистра MCUCSR = 0x00.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|