Кто пользовался watchdog таймером в Xmega контроллерах?
У меня watchdog нагло отказывается работать!
Вот кусок программы:
CODE
void watchdog_init(void)
{unsigned char s,n;
// Сгенерировано через Code Wisard AVR и проверено по атмеловскому даташиту
#pragma optsize-
s = SREG; // Save interrupts enabled/disabled state
#asm("cli") // Disable interrupts
n = WDT_PER_512CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; // Watchdog Timer: On. Period: 500 ms
CCP = CCP_IOREG_gc;
WDT.CTRL = n;
n = (WDT.WINCTRL & (~WDT_WEN_bm)) | WDT_WCEN_bm; // Watchdog window mode: Off
CCP = CCP_IOREG_gc;
WDT.WINCTRL = n;
SREG = s; // Restore interrupts enabled/disabled state
}
#define SetGreenLed PORTC.OUTCLR = 0x40
#define ClrGreenLed PORTC.OUTSET = 0x40
#define SetRedLed PORTC.OUTCLR = 0x80
#define ClrRedLed PORTC.OUTSET = 0x80
void main(void)
{
watchdog_init();
InitPins(); //Инициализация ножек, куча строк типа "PORTA.DIR = 0b00110110;" и ничего больше
SetGreenLed; //
InitSystemClock(); //переключиться на внешний генератор 33 МГц
delay_ms(400); //
ClrGreenLed; //
delay_ms(5000); //
while(1) //
{delay_ms(250); //
SetRedLed; //
delay_ms(250); //
ClrRedLed; //
} //
//... //Дальше шла программа, которую WDT должен был защищать и оберегать
{unsigned char s,n;
// Сгенерировано через Code Wisard AVR и проверено по атмеловскому даташиту
#pragma optsize-
s = SREG; // Save interrupts enabled/disabled state
#asm("cli") // Disable interrupts
n = WDT_PER_512CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; // Watchdog Timer: On. Period: 500 ms
CCP = CCP_IOREG_gc;
WDT.CTRL = n;
n = (WDT.WINCTRL & (~WDT_WEN_bm)) | WDT_WCEN_bm; // Watchdog window mode: Off
CCP = CCP_IOREG_gc;
WDT.WINCTRL = n;
SREG = s; // Restore interrupts enabled/disabled state
}
#define SetGreenLed PORTC.OUTCLR = 0x40
#define ClrGreenLed PORTC.OUTSET = 0x40
#define SetRedLed PORTC.OUTCLR = 0x80
#define ClrRedLed PORTC.OUTSET = 0x80
void main(void)
{
watchdog_init();
InitPins(); //Инициализация ножек, куча строк типа "PORTA.DIR = 0b00110110;" и ничего больше
SetGreenLed; //
InitSystemClock(); //переключиться на внешний генератор 33 МГц
delay_ms(400); //
ClrGreenLed; //
delay_ms(5000); //
while(1) //
{delay_ms(250); //
SetRedLed; //
delay_ms(250); //
ClrRedLed; //
} //
//... //Дальше шла программа, которую WDT должен был защищать и оберегать
После рестарта мигает зеленый светодиод, а затем навсегда начинает мигать красный. То есть контроллер не сбрасывается.
Пробовал включить WDT через Fuse биты (устанавливал WDP и WDLOCK) - не помогает, все равно Watchdog не работает.
Пробовал на двух контроллерах AtXmega128A1 AtXmega32A4. не работает ни там ни там.
Как заставить его работать? Может я что-то упускаю? Кто то вообще использовал WDT в Xmega_х?