WatchDog Timer Сторожевой таймер в AVR
- voin
- Нашел транзистор. Понюхал.
- Сообщения: 184
- Зарегистрирован: Пт ноя 10, 2006 16:50:24
- Откуда: Россия Крым Феодосия
WatchDog Timer Сторожевой таймер в AVR
WatchDog Timer - что это?
Обьясните что это такое как можно проще.
(использую tini13, и прогу AlgorithmBuilder)
Обьясните что это такое как можно проще.
(использую tini13, и прогу AlgorithmBuilder)
Последний раз редактировалось Gudd-Head Пт фев 07, 2014 13:41:14, всего редактировалось 2 раза.
Причина: Тему прилепил
Причина: Тему прилепил
Тот кто впереди, всегда боится отстать, - это наш шанс, вот так то.
ATtiny24 не стартует WDT...
Здравствуйте, Братья по паяльнику!
Ваяю один полезный "девайсик" с батарейным питанием. Основа - ATtiny24. Данный МК выбрал за его мелкоту, наличие АЦП и относительно невысокую цену. Но вот засада - аппаратный INT, способный выводить данный МК из "глубокой спячки" только один, что для моего случая не достаточно. Внимание привлёк WDT с возможностью не только давать сброс, но и прерывание, способное пробудить ядро МК. По пробуждению решил задать опрос нужных портов и потом, если что, снова отправлять МК в "спячку".
Попытался запустить WDT, создав проект в CV AVR и выставив все нужные опции при помощи "Визарда". Получилось следующее:
Но единица на соответствующем порту так и не появляется, то есть программа никогда не попадает в обработчик прерывания от WDT. Сброс МК тоже не происходит (пробовал по нажатию кнопок менять ШИМ). Думал, может чего с самим МК не так, попытался запустить в "Протеусе" - ситуация аналогичная.
Помогите, пожалуйста, разобраться.
Ваяю один полезный "девайсик" с батарейным питанием. Основа - ATtiny24. Данный МК выбрал за его мелкоту, наличие АЦП и относительно невысокую цену. Но вот засада - аппаратный INT, способный выводить данный МК из "глубокой спячки" только один, что для моего случая не достаточно. Внимание привлёк WDT с возможностью не только давать сброс, но и прерывание, способное пробудить ядро МК. По пробуждению решил задать опрос нужных портов и потом, если что, снова отправлять МК в "спячку".
Попытался запустить WDT, создав проект в CV AVR и выставив все нужные опции при помощи "Визарда". Получилось следующее:
Спойлер
Код: Выделить всё
#include <tiny24.h>
#include <delay.h>
#define red PORTB.2
#define yellow PORTB.1
#define green PORTB.0
#define left PINA.5
#define right PINA.6
// Watchdog timeout interrupt service routine
interrupt [WDT] void wdt_timeout_isr(void)
{
WDTCSR|=0x40;
// Place your code here
yellow=1;
//delay_ms(10);
//yellow=0;
}
#include <delay.h>
#define ADC_VREF_TYPE 0xC0
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=0 State6=P State5=P State4=T State3=0 State2=T State1=T State0=T
PORTA=0x60;
DDRA=0x88;
// Port B initialization
// Func3=In Func2=Out Func1=Out Func0=Out
// State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x07;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Disconnected
// OC0B output: Non-Inverted PWM
TCCR0A=0x23;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x64;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-11: Off
MCUCR=0x00;
GIMSK=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: 1.1V, cap. on AREF
// ADC Bipolar Input Mode: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: Off, ADC3: On
// ADC4: On, ADC5: On, ADC6: On, ADC7: On
DIDR0=0x07;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;
ADCSRB&=0x7F;
ADCSRB|=0x10;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/8k
// Watchdog Timer interrupt: On
#pragma optsize-
#asm("wdr")
WDTCSR=0x1A;
WDTCSR=0x4A;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
Но единица на соответствующем порту так и не появляется, то есть программа никогда не попадает в обработчик прерывания от WDT. Сброс МК тоже не происходит (пробовал по нажатию кнопок менять ШИМ). Думал, может чего с самим МК не так, попытался запустить в "Протеусе" - ситуация аналогичная.
Помогите, пожалуйста, разобраться.
Re: ATtiny24 не стартует WDT...
Возможно выставлены неправильные настройки сторожевого таймера, в СИшном коде мало понимаю. Скинул скриншот с настройками из книги "Микроконтроллеры AVR семейств Tiny Руководство пользователя". В Протеусе есть пошаговая отладка, не пробовал там смотреть чем занят микроконтроллер?
- Вложения
-
- настройки таймера.jpg
- (98.1 КБ) 1808 скачиваний
Re: ATtiny24 не стартует WDT...
Благодарю за ответ.
В качестве настройки в регистр таймера последовательно записываются два значения
WDTCSR=0x1A;
WDTCSR=0x4A;
затем разрешается глобальный флаг прерываний
#asm("sei")
Но, похоже, что этого не достаточно и нужно ещё где-то чего-то разрешить.
В качестве настройки в регистр таймера последовательно записываются два значения
WDTCSR=0x1A;
WDTCSR=0x4A;
затем разрешается глобальный флаг прерываний
#asm("sei")
Но, похоже, что этого не достаточно и нужно ещё где-то чего-то разрешить.
Re: ATtiny24 не стартует WDT...
ELcat:
WDTCSR=0x4A=1001010;
WDIF-WDIE-WDP3-WDCE-WDE-WDP2-WDP1-WDP0
0______1____ 0_____0____1____0_____1____0
Бит WDIE - разрешение прерывания от сторожевого таймера.
Бит WDE - должен быть сброшен в 0. См. файл который я прикреплял, он взят из книги "Микроконтроллеры AVR семейств Tiny Руководство пользователя.djvu".
P.S. извиняюсь, в первый раз переклинило, перепутал малость
WDTCSR=0x4A=1001010;
WDIF-WDIE-WDP3-WDCE-WDE-WDP2-WDP1-WDP0
0______1____ 0_____0____1____0_____1____0
Бит WDIE - разрешение прерывания от сторожевого таймера.
Бит WDE - должен быть сброшен в 0. См. файл который я прикреплял, он взят из книги "Микроконтроллеры AVR семейств Tiny Руководство пользователя.djvu".
P.S. извиняюсь, в первый раз переклинило, перепутал малость
Последний раз редактировалось стьюдент Вс дек 09, 2012 22:52:51, всего редактировалось 1 раз.
Re: ATtiny24 не стартует WDT...
Не догнал...стьюдент писал(а):WDIF-WDIE-WDP3-WDCE-WDE-WDP2-WDP1-WDP0
0______0____ 1_____0____0____0_____1____0
Ты пишешь, что WDTCSR=0x4A=1001010; и тут же рисуешь биты 0010 0010, что в hex будет 0х22, почему??? Там что, записью "1" меняется состояние на противоположное? Поясни, пожалуйста.
Re: ATtiny24 не стартует WDT...
Отредактировал сообщение
сейчас должно быть все правильно
Re: ATtiny24 не стартует WDT...
Блин, не люблю загадки!
Может ошибка в том, что сначала необходимо установить только один бит - бит разрешение изменения регистра:
WDTCSR |= 0b00010000;
и только потом внести сами настройки:
WDTCSR |= 0b01001010; ???
То есть 0х10 и 0х4А ???
Может ошибка в том, что сначала необходимо установить только один бит - бит разрешение изменения регистра:
WDTCSR |= 0b00010000;
и только потом внести сами настройки:
WDTCSR |= 0b01001010; ???
То есть 0х10 и 0х4А ???
Re: ATtiny24 не стартует WDT...
Нихрена не помогает. Складывается такое впечатление, как будто даташит написан к какому-то другому микроконтроллеру. Кроме того нигде в инете не встречал подобного примера настройки и использования WDT в режиме генерации прерываний. Конечно, далеко не все AVR-ки имеют такую функцию у встроенного WDT, но всё же надеялся найти хотябы какой-нибудь пример...
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: ATtiny24 не стартует WDT...
как насчет того, чтобы не путаться в битовых и других магических константах и сделать вот так:
WDTCSR = (1<<WDE)|(1<<WDIE)|(1< WDP1);
А насчет загадок могу сказать, что вам код генератор уже создал нравильную последовательность активации таймера собаки, осталось выбрать правильный режим, на картинке , которую вам привели описано, что есть несколько режимов, если ваш Мк будет всегда уходить в перезагруз, то никаких лампочек вы не увидите. попробуйте в основном цикле сделать:
1 зажечь лампу
2 сбросить собаку
WDTCSR = (1<<WDE)|(1<<WDIE)|(1< WDP1);
А насчет загадок могу сказать, что вам код генератор уже создал нравильную последовательность активации таймера собаки, осталось выбрать правильный режим, на картинке , которую вам привели описано, что есть несколько режимов, если ваш Мк будет всегда уходить в перезагруз, то никаких лампочек вы не увидите. попробуйте в основном цикле сделать:
1 зажечь лампу
2 сбросить собаку
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: ATtiny24 не стартует WDT...
Честно говоря, не имел дело ни с 24-й Тинькой, ни с собакой.
Но! После прочтения соотв. раздела ДШ по диагонали, кое-что прояснилось:
Помимо фьюзов, включать/выключать собаку можно программно.
В зависимости от конфигурации, собака может вызывать ресет или своё прерывание.
Для конфигурирования собаки надо выставить бит WDCE: Watchdog Change Enable и в течение 4-х тактов внести изменения.
Есть какие-то два safety level, которые влияют на возможность отключения сторожа
Но! После прочтения соотв. раздела ДШ по диагонали, кое-что прояснилось:
Помимо фьюзов, включать/выключать собаку можно программно.
В зависимости от конфигурации, собака может вызывать ресет или своё прерывание.
Для конфигурирования собаки надо выставить бит WDCE: Watchdog Change Enable и в течение 4-х тактов внести изменения.
Есть какие-то два safety level, которые влияют на возможность отключения сторожа

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: ATtiny24 не стартует WDT...
в Safety level 1 (WDTON не запрограммирован) можно выставлять таймаут и без WDTCE.
Тоже хочется разобраться с WD, но под рукой контроллера нет, а Proteus, похоже, некорректно работает с WDT.
ELcat, попробуйте в железе для проверки простой тест:
только CLKDIV8 не программировать.
в основном цикле дергание ножкой PA0 1 Гц, а если прерывание WD будет работать, то будут дергаться остальные PA7-PA1 0.5 Гц.
скомпилированный HEX прилагается.
Тоже хочется разобраться с WD, но под рукой контроллера нет, а Proteus, похоже, некорректно работает с WDT.
ELcat, попробуйте в железе для проверки простой тест:
Код: Выделить всё
ISR(SIG_WATCHDOG_TIMEOUT)
{
PORTA ^= 0xFE;
}
int main(void)
{
DDRA = 0xFF;
WDTCSR = (1<<WDCE) | (1<<WDE);
WDTCSR = (1<<WDIE) | (1<<WDP1) | (1<<WDP2);
sei();
while(1)
{
PORTA ^= 1;
_delay_ms(500);
}
}в основном цикле дергание ножкой PA0 1 Гц, а если прерывание WD будет работать, то будут дергаться остальные PA7-PA1 0.5 Гц.
скомпилированный HEX прилагается.
- Вложения
-
- main.hex
- (394 байт) 1172 скачивания
Re: ATtiny24 не стартует WDT...
a_skr, к сожалению, мне этот код в "девайс" лить нельзя, поскольку "девайс" уже полностью спаянный и частично работает (без "спячки" пока, разумеется). На РА.7 повешен затвор HexFETa, и если туда вместо корректного ШИМ подать "1" на полсекунды, то буду иметь "пичальку" с погоревшими детальками бустера. Если можно, перепишите код, пожалуйста, исключительно для РВ.0, РВ.1 и РВ.2 (подключены светодиоды). Все остальные линии портов надо оставить "плавающими", то есть входами без "подтяжек".
По поводу подозрений в том, что я "мог не поймать ресет". Сейчас в основном цикле программы опрашиваются кнопки с частотой около 10Гц. По нажатию инкрементируется/декрементируется содержимое регистра OCR0B, по которому и формируется выходной сигнал ШИМ. То есть, если бы были сбросы, то при попытке установить какой-либо уровень скважности он периодически сбрасывался бы в 0х00, поскольку именно это число в моём коде пишется в OCR0B при инициализации таймера 0. Но тем не менее этого не происходило при любой записываемой мной комбинации в WDTCSR.
По поводу подозрений в том, что я "мог не поймать ресет". Сейчас в основном цикле программы опрашиваются кнопки с частотой около 10Гц. По нажатию инкрементируется/декрементируется содержимое регистра OCR0B, по которому и формируется выходной сигнал ШИМ. То есть, если бы были сбросы, то при попытке установить какой-либо уровень скважности он периодически сбрасывался бы в 0х00, поскольку именно это число в моём коде пишется в OCR0B при инициализации таймера 0. Но тем не менее этого не происходило при любой записываемой мной комбинации в WDTCSR.
Re: ATtiny24 не стартует WDT...
ok. давайте попробуем. используются PB.0 - основной цикл, PB.1 - таймаут WD:
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
ISR(SIG_WATCHDOG_TIMEOUT)
{
PORTB ^= 2;
}
int main(void)
{
DDRB = 3;
WDTCSR = (1<<WDCE) | (1<<WDE);
WDTCSR = (1<<WDIE) | (1<<WDP1) | (1<<WDP2);
sei();
while(1)
{
PORTB ^= 1;
_delay_ms(500);
}
}- Вложения
-
- main.hex
- (394 байт) 1322 скачивания
Re: ATtiny24 не стартует WDT...
a_skr, прошу прощения, что долго не отвечал. Отец ушёл. Похороны. Ваш код работает, мигают оба светодиода (со снятым фузом CKDIV8). Проблема не в фузе. Мой вариант на CVAVR так и не запускается. Выкладываю архив проекта. Прошу вас взглянуть что в нём не так.
- Вложения
-
- DL.ZIP
- (30.29 КБ) 1113 скачиваний
Re: ATtiny24 не стартует WDT...
сожалею
по программе. про фьюз CKDIV8 я указал просто, чтобы задержка нормально работала.
я так понял, что сброс по WD не интересует, только таймаут, так?
если так, то попробуйте поменять Ваши строчки:
WDTCSR=0x1A;
WDTCSR=0x4A;
на следующие:
WDTCSR=0x18;
WDTCSR=0x42;
таймаут 64 mS, правильно?
из обработчика таймаута WD уберите WDTCSR|=0x40;
кстати, в обработчике у Вас просто включается светодиод.
для проверки на первое время можно просто помигать им из обработчика, не трогая в главном цикле.
по программе. про фьюз CKDIV8 я указал просто, чтобы задержка нормально работала.
я так понял, что сброс по WD не интересует, только таймаут, так?
если так, то попробуйте поменять Ваши строчки:
WDTCSR=0x1A;
WDTCSR=0x4A;
на следующие:
WDTCSR=0x18;
WDTCSR=0x42;
таймаут 64 mS, правильно?
из обработчика таймаута WD уберите WDTCSR|=0x40;
кстати, в обработчике у Вас просто включается светодиод.
для проверки на первое время можно просто помигать им из обработчика, не трогая в главном цикле.
Re: ATtiny24 не стартует WDT...
Благодарю за соболезнования. Он пережил операцию, мучался больше года. Мы все до последнего момента верили, но чуда так не произошло. Онкология никого не щадит. Для нашей семьи, друзей и знакомых это невосполнимая потеря. Он был видным общественным деятелем и очень уважаемым человеком.
Не помогло.a_skr писал(а):попробуйте поменять Ваши строчки:
WDTCSR=0x1A;
WDTCSR=0x4A;
на следующие:
WDTCSR=0x18;
WDTCSR=0x42;
- Вложения
-
- DL.ZIP
- (30.72 КБ) 1202 скачивания