В моем проекте не удается корректно применить сторожевой таймер в режиме сброса.
Устанавливаю его на период 1 сек. (визардом CVAVR), а он сбрасывает через 0,5мс. Устанавливаю его на 2 сек., сбрасывает через 1 мс.
Контроль по симуляции в Proteus 7.7.2.9089. CVAVR: V2.05.0 Professional.
под WINDOWS 7. Работаю с ATmega328P. В Протеусе WDTON не установлен, частоты в проекте соответствуют заданным (16Мгц).
Для того, чтобы разобраться с ситуацией, подготовил проект проверки работы Watchdog Timer (в приложении в одной папке исходник и симуляция в Протеусе).
Исходник на CVAVR:
Спойлер
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : WDT
Version :
Date : 03.03.2018
Author :
Company :
Comments:
Chip type : ATmega328P
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega328p.h>
//#include <delay.h>
// Declare your global variables here
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x00; // PB0 уст. в 0
DDRB=0x01;
PORTC=0x40; // Подтяг. RESET к VCC
DDRC=0x00;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/128k
// Watchdog Timer interrupt: Off
#pragma optsize-
#asm("wdr")
WDTCSR=0x1E;
WDTCSR=0x0E; // 1s
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB^=(1<<0);
#asm("wdr")
while (1){}
} Проект в cvavr и ProteusЗапускаю программу, и получаю постоянные сбросы, с периодом в 2000 раз меньше задаваемого (таких времен (<16mc) даже в даташите нет).
Подскажите, в чем засада? Почему моделируемый период срабатывания WDR не соответствует заданному в программе?