|
Глюки watchdoga в меге 2560, а можетбыть и не watchdoga %| |
|
|
|
Feb 20 2008, 08:04
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 28-04-05
Пользователь №: 4 592

|
Здарасьте всем! Такая проблема - делаю проектик на меге 2560, шла без нареканий пока не понадобилось организовать програмный сброс - просто перестаю обнулять watchdog. Резет-то происходит но только мега остается в зарезеченом состоянии.... приэтом сброс от программатора не помогает, ещё интересно что в этом состоянии можно перепрошить - но после прошивки остаётся в такомже состоянии %| .... помогает только снятие питания и перезапуск...
Сразу попробовал тестовую прогу - по сути только запуск вотчдога и дрыганье ногой в бесконечном цикле - всё тоже самое, сбрасывается и висит...
Много раз проделывал такой фокус с другими контроллерами АВР ( не 2560) - ваще никаких проблем, а тут полдня потерял всё бестолку....
ПОМОЖИТЕ! Что делать, как бороться!?
|
|
|
|
|
 |
Ответов
|
Feb 20 2008, 08:43
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 28-04-05
Пользователь №: 4 592

|
Цитата(Kuzmi4 @ Feb 20 2008, 11:31)  2 superbizzon - как писал недавно тут товарисч - "...к величайшему сожалению телепатов тут нет.."
Желательно было б увидеть код, или его ключевые части для начала... Мда... как раз ирония в том что кода три строчки - int main() { _WDR(); WDTCSR=0x38; WDTCSR=0x28; DDRD|=0x01; while(1) { PORTD^=0x01; } } Даём питание, прошиваем... смотрим осцылом - дрыгает ногой PD1 две секунды.... потом перестаёт.... и всё, пока питалово не выключишь-включишь не начинает .... проходит две секунды опять виснет.
|
|
|
|
|
Feb 20 2008, 14:30
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(superbizzon @ Feb 20 2008, 08:43)  Рисет-то происходит, но только мега остается в зарисеченом состоянии.... приэтом сброс от программатора не помогает, ещё интересно что в этом состоянии можно перепрошить - но после прошивки остаётся в таком же состоянии %| .... помогает только снятие питания и перезапуск... Похоже, у вас таблица векторов прерываний (и адрес сброса в том числе) находится в области загрузчика, и по рисету (неважно ручному или от охранного таймера) вы направляете программу в область загрузчика. Чтобы избежать подобного, перед настройкой вотчдога поставьте две команды MCUCR=0x01; MCUCR=0x00; //вектора прерываний в начале флеша Вся программа примерно такая int main() { _WDR(); MCUCR=0x01; MCUCR=0x00; //вектора прерываний в начале флеша WDTCSR=0x38; WDTCSR=0x28; //системный сброс и период на 4с DDRD|=0x01; while(1) { PORTD^=0x01; } } Должно помочь.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Feb 21 2008, 06:12
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 28-04-05
Пользователь №: 4 592

|
Цитата(=GM= @ Feb 20 2008, 17:30)  Похоже, у вас таблица векторов прерываний (и адрес сброса в том числе) находится в области загрузчика, и по рисету (неважно ручному или от охранного таймера) вы направляете программу в область загрузчика. Чтобы избежать подобного, перед настройкой вотчдога поставьте две команды MCUCR=0x01; MCUCR=0x00; //вектора прерываний в начале флеша
Вся программа примерно такая int main() { _WDR(); MCUCR=0x01; MCUCR=0x00; //вектора прерываний в начале флеша WDTCSR=0x38; WDTCSR=0x28; //системный сброс и период на 4с DDRD|=0x01; while(1) { PORTD^=0x01; } }
Должно помочь. 2VladimirYU - не спасло  ... ничего не изменилось 2 =GM= Тоесть - в пррограмме после включения какимто образом выставляется начальный адрес при резете на зону загрузчика.... потом я подаю внешний резет, контроллер сбрасывается, но попадает опятьже в зону загрузчика......Видимо да... очень похоже что связано с чемто таким... только не совсем понятно как и когда прописывается что он должен перезагружаться в загрузчик... пробывал вчера так - int main() { _WDR(); WDTCSR=0x38; WDTCSR=0x28; //системный сброс и период на 4с MCUCR=0x00; DDRD|=0x01; while(1) { PORTD^=0x01; } } Тоесть не - MCUCR=0x01; MCUCR=0x00; а просто MCUCR=0x00; - не помогло.... Но обязательно вечером попробую Ваш вариант, спасибо!
|
|
|
|
|
Feb 21 2008, 11:26
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(superbizzon @ Feb 21 2008, 06:12)  2 =GM= Тоесть не - MCUCR=0x01; MCUCR=0x00; а просто MCUCR=0x00; - не помогло.... Но обязательно вечером попробую Ваш вариант, спасибо!  Просто MCUCR=0x00 не поможет, поскольку бит <1>, который отвечает за положение веторов прерывания, защищён от прямой записи. Поэтому сначала надо выставить бит <0> в единицу, а потом в течение 4 тактов сбросить бит <1>. Читайте дейташит, там всё подробно расписано.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Feb 26 2008, 07:07
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 28-04-05
Пользователь №: 4 592

|
Цитата(=GM= @ Feb 21 2008, 14:26)  Просто MCUCR=0x00 не поможет, поскольку бит <1>, который отвечает за положение веторов прерывания, защищён от прямой записи. Поэтому сначала надо выставить бит <0> в единицу, а потом в течение 4 тактов сбросить бит <1>. Читайте дейташит, там всё подробно расписано. ДА, всё правильно... попробывал так,но не спасает  Перерыл datashIt вдоль и поперек... всё должно работать, но не работает..... Запустил в Astudiю ассемблерный файл - и вот что получается : После загрузки - стоит на нулевом адресе, где сидит команда на прыжок на адрес начала программы (0х00083)... она прыгает.... там проходит seg_init и ещё какието initы.... далее переходит к моим командам...... жду - происходит сброс.... программа возвращается на нулевой адрес, откуда прыгает опятьже на (0х00083) и вязнет в initaх.... тоесть вектора сброса тут не причём абсолютно.... это пакостит IAR.... пытался отключить вставку этих самых initoв - пока не нашел как.... Добавлю - вот что наковырял по теме - http://electronix.ru/forum/index.php?showt...mp;#entry358180видимо должно помочь..
Сообщение отредактировал superbizzon - Feb 26 2008, 07:18
|
|
|
|
|
Feb 26 2008, 08:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(superbizzon @ Feb 26 2008, 09:07)  и вязнет в initaх.... Вот это смущает. Поставьте точку останова на вектор сброса и посмотрите - происходит ли повторный сброс собаки. Если да - то Цитата(superbizzon @ Feb 26 2008, 09:07)  как раз ваш случай, но непонятно - что же может ИАР в стартапе вашей программе из нескольких строчек делать столько времени? Ведь если нет глобальных переменных, то обнулять и копировать нечего, а больше там ничего и не делается.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
superbizzon Глюки watchdoga в меге 2560 Feb 20 2008, 08:04  VladimirYU Цитата(superbizzon @ Feb 20 2008, 11:43) ... Feb 20 2008, 09:03   superbizzon Цитата(VladimirYU @ Feb 20 2008, 12:03) П... Feb 20 2008, 09:12    VladimirYU Цитата(superbizzon @ Feb 20 2008, 12:12) ... Feb 20 2008, 09:50     superbizzon Цитата(VladimirYU @ Feb 20 2008, 12:50) Д... Feb 20 2008, 10:18      VladimirYU Цитата(superbizzon @ Feb 20 2008, 13:18) ... Feb 20 2008, 11:39       superbizzon Цитата(VladimirYU @ Feb 20 2008, 14:39) И... Feb 20 2008, 11:50    VladimirYU Цитата(superbizzon @ Feb 21 2008, 09:12) ... Feb 21 2008, 06:52 xelax Как проблема то разрешилась?
Получил точно такую ... May 21 2008, 05:49 mdmitry Я ничего подобного не наблюдал. Может от ревизии к... May 21 2008, 12:06 xelax Если кому интересно, то разобрал проблему.
Всё ... May 26 2008, 12:04 no_d@t@ Столкнулся с точно такой же проблемой в Меге2560 п... May 27 2008, 08:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|