Форум РадиоКот https://radiokot.ru/forum/ |
|
WatchDog Timer Сторожевой таймер в AVR https://radiokot.ru/forum/viewtopic.php?f=57&t=2759 |
Страница 1 из 12 |
Автор: | voin [ Вс ноя 19, 2006 14:23:38 ] |
Заголовок сообщения: | WatchDog Timer Сторожевой таймер в AVR |
WatchDog Timer - что это? Обьясните что это такое как можно проще. (использую tini13, и прогу AlgorithmBuilder) |
Автор: | Alexey_B [ Пн ноя 20, 2006 07:39:01 ] |
Заголовок сообщения: | |
Так называемый сторожевой таймер. Если он включен, то по его переполнению контроллер сбрасывается. Нужен чтобы зависаний не было. Програмно может обнулятиься. |
Автор: | voin [ Чт ноя 23, 2006 22:07:58 ] |
Заголовок сообщения: | |
Все спасибо, уже пошел делать. |
Автор: | ELcat [ Ср дек 05, 2012 20:35:55 ] |
Заголовок сообщения: | ATtiny24 не стартует 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. Сброс МК тоже не происходит (пробовал по нажатию кнопок менять ШИМ). Думал, может чего с самим МК не так, попытался запустить в "Протеусе" - ситуация аналогичная. Помогите, пожалуйста, разобраться. |
Автор: | стьюдент [ Сб дек 08, 2012 18:32:39 ] | ||
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... | ||
Возможно выставлены неправильные настройки сторожевого таймера, в СИшном коде мало понимаю. Скинул скриншот с настройками из книги "Микроконтроллеры AVR семейств Tiny Руководство пользователя". В Протеусе есть пошаговая отладка, не пробовал там смотреть чем занят микроконтроллер?
|
Автор: | ELcat [ Вс дек 09, 2012 02:50:06 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
Благодарю за ответ. В качестве настройки в регистр таймера последовательно записываются два значения WDTCSR=0x1A; WDTCSR=0x4A; затем разрешается глобальный флаг прерываний #asm("sei") Но, похоже, что этого не достаточно и нужно ещё где-то чего-то разрешить. |
Автор: | стьюдент [ Вс дек 09, 2012 19:27:22 ] |
Заголовок сообщения: | 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. извиняюсь, в первый раз переклинило, перепутал малость ![]() |
Автор: | ELcat [ Вс дек 09, 2012 21:27:25 ] |
Заголовок сообщения: | 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" меняется состояние на противоположное? Поясни, пожалуйста. |
Автор: | ibiza11 [ Вс дек 09, 2012 21:33:54 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
вы названия битов то прочтите. |
Автор: | стьюдент [ Вс дек 09, 2012 22:58:38 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
Отредактировал сообщение ![]() |
Автор: | ELcat [ Вс дек 09, 2012 23:46:06 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
Блин, не люблю загадки! Может ошибка в том, что сначала необходимо установить только один бит - бит разрешение изменения регистра: WDTCSR |= 0b00010000; и только потом внести сами настройки: WDTCSR |= 0b01001010; ??? То есть 0х10 и 0х4А ??? |
Автор: | ELcat [ Пн дек 10, 2012 00:08:30 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
Нихрена не помогает. Складывается такое впечатление, как будто даташит написан к какому-то другому микроконтроллеру. Кроме того нигде в инете не встречал подобного примера настройки и использования WDT в режиме генерации прерываний. Конечно, далеко не все AVR-ки имеют такую функцию у встроенного WDT, но всё же надеялся найти хотябы какой-нибудь пример... |
Автор: | vitalik_1984 [ Чт дек 13, 2012 23:51:15 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
как насчет того, чтобы не путаться в битовых и других магических константах и сделать вот так: WDTCSR = (1<<WDE)|(1<<WDIE)|(1< WDP1); А насчет загадок могу сказать, что вам код генератор уже создал нравильную последовательность активации таймера собаки, осталось выбрать правильный режим, на картинке , которую вам привели описано, что есть несколько режимов, если ваш Мк будет всегда уходить в перезагруз, то никаких лампочек вы не увидите. попробуйте в основном цикле сделать: 1 зажечь лампу 2 сбросить собаку |
Автор: | Gudd-Head [ Пт дек 14, 2012 10:08:13 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
Честно говоря, не имел дело ни с 24-й Тинькой, ни с собакой. Но! После прочтения соотв. раздела ДШ по диагонали, кое-что прояснилось: Помимо фьюзов, включать/выключать собаку можно программно. В зависимости от конфигурации, собака может вызывать ресет или своё прерывание. Для конфигурирования собаки надо выставить бит WDCE: Watchdog Change Enable и в течение 4-х тактов внести изменения. Есть какие-то два safety level, которые влияют на возможность отключения сторожа ![]() |
Автор: | a_skr [ Пт дек 14, 2012 10:34:57 ] | ||
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... | ||
в Safety level 1 (WDTON не запрограммирован) можно выставлять таймаут и без WDTCE. Тоже хочется разобраться с WD, но под рукой контроллера нет, а Proteus, похоже, некорректно работает с WDT. ELcat, попробуйте в железе для проверки простой тест: Код: ISR(SIG_WATCHDOG_TIMEOUT) только CLKDIV8 не программировать.{ 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 прилагается.
|
Автор: | ELcat [ Пт дек 14, 2012 22:44:44 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
a_skr, к сожалению, мне этот код в "девайс" лить нельзя, поскольку "девайс" уже полностью спаянный и частично работает (без "спячки" пока, разумеется). На РА.7 повешен затвор HexFETa, и если туда вместо корректного ШИМ подать "1" на полсекунды, то буду иметь "пичальку" с погоревшими детальками бустера. Если можно, перепишите код, пожалуйста, исключительно для РВ.0, РВ.1 и РВ.2 (подключены светодиоды). Все остальные линии портов надо оставить "плавающими", то есть входами без "подтяжек". По поводу подозрений в том, что я "мог не поймать ресет". Сейчас в основном цикле программы опрашиваются кнопки с частотой около 10Гц. По нажатию инкрементируется/декрементируется содержимое регистра OCR0B, по которому и формируется выходной сигнал ШИМ. То есть, если бы были сбросы, то при попытке установить какой-либо уровень скважности он периодически сбрасывался бы в 0х00, поскольку именно это число в моём коде пишется в OCR0B при инициализации таймера 0. Но тем не менее этого не происходило при любой записываемой мной комбинации в WDTCSR. |
Автор: | a_skr [ Пн дек 17, 2012 09:33:44 ] | ||
Заголовок сообщения: | 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); } }
|
Автор: | ELcat [ Вт дек 18, 2012 21:02:05 ] | ||
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... | ||
a_skr, прошу прощения, что долго не отвечал. Отец ушёл. Похороны. Ваш код работает, мигают оба светодиода (со снятым фузом CKDIV8). Проблема не в фузе. Мой вариант на CVAVR так и не запускается. Выкладываю архив проекта. Прошу вас взглянуть что в нём не так.
|
Автор: | a_skr [ Ср дек 19, 2012 08:36:53 ] |
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... |
сожалею ![]() по программе. про фьюз CKDIV8 я указал просто, чтобы задержка нормально работала. я так понял, что сброс по WD не интересует, только таймаут, так? если так, то попробуйте поменять Ваши строчки: WDTCSR=0x1A; WDTCSR=0x4A; на следующие: WDTCSR=0x18; WDTCSR=0x42; таймаут 64 mS, правильно? из обработчика таймаута WD уберите WDTCSR|=0x40; кстати, в обработчике у Вас просто включается светодиод. для проверки на первое время можно просто помигать им из обработчика, не трогая в главном цикле. |
Автор: | ELcat [ Ср дек 19, 2012 20:08:55 ] | ||
Заголовок сообщения: | Re: ATtiny24 не стартует WDT... | ||
Благодарю за соболезнования. Он пережил операцию, мучался больше года. Мы все до последнего момента верили, но чуда так не произошло. Онкология никого не щадит. Для нашей семьи, друзей и знакомых это невосполнимая потеря. Он был видным общественным деятелем и очень уважаемым человеком. a_skr писал(а): попробуйте поменять Ваши строчки: Не помогло.
WDTCSR=0x1A; WDTCSR=0x4A; на следующие: WDTCSR=0x18; WDTCSR=0x42;
|
Страница 1 из 12 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |