Обсуждаем контроллеры компании Atmel.
Ответить

ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 16:43:57

Первый раз пытаюсь применить такую "жирную" микросхему, однако засада...

Код сгенерирован автоматически, пытаюсь проверить как сработает Watchdog.
Для этого закомментировал строчку // #asm("wdr")
и ничего ((((( , ранее это на меге 8 работало. .....
Подскажите что для этого МК нужно делать чтобы работал Watchdog

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 17:47:10

На вид все верно, должен раз в 2 секунды перезагружаться. Вы код в симуляторе запускаете?

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 18:24:18

Да в протеусе, опыта симулирования не много но до этого времени протеус не подводил не думаю что в нем проблема...

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 18:41:41

Я в протеусе не работал никогда, но может вы просто тех двух секунд не дожидаетесь? Я не знаю с какой скоростью протеусовский симулятор работает. Попробуйте заменить WDTCR=0x0F; на WDTCR=0x08;. Это должно уменьшить интервал примерно до 20 мс.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 20:16:03

Да уж прот сильно медленно воспроизводит все. Там внизу слева строка нужно по ней ориентироваться сколько в реальном времени что занимает.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Пн май 06, 2013 21:40:39

Да нет симуляция загрузка 67% время реальное без разницы WDTCR=0x0F; или WDTCR=0x08; не перегружается и все.
Тут еще такое дело CodeVisionAVR V2.05.3 с "просторов интернета" может это что то значит?
Вложения
Exe.rar
Проект в протеусе
(13.46 KiB) Скачиваний: 234

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 09:27:14

И не дождетесь...

void delay_ms(unsigned int n)

generates a delay of n milliseconds.
This function automatically resets the watchdog timer every 1ms by generating the wdr instruction.


Надо оставить пустой while(1);

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 13:33:02

uk8amk это понятно что не дождусь, тем более как я писал для сборки проекта пользуюсь автоматической генерацией проекта, не могу соблюсти формальности использования функций, пользуюсь только результатом , типа как в пословице "или шашечки или ехать"...
как это оставить пустым while(1); в смысле код там не писать, так смысл тогда этой программы....

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 13:47:30

не используйте библиотечную функцию delay_
напишите свою функцию задержки, если есть в ней необходимость.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 14:00:35

Смысл собачьего таймера не в том, чтобы он всегда срабатывал, а только когда Мк завис.
Так что можно не заморачиваться насчет стандартной задержки. Если есть желание проверить правильность настройки можно и оставить пустым цикл while(1), что и было предложено товарищем uk8amk

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 17:25:33

Извините товарищи, но я вас совсем как-то не пойму:-\.
Если позволите я еще раз попробую объяснить с чем я тут столкнулся...
Сделал проект , по моим меркам "громадный" в нем уже 1950 строк кода.
И он даже прекрасно )) работает в железе, но иногда он имеет такой глюк (раз в 2 а то и 5 дней) у температуры происходит сбой показаний (на ЖКИ отображает -0.1С), МК в это время работает. дальше ВКЛ - ВЫКЛ сетью и все опять нормально....
Так вот, хотел я, по этому событию ( с задержкой по -0.1С) делать reset для МК , подключил для этого watchdog , а тут странность он в моем коде reset для МК не делает никак.
Я вот взял упростил код до минимума ( ясное дело в листинге 2000 строк , никто голову ломать ни будет че там боком стоит...)
так вот упростил код до минимума , и на этом примитиве сброса Мк все равно нет!.
К сообщению приложил этот примитив с исходником и протеусом, комплимируется в CodeVisionAVR V2.05.3 .
Как я уже писал, ранее на меге 8 я делал программно Watchdog, работало , проверял просто закоментировал строчку // #asm("wdr") и видно что все активно , а тут вот никак.....
Вложения
67_W.rar
(107.33 KiB) Скачиваний: 233

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 17:50:49

Скачал Ваш проект
- проходим в директорию и открываем файл list/0x08_mega32A.asm
- нажимаем Ctrl+F
- вводим "wdr" и жмем Enter
находит два места во всем файле:
1) #asm("wdr"), но эта строчка закоментирована
2) в теле функции _delay_ms

- нажимаем опять Ctrl+F
- вводим "_delay_ms", изучаем результаты на возможный вызов функции (ключевые слова "jmp" "rjmp" "call" icall")
- находим строчку "JMP _delay_ms" в теле функции SUBOPT_0x3
- смотрим функцию полностью с целью выяснения ее предназначения
- в самом начале функции строчка "CALL __lcd_write_data"
Вас ни на какую мысль не наводит?

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 18:27:28

Ого, я в такие директории не ходок, мне что CALL _delay_ms , что JMP _delay_ms ,
так что ни на какую мысль не наводит... (могу только сказать что, это там, не я написал:))))

Не знаю, вы что хотите сказать, что каждый кто воспользовался функцией , "вольного" распределения ног для ЖКИ , на Watchdog может не рассчитывать?

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 18:58:26

Все что я написал значит, что при вызове функции __lcd_write_data, вызывается функция _delay_ms, которая содержит в себе команду wdr, которая и сбрасывает сторожевой таймер.
Функцию __lcd_write_data вы вызываете в цикле, поэтому ваш сторожевой таймер никогда не сработает.

Re: ATmega32 не могу сделать Watchdog (для CodeVisionAVR)

Вт май 07, 2013 20:30:50

В коде, где надо сделать резет:
Код:
if( mcu_failure == TRUE ) //глюк?
{
while(1);//ждать сброса
}

Проблемы со сторожевым таймером. Что я делаю неправильно?

Ср сен 11, 2013 12:15:26

Всем привет! ATmega48pa, проблема с работой сторожевого таймера - задолбался я уже с ним. В одной части программы работает, а после прерывания INT1 - уже не пашет. Причем даже если заново его инициализовать. В чем дело то?
Вот упрощенная часть программы:

void main(void)
{
// Crystal Oscillator division factor: 3
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Low level
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x02;
EIFR=0x02;
PCICR=0x00;


LED = 1; delay_ms(25); LED = 0; // когда контроллер спит, строж. таймер работает как надо, тому подтверждение работа этого светодиода (кратковременное моргание раз в 4 секунды)

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/512k
// Watchdog Timer interrupt: Off
#pragma optsize-
#asm("wdr")
WDTCSR=0x38;
WDTCSR=0x28;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Global enable interrupts
#asm("sei")

SMCR = 0b00000101; // Power-down Mode - страница 43 мануала ATmega48
#asm("sleep"); //Вводит контроллер в режим энергосбережения
// Просыпаемся от прерыванием INT1 и сразу на обработчик


while (1)
{
LED = 1; // Вот тут строж. таймер уже не работает - светодиод постоянно светиться
}
}


// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
... // что тут, не важно
}

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 12:37:29

так вроде как сторожевой таймер отключается при входе в спящий режим и после просыпания его надо снова запускать
http://avr.ru/beginer/understand/sleep_mode

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 12:44:52

Power-Down - тут останавливается практически всё, кроме обработки внешних прерываний, интерфейса TWI и сторжевого таймера.
Да и в программе я красным пометил место, где видно что таймер работает из режима сна.

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 14:17:11

Чё-то я требуемой логики не улавливаю.
Моё видение вашей проги:
1 — Разрешаете прерывания
2 — Засыпаете
3 — Сторож ресетит МК, переход к п.1

Re: Проблемы со сторожевым таймером. Что я делаю неправильно

Ср сен 11, 2013 14:29:26

Ну сейчас совсем не об этом. Нужно понять почему таймер не ресетит МК в основном цикле (когда прога находится там).

P.S. Логика этого каркаса-проги такая: МК спит и ждет внешнего прерывания (параллельно работает ст. таймер для индикации этого режима). Когда внеш. прерывание заканчивается прога уходит в основной цикл. И тут то таймер перестает работать - не ресетит МК.
Ответить