|
Не работает Watchdog в AtXmega |
|
|
|
Oct 4 2013, 13:29
|
Группа: Участник
Сообщений: 14
Регистрация: 26-05-05
Из: Житомир
Пользователь №: 5 403

|
Прошу помощи у Клуба! Кто пользовался 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 должен был защищать и оберегать После рестарта мигает зеленый светодиод, а затем навсегда начинает мигать красный. То есть контроллер не сбрасывается. Пробовал включить WDT через Fuse биты (устанавливал WDP и WDLOCK) - не помогает, все равно Watchdog не работает. Пробовал на двух контроллерах AtXmega128A1 AtXmega32A4. не работает ни там ни там. Как заставить его работать? Может я что-то упускаю? Кто то вообще использовал WDT в Xmega_х?
|
|
|
|
|
 |
Ответов
|
Oct 4 2013, 17:17
|
Группа: Участник
Сообщений: 14
Регистрация: 26-05-05
Из: Житомир
Пользователь №: 5 403

|
Укладывается, я смотрел сгенерированный asm, там n назначен на r16 и присвоение идет двумя последовательными командами. К сожалению, до понедельника попробовать уже не смогу. Все осталось на работе. А Вы использовали WDT в Xmega_х? Мне не верится, что он там не работает вообще, но мало ли?
|
|
|
|
|
Oct 4 2013, 18:22
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Хтось @ Oct 4 2013, 21:17)  А Вы использовали WDT в Xmega_х? Мне не верится, что он там не работает вообще, но мало ли? Нет, я только Reset использовала по похожей схеме, вот так: Код __disable_interrupt(); CCP = CCP_IOREG_gc; RST.CTRL = RST_SWRST_bm; for(;;); И он нормально работает. Только после такого сброса нулевой байт UART'ом непонятно откуда принимается (при аппаратном ресете его нет). Цитата(Хтось @ Oct 4 2013, 21:17)  К сожалению, до понедельника попробовать уже не смогу. Все осталось на работе. А Вы использовали WDT в Xmega_х? Мне не верится, что он там не работает вообще, но мало ли? Проверила на своем. Вот так работает, сброс есть: Код __disable_interrupt(); CCP = CCP_IOREG_gc; WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; // Watchdog Timer: On. Period: 500 ms for(;;); Только у меня маска называется WDT_PER_ 500CLK_gc, а не WDT_PER_ 512CLK_gc. Определена в хидере так: WDT_PER_500CLK_gc = (0x06<<2), ///< 500 cycles (0.5s @ 3.3V) Контроллер ATxmega128A1 (rev.H), компилятор EWAVR 6.21.2
|
|
|
|
|
Oct 4 2013, 18:36
|
Группа: Участник
Сообщений: 14
Регистрация: 26-05-05
Из: Житомир
Пользователь №: 5 403

|
Хорошо хоть у кого-то работает, значит проблема решается  У меня определяется так же: #define WDT_PER_512CLK_gc (0x06<<2) // 512 cycles (0.5s at 3.3V) а можете показать асемблеровский кусок посмотреть? В понедельник еще возьму плату трехлетней давности, чтоб точно контроллер из другой партии был и проверю на ней.
|
|
|
|
|
Oct 4 2013, 19:01
|
Группа: Участник
Сообщений: 14
Регистрация: 26-05-05
Из: Житомир
Пользователь №: 5 403

|
вот сгенерированный код: CODE ;void watchdog_init(void) ; 0000 0056 {unsigned char s,n; _watchdog_init: ; 0000 0057 // Сгенерировано через Code Wisard AVR и проверено по атмеловскому даташиту ; 0000 0058 #pragma optsize- ; 0000 0059 s = SREG; // Save interrupts enabled/disabled state ST -Y,R17 ST -Y,R16 ; s -> R17 ; n -> R16 IN R17,63 ; 0000 005A #asm("cli") // Disable interrupts cli ; 0000 005B n = WDT_PER_512CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; // Watchdog Timer: On. Period: 500 ms LDI R16,LOW(27) ; 0000 005C CCP = CCP_IOREG_gc; LDI R30,LOW(216) OUT 0x34,R30 ; 0000 005D WDT.CTRL = n; STS 128,R16 ; 0000 005E ; 0000 005F n = (WDT.WINCTRL & (~WDT_WEN_bm)) | WDT_WCEN_bm; // Watchdog window mode: Off LDS R30,129 ANDI R30,0xFD ORI R30,1 MOV R16,R30 ; 0000 0060 CCP = CCP_IOREG_gc; LDI R30,LOW(216) OUT 0x34,R30 ; 0000 0061 WDT.WINCTRL = n; STS 129,R16 ; 0000 0062 ; 0000 0063 SREG = s; // Restore interrupts enabled/disabled state OUT 0x3F,R17 ; 0000 0064 } LD R16,Y+ LD R17,Y+ RET ; Вроде все нормально. Да и я включал WDT через Fuse биты - все равно не работал!!! Если у Вас работает, то есть подозрения на битые контроллеры. Тем более, что у меня уже есть горький опыт именно с Xmega32A4. (внутреннее АЦП в беззнаковом режиме выдавало на некоторых участках битый код. Пришлось запустить в знаковый режим, потерял 1 бит точности, но все стало работать. ) В общем в понедельник буду испытывать на других платах. и спасибо за помощь.
|
|
|
|
Сообщений в этой теме
Хтось Не работает Watchdog в AtXmega Oct 4 2013, 13:29 Xenia Что такое у вас "n"?
Попробуйте прямо за... Oct 4 2013, 15:18   Xenia Цитата(Хтось @ Oct 4 2013, 22:36) а может... Oct 4 2013, 18:49 zombi WDT никогда не использовал ни в мегах ни в хмегах.... Oct 4 2013, 18:53 Хтось Цитата(zombi @ Oct 4 2013, 21:53) Но мне ... Oct 4 2013, 19:21  zombi Цитата(Хтось @ Oct 4 2013, 22:21) Конкрет... Oct 4 2013, 21:09   Хтось Уважаемый zombi, на этом форуме уже есть не одна т... Oct 6 2013, 11:38    IgorKossak Цитата(Хтось @ Oct 6 2013, 14:38) Использ... Oct 6 2013, 13:46    zombi Цитата(Хтось @ Oct 6 2013, 14:38) прошу п... Oct 6 2013, 14:35     Хтось Все! Я окончательно понял, что контроллеры дел... Oct 7 2013, 19:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|