WatchDog Timer Сторожевой таймер в AVR
- Сообщения: 31
- Зарегистрирован: Ср сен 13, 2017 05:53:24
А можно ли сторожевой таймер использовать не по назначению, лишь как обычный таймер?
- Реклама
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
В некоторых контроллерах - да.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
[uquote="YS",url="/forum/viewtopic.php?p=3227140#p3227140"]В некоторых контроллерах - да.[/uquote]
а если как следует постараться, то можно и в любых AVR, а не только в некоторых...
а если как следует постараться, то можно и в любых AVR, а не только в некоторых...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
решил тут поэкспериментировать с собакой, до этого собакой не занимался.
МК ATmega8, проверяю в АВР Студио.
делаю инициализацию согласно даташита:
ldi R16, 0b00010000 ; WDCE
out WDTCR, R16
ldi R16, 0b00011111 ; watchdog enable, 2 сек
out WDTCR, R16
не работает!
и даже не сбрасывает бит WDCE через 4 цикла, как это должен был делать.
ранее товарищ присылал свой проект для ATtiny13 - собака работает прекрасно в АВР Студио.
что я еще не доделал или не правильно сделал?
МК ATmega8, проверяю в АВР Студио.
делаю инициализацию согласно даташита:
ldi R16, 0b00010000 ; WDCE
out WDTCR, R16
ldi R16, 0b00011111 ; watchdog enable, 2 сек
out WDTCR, R16
не работает!
и даже не сбрасывает бит WDCE через 4 цикла, как это должен был делать.
ранее товарищ присылал свой проект для ATtiny13 - собака работает прекрасно в АВР Студио.
что я еще не доделал или не правильно сделал?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Я так понимаю из прочтения параграфа в даташите, что писать WDCE надо только когда вы хотите выключить таймер. Да и в AVR132 написано:
To disable the WDT System Reset Mode, the Watchdog Change Enable bit must be set within four CPU clock cycles prior to the disabling. If not, the WDT System Reset Mode will stay enabled. If the WDTON fuse is programmed the WDT System Reset Mode is always enabled.
To change the timeout period, the Watchdog Change Enable bit must be set within four CPU clock cycles prior to changing the timeout value. It is however not recommended to change the timeout period during normal operation. This should be done once in the initialization code.
If the WDTON fuse is unprogrammed on ATtiny13 and ATtiny2313, it is possible to change the WDT timeout period without following the timed sequence.
Changing the WDT Interrupt Mode setting or enabling the WDT System Reset Mode needs no special considerations.
To disable the WDT System Reset Mode, the Watchdog Change Enable bit must be set within four CPU clock cycles prior to the disabling. If not, the WDT System Reset Mode will stay enabled. If the WDTON fuse is programmed the WDT System Reset Mode is always enabled.
To change the timeout period, the Watchdog Change Enable bit must be set within four CPU clock cycles prior to changing the timeout value. It is however not recommended to change the timeout period during normal operation. This should be done once in the initialization code.
If the WDTON fuse is unprogrammed on ATtiny13 and ATtiny2313, it is possible to change the WDT timeout period without following the timed sequence.
Changing the WDT Interrupt Mode setting or enabling the WDT System Reset Mode needs no special considerations.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Реклама
в даташите сказано:
To disable an enabled Watchdog Timer and/or changing the Watchdog Time-out, the following procedure must be followed:
1. In the same operation, write a logic one to WDCE and WDE. A logic one must be written to WDE regardless of the previous value of the WDE bit.
2. Within the next four clock cycles, in the same operation, write the WDE and WDP bits as desired, but with the WDCE bit cleared.
в связи с этими указаниями я сделал:
ldi R16, 0b00011000
out WDTCR, R16
ldi R16, 0b00001111
out WDTCR, R16
первая запись - в соответствие пункту 1,
вторая запись - в соответствие пункту 2.
все равно не работает.
To disable an enabled Watchdog Timer and/or changing the Watchdog Time-out, the following procedure must be followed:
1. In the same operation, write a logic one to WDCE and WDE. A logic one must be written to WDE regardless of the previous value of the WDE bit.
2. Within the next four clock cycles, in the same operation, write the WDE and WDP bits as desired, but with the WDCE bit cleared.
в связи с этими указаниями я сделал:
ldi R16, 0b00011000
out WDTCR, R16
ldi R16, 0b00001111
out WDTCR, R16
первая запись - в соответствие пункту 1,
вторая запись - в соответствие пункту 2.
все равно не работает.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Странно. Я исследую этот вопрос, как только доберусь до своего основного ПК...
Но я, по-моему, включал таймер без записи WDCE. Надо посмотреть старые исходники.
Но я, по-моему, включал таймер без записи WDCE. Надо посмотреть старые исходники.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
меняю в отладчике на ATtiny13 - собака работает прекрасно.
возвращаю ATmega8 - перестает работать.
биты у них совпадают.
Добавлено after 1 hour 48 minutes 32 seconds:
бля...
уже пошел на то, чтобы проверить собаку на реальном устройстве.
и этот код прекрасно РАБОТАЕТ!!!
проявились баги АВР Студио...
возвращаю ATmega8 - перестает работать.
биты у них совпадают.
Добавлено after 1 hour 48 minutes 32 seconds:
бля...
уже пошел на то, чтобы проверить собаку на реальном устройстве.
и этот код прекрасно РАБОТАЕТ!!!
проявились баги АВР Студио...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
А AVR Studio какой версии? Но вообще да, симуляторы - они такие... Можно почитать раздел device limitations в документации на симулятор, может быть там чего написано.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
версия 4.19, билд 730.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
У меня стоит 4.14, но я зашел в Help -> AVR Tools User Guide, Simulator -> Known Issues -> ATmega8 и там написано следующее:
The USART's UBRRH and UCSRC registers share the same I/O address. Writing to one of the registers will cause both registers to contain the new value, regardless of the value of URSEL. Reading these registers do not work as described in the datasheet.
The ADC noise reduction function is not supported. Setting the ADIF flag will not wake the CPU from sleep mode.
The Watchdog is not simulated.
Так что да, это правда ограничение симулятора. Причем, как видно, есть еще пара особенностей. Кроме того, есть ограничения, общие для всех контроллеров (перечислены на первой странице раздела Known Issues) - например, не работает бит SPI2X, не симулируется выключение периферии при установке соответствующих битов в PRR (в контроллерах, в которых он есть) и т.д.
The USART's UBRRH and UCSRC registers share the same I/O address. Writing to one of the registers will cause both registers to contain the new value, regardless of the value of URSEL. Reading these registers do not work as described in the datasheet.
The ADC noise reduction function is not supported. Setting the ADIF flag will not wake the CPU from sleep mode.
The Watchdog is not simulated.
Так что да, это правда ограничение симулятора. Причем, как видно, есть еще пара особенностей. Кроме того, есть ограничения, общие для всех контроллеров (перечислены на первой странице раздела Known Issues) - например, не работает бит SPI2X, не симулируется выключение периферии при установке соответствующих битов в PRR (в контроллерах, в которых он есть) и т.д.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
спасибо за найденную информацию.
не беда. зато я теперь знаю, что сторожевой таймер при инициализации согласно даташита прекрасно работает в "железе".
не беда. зато я теперь знаю, что сторожевой таймер при инициализации согласно даташита прекрасно работает в "железе".
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 15
- Зарегистрирован: Пн июн 13, 2016 00:15:06
----Пытаюсь разобраться с вачдогом, работая в Atmel studio 6. Включаю так : wdt_enable(WDTO_4S). Если хоть раз выдать wdt_reset(), то далее вачдог отключается и больше не сбрасывает. Так и должно быть ? Он же должен только таймер сбрасывать, а не отключать его ?
----Такой же эффект наблюдается, если в коде выдать еще раз wdt_enable(WDTO_4S), то вачдог сного отключается и не ребутит МК.
----Такой же эффект наблюдается, если в коде выдать еще раз wdt_enable(WDTO_4S), то вачдог сного отключается и не ребутит МК.
- Сообщения: 15
- Зарегистрирован: Пн июн 13, 2016 00:15:06
Разобрался. Проблема была в Proteus-e. В реальном железе все работает норм, а в протеусе нет.
- Сообщения: 768
- Зарегистрирован: Сб ноя 08, 2008 18:32:36
Здравствуйте! столкнулся вот с такой проблемой : Контроллер Mega168P настраиваю ватчдог на 2 секунды времени,
но почему то прерывание происходит значительно чаще (несколько раз в секунду) Какое бы значение предделителя я не выставил,все отдно и тоже. Светодиод мигает с одинаковой скоростью при любых значениях предделителя,кроме самых быстрых.
Если в теле функции задержки писать asm("wdr"); , то таймер сбрасывается раньше,и прерывание вообще не происходит,как и должно быть.
но мне нужно получить временные интервала в 2 сек.
Я уже перепробывал все варианты,ничего не помогает. Может все дело в китайском контроллере?
но почему то прерывание происходит значительно чаще (несколько раз в секунду) Какое бы значение предделителя я не выставил,все отдно и тоже. Светодиод мигает с одинаковой скоростью при любых значениях предделителя,кроме самых быстрых.
Если в теле функции задержки писать asm("wdr"); , то таймер сбрасывается раньше,и прерывание вообще не происходит,как и должно быть.
но мне нужно получить временные интервала в 2 сек.
Я уже перепробывал все варианты,ничего не помогает. Может все дело в китайском контроллере?
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
ISR (WDT_vect) //Вектор WDT
{
PORTD ^= 16;
WDTCSR |= (1<<WDIE);//разрешить прерывание WDT
}
void delay (void) //цикл задержки
{
for(uint8_t x=0; x<=10; x++ )
{
for(uint16_t y=0; y<=60000; y++) { /*asm("wdr"); */ };
}
}
int main(void)
{
DDRD = 0xff;
DDRC = 0xff;
PORTD = 0;
PORTC = 0;
asm("wdr");
WDTCSR |= (1<<WDCE) | (0<<WDE) | (1<<WDIE);//Режим генерации прерываний
WDTCSR |= (1<<WDCE) | (1<<WDP0)| (1<<WDP1) | (1<<WDP2) |(0<<WDP3);
sei();
while(1)
{
PORTC ^=4;
delay();
}
}
Взять пример из DS не пробовали?
Код: Выделить всё
void WDT_Prescaler_Change(void)
{
__disable_interrupt();
__watchdog_reset();
/* Start timed sequence */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Set new prescaler(time-out) value = 64K cycles (~0.5 s) */
WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
__enable_interrupt();
}- Сообщения: 768
- Зарегистрирован: Сб ноя 08, 2008 18:32:36
только что пробывал написать так
только ничего не изменилось. Светодиод как мигал 10 раз в секунду,так и мигает
Добавлено after 3 minutes 59 seconds:
Залейте кто нибудь пожалуйста этот код в свою отладочную плату, я почти уверен что во всем виноват контроллер
Код: Выделить всё
//******настройка предделителя по примеру из даташита*******
asm("cli");//глобально отключить прерывания
asm("wdr");
WDTCSR |= (1<<WDCE)|(1<<WDE);//разрешть RESET
WDTCSR |= (1<<WDE) | (1<<WDP0)| (1<<WDP1) | (1<<WDP2) |(0<<WDP3);//установить предделитель
WDTCSR |= (1<<WDCE)|(1<<WDIE); //разрешить прерывания от WDT
sei();//разрешить прерывания
Добавлено after 3 minutes 59 seconds:
Залейте кто нибудь пожалуйста этот код в свою отладочную плату, я почти уверен что во всем виноват контроллер
Не понимаю в ваших кыржиках, поэтому рабочий код, генерирующий прерывание WDT 2 секунды. Каждое прерывание переключает лапы PD2 и PD5
Спойлер
Код: Выделить всё
.INCLUDE "m168def.inc"
.equ Fo=14745600
;*******************************
.CSEG
.ORG $0000
RESET:
rjmp START ; Reset Handler
.ORG $000C
WDT_OVER:
SBI PIND,5
SBI PIND,2
RETI
;*************************************************
START:
SER R20
OUT DDRB,R20
OUT DDRD,R20
WDT_Prescaler_Change:
; Turn off global interrupt
cli
; Reset Watchdog Timer
wdr
; Start timed sequence
LDS r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)
STS WDTCSR, r16
; -- Got four cycles to set the new values from here -
; Set new prescaler(time-out) value = 256K cycles (~2.0 s)
ldi r16, (1<<WDE) | (1<<WDP2) | (1<<WDP1)| (1<<WDP0)
STS WDTCSR, r16
; -- Finished setting new values, used 2 cycles -
; Turn on global interrupt
; Clear WDRF in MCUSR
LDS r16, MCUSR
andi r16, (0xff & (0<<WDRF))
STS MCUSR, r16
; Write logical one to WDCE and WDE
; Keep old prescaler setting to prevent unintentional time-out
LDS r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)| (1<<WDIE)
STS WDTCSR, r16
LDI R16,1<<SE
OUT SMCR,R16
sei
WAIT:
SLEEP
NOP
RJMP WAIT ; On Reset
.EXIT- Сообщения: 768
- Зарегистрирован: Сб ноя 08, 2008 18:32:36
Огромное вам спасибо! ваш код на ассемблере работает так : 2 сек на линии 1, 2 сек 0.
Получается контроллер исправен. Я перенес то что было написано на ассемблере в си, но все равно светодиод на PB0 мигает раз 5 в секунду,ничего не изменилось. Что может быть не так? Открыл окно отладчика, IO/view,выбрал WDT и вижу, что все биты кроме WDPn устанавливаются, а нужные биты WDPn отладчик предлагает выбрать из выпадающего списка. Это нормально?
Получается контроллер исправен. Я перенес то что было написано на ассемблере в си, но все равно светодиод на PB0 мигает раз 5 в секунду,ничего не изменилось. Что может быть не так? Открыл окно отладчика, IO/view,выбрал WDT и вижу, что все биты кроме WDPn устанавливаются, а нужные биты WDPn отладчик предлагает выбрать из выпадающего списка. Это нормально?
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
ISR (WDT_vect) //Вектор WDT
{
PORTB ^=1;//переключить PB0
}
int main(void)
{
DDRB = 0b11111111;
PORTB = 0;
cli();//глобально отключить прерывания
asm("wdr");
WDTCSR |= (1<<WDCE)|(1<<WDE);//разрешть RESET
WDTCSR |= (1<<WDE) | (1<<WDP2) | (1<<WDP1)| (1<<WDP0);//установить предделитель
MCUSR &= ~(1<<WDRF); /* Clear WDRF in MCUSR */
WDTCSR |= (1<<WDCE) | (1<<WDE)| (1<<WDIE);//разрешить прерывания от WDT
sei();//разрешить прерывания
while(1)
{
}
}
Попробовал вот так инициализировать
Нормально работает вполне, прерывания возникают, перезагрузки нет, каждые 2 секунды, проверил в Proteus.
Код: Выделить всё
WDTCSR = (1<<WDCE)|(1 << WDE);
WDTCSR = (1<<WDCE)|(1 << WDIE)|(0 << WDE)|(1 << WDP2)|(1 << WDP1)|(1 << WDP0);


