Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с mega88
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Stanislav_S
Возникла такая проблема. Вотчдог выключен WDTON=1, WDTCSR = 0; Пауэр контроллер тоже 0. В программе вставляю задержку __delay_cycles(1000); ( кварц 20 МГц), мега периодически сбрасывается в чем может быть проблема? Чтение даташита ситуацию пока не проясняет.
jasper
Возможно, программный глюк – программа улетает не туда.
Какой компилятор? Включена ли оптимизация?
Stanislav_S
Цитата(jasper @ Feb 6 2008, 00:42) *
Возможно, программный глюк – программа улетает не туда.
Какой компилятор? Включена ли оптимизация?

Компилятор IAR 3.20C оптимизация выключена.
prottoss
Цитата(Stanislav_S @ Feb 6 2008, 02:35) *
Возникла такая проблема. Вотчдог выключен WDTON=1, WDTCSR = 0; Пауэр контроллер тоже 0. В программе вставляю задержку __delay_cycles(1000); ( кварц 20 МГц), мега периодически сбрасывается в чем может быть проблема? Чтение даташита ситуацию пока не проясняет.


Table 25. Watchdog Timer Configuration
WDTON_WDE_WDIE_Mode______________Action on Time-out
0_______0____0_____Stopped____________None
0_______0____1_____Interrupt Mode_______Interrupt
0_______1____0_____System Reset Mode__Reset
0_______1____1_____Int. and Sys.Reset___ Interrupt, then go to System Reset Mode
1_______x____x_____ System Reset Mode_ Reset



У Вас получается самый последний режим - то бишь периодический сброс
Stanislav_S
Цитата(prottoss @ Feb 6 2008, 01:00) *
Table 25. Watchdog Timer Configuration
WDTON_WDE_WDIE_Mode______________Action on Time-out
0_______0____0_____Stopped____________None
0_______0____1_____Interrupt Mode_______Interrupt
0_______1____0_____System Reset Mode__Reset
0_______1____1_____Int. and Sys.Reset___ Interrupt, then go to System Reset Mode
1_______x____x_____ System Reset Mode_ Reset



У Вас получается самый последний режим - то бишь периодический сброс

(1)
WDTON WDE WDIE Mode Action on Time-out
1 0 0 Stopped None
1 0 1 Interrupt Mode Interrupt
1 1 0 System Reset Mode Reset Interrupt and System Reset Interrupt, then go to System
1 1 1 Mode Reset Mode
0 x x System Reset Mode Reset
ote: 1. WDTON Fuse set to “0“ means programmed and “1“ means unprogrammed.
У меня так написано получается режим стоп.
prottoss
Цитата(Stanislav_S @ Feb 6 2008, 03:13) *
Не знаю... Сам я М88 не пользовал - просто заглянул в даташит - диск argussoft за декабрь 2007 года. Вообще про Атмел можно иногда применить пословицу - "На заборе слово нехорошее написано, а там дрова лежат".

Думаю, Вам стоит попробовать и прояснить ситуацию. Заодно и публика знать будет, где собака порылась smile.gif
Stanislav_S
Цитата(prottoss @ Feb 6 2008, 01:21) *
Не знаю... Сам я М88 не пользовал - просто заглянул в даташит - диск argussoft за декабрь 2007 года. Вообще про Атмел можно иногда применить пословицу - "На заборе слово нехорошее написано, а там дрова лежат".

Думаю, Вам стоит попробовать и прояснить ситуацию. Заодно и публика знать будет, где собака порылась smile.gif

Насчет документации согласен, есть такое smile.gif Ладно спасибо, завтра вечером продолжу.....
defunct
MCUSR - покажет причину сброса.

добавьте этот код или подобный себе в main:

Код
main()
{
    unsigned char tmp = MCUSR; // store system reset source flags
    MCUSR = 0x00; // clear the sys reset source
    printf("MCUSR_%x\r\n", tmp);
  
}


Если в MCUSR будет 0 - тогда сброса не было и имеет место программный сбой (прыжек по адресу 0).
jasper
Цитата(Stanislav_S @ Feb 6 2008, 00:54) *
Компилятор IAR 3.20C оптимизация выключена.

Ну, тогда не знаю. laughing.gif
Я с проблемами задержек и отимизацией на WinAVR нарывался.
oran-be
Может быть где нить далее разрешается сброс по ватчдогу? Попробуйте запрещать собаку непосредственно перед задержкой, либо запретите вообще фузом весь таймер (что особо может ничего не дать, поскольку потом, если уже есть прецедент, то и его можно разрешить).
vesago
Если вы используете вачдог, убедитесь в правильной инициализации. Пример на 2 секунды.
Код
void Watchdog_Init(void)
{
  __watchdog_reset();
  WDTCSR = (1<<WDCE)|(1<<WDE);
  WDTCSR = (1<<WDP0)|(1<<WDP1)|(1<<WDP2)|(1<<WDE);
}


Если не используете вообще, значит что-то одно - или фуз постоянного включения вачдога включили или стек проседает.
Stanislav_S
Всем спасибо, сегодня вечером буду разбираться. Собаку так и инициализировал на 2 сек, все таки думаю проблема с программой, что то куда то улетает, буду смотреть причины сброса. Кстати стек сразу поставил 0х100, что бы вопросов не было, printf не использую smile.gif
vesago
Типичная причина проседания стека - непроинициализированная переменная цикла, в котором что нибудь делается по указателю или с массивами.
Stanislav_S
Цитата(vesago @ Feb 6 2008, 14:12) *
Типичная причина проседания стека - непроинициализированная переменная цикла, в котором что нибудь делается по указателю или с массивами.

Нет там все проще, просто программная реализация SPI, обычное махание ножкой и считывание данных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.