реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Странное поведение ATmega 16L
kanzler
сообщение Jul 18 2007, 02:39
Сообщение #1


Местный
***

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



Сталкиваюсь первый раз с таким поведением процессора. Применяю в проекте ATmega 16L.
При отладке программы, с применением JTAG, обнаружил что программа всегда в одном и том же месте уходит в сброс. Это стало проявляться когда к программе присоединил программный модуль, без этого модуля программа работает нормально. Пробовал различные способы устранения данной проблемы не помогает. В ATmega 16 таких проблем у меня не возникало ни когда. Кто сталкивался с такой проблемой? Посоветуйте как избавиться от этого.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Jul 18 2007, 04:54
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Уточните, сброс - это именно сброс, или просто попадание программного счетчика на вектор сброса? И что, та же прога при тех же условиях нормально пашет с Мегой16, а с Мегой16L не хтит?
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Jul 18 2007, 06:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(kanzler @ Jul 18 2007, 05:39) *
Это стало проявляться когда к программе присоединил программный модуль, без этого модуля программа работает нормально.


А этот модуль к портам доступ имеет ? Может с питанием что то происходит ? У меня были подвисания отладки и уход на конец области памяти....
Можно еще предположить стек, но тогда обычно просто зависает. но посмотреть стоит.
Go to the top of the page
 
+Quote Post
NVade
сообщение Jul 18 2007, 07:44
Сообщение #4


Участник
*

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



Уточняющий вопрос - насколько все одинаково в проектах на M16 и M16L: частота кварца (кстати, какая?), настройки компилятора, установки BOD.
У меня есть 2 предположения по симптоматике - сброс по сторожевому таймеру или переполнение стека.
Go to the top of the page
 
+Quote Post
vesago
сообщение Jul 18 2007, 09:51
Сообщение #5


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



9 против 10 просаживается стек. Допустим в каком цикле криво проинициализирован счетчик. 1 - касяк со сторожевым таймером. m16 и m16l в принципе из одной бочки розлиты.
Go to the top of the page
 
+Quote Post
alux
сообщение Jul 18 2007, 14:15
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(kanzler @ Jul 18 2007, 05:39) *
Это стало проявляться когда к программе присоединил программный модуль, без этого модуля программа работает нормально.

У меня сегодня точно такая же проблема была, только с Мегой32L . При подключении вызова функции контроллер перезапускался. Правда проверял не JTAG ом, а просто дергаю ногами в разных местах программы. Т.е. программа зацикливается от начала до дергания ногой. Как выяснилось, в проблемной функции был проинициализирован большой массив [1064] в ОЗУ, что очевидно привело к переполнению стека.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 18 2007, 15:00
Сообщение #7


кекс
******

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



Цитата
Странное поведение ATmega 16L

Господа, чтобы помощь была эффективной, а поведение МК не казалось странным.
1. Внимательно смотрим в исходник.
2. Если не понимаем почему код приводит к "странному" поведению МК - то исходник (в данном случае - присоединяемый модуль) выкладываем сюда.

Цитата
Кто сталкивался с такой проблемой? Посоветуйте как избавиться от этого.

Видать каждый на этом форуме может ответить что сталкивался. А чтобы избавиться посоветовать протереть пыль и постучать в бубен. Еще можно посоветовать - отсоединить модуль.
Go to the top of the page
 
+Quote Post
kanzler
сообщение Jul 18 2007, 17:53
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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)
Прикрепленные файлы
Прикрепленный файл  Soft_Comm.zip ( 4.7 килобайт ) Кол-во скачиваний: 39
 
Go to the top of the page
 
+Quote Post
kanzler
сообщение Jul 20 2007, 18:48
Сообщение #9


Местный
***

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



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


Молчание ягнять часть номер 5. Нафига было отправлять исходник, распинаться и кланяться?
Ясно одно - ни кто помочь не может ... пиво пьют, но только не "Клинское".

А то что отсоеденить модуль, то это я исам знаю, писалось в самом начале.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 20 2007, 19:31
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 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), попробую под отладкой.
Go to the top of the page
 
+Quote Post
kanzler
сообщение Jul 21 2007, 02:48
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 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

В прилогаемом файле то что вы просили.
Прикрепленные файлы
Прикрепленный файл  Soft_Comm.zip ( 5.83 килобайт ) Кол-во скачиваний: 30
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2007, 11:58
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 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 после сбоя.
Go to the top of the page
 
+Quote Post
kanzler
сообщение Jul 22 2007, 15:17
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 21:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016