Например TDA7294

Форум РадиоКот :: Просмотр темы - WatchDog Timer Сторожевой таймер в AVR
Форум РадиоКот
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 Руководство пользователя". В Протеусе есть пошаговая отладка, не пробовал там смотреть чем занят микроконтроллер?

Вложения:
настройки таймера.jpg [98.1 KiB]
Скачиваний: 1668

Автор:  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. извиняюсь, в первый раз переклинило, перепутал малость :shock:

Автор:  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...

Отредактировал сообщение :shock: сейчас должно быть все правильно

Автор:  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, которые влияют на возможность отключения сторожа :facepalm:

Автор:  a_skr [ Пт дек 14, 2012 10:34:57 ]
Заголовок сообщения:  Re: ATtiny24 не стартует WDT...

в Safety level 1 (WDTON не запрограммирован) можно выставлять таймаут и без WDTCE.
Тоже хочется разобраться с 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);
  }
}
только CLKDIV8 не программировать.
в основном цикле дергание ножкой PA0 1 Гц, а если прерывание WD будет работать, то будут дергаться остальные PA7-PA1 0.5 Гц.
скомпилированный HEX прилагается.

Вложения:
main.hex [394 байт]
Скачиваний: 1047

Автор:  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);
  }
}


Вложения:
main.hex [394 байт]
Скачиваний: 1192

Автор:  ELcat [ Вт дек 18, 2012 21:02:05 ]
Заголовок сообщения:  Re: ATtiny24 не стартует WDT...

a_skr, прошу прощения, что долго не отвечал. Отец ушёл. Похороны. Ваш код работает, мигают оба светодиода (со снятым фузом CKDIV8). Проблема не в фузе. Мой вариант на CVAVR так и не запускается. Выкладываю архив проекта. Прошу вас взглянуть что в нём не так.

Вложения:
DL.ZIP [30.29 KiB]
Скачиваний: 991

Автор:  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;
Не помогло.

Вложения:
DL.ZIP [30.72 KiB]
Скачиваний: 1057

Страница 1 из 12 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/