значит так. Atmega16А. работает от внутреннего генератора 8Мгц. также запущен таймер Т2 в асинхронном режиме, и тактируется часовым кварцем 32768. Таймерт настроен на прерывание раз в секунду. т.е. получаем RTC. RTC отлично работает, точно отсчитывая секунды. До этого момента никаких неприятностей нет. а начинаются они когда я усыпляю контроллер по команде SLEEP. делаю я это так. в конце обработчика Т2 усыпляю контроллер командой SLEEP. контроллер засыпает, и просыпается только при следующем прерывании Т2. проснувшись, контроллер выполняет обработчик Т2, в конце которого сново стоит SLEEP, и он сново засыпает. и так до тех пор пока не придет запрет на усыпления контроллера по SLEEP. Так вот, вроде все хорошо, НО рано я радовался. после нескольких срабатываний Т2, контроллер либо перезагружается(чаще), либо зависает(реже). я уже выкинул из кода ВСЕ кроме тикающего асинхронного таймера, но проблема не уходит. кстати количество срабатываний таймера до перезагрузки - строго одинаковое. если обработчик Т2 сделать таким
Код: Выделить всё
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
x++;
PORTD=x; // это нужно чтоб было видно что таймер работает
#asm("sei") #asm("sleep")
}а если таким
Код: Выделить всё
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
x++; if (x==60) {x=0; y++;}
PORTD=x; // это нужно чтоб было видно что таймер работает
PORTA=y; // это нужно чтоб было видно что таймер работает
#asm("sei") #asm("sleep")
}вот весь код(вернее то что от него осталось)
Код: Выделить всё
#include <mega16.h>
unsigned char x;
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
x++; PORTD=x;
#asm("sei") #asm("sleep")
}
void main(void)
{
PORTA=0x00; DDRA=0xFF;
PORTB=0x00; DDRB=0xFF;
PORTC=0x00; DDRC=0xFF;
PORTD=0x00; DDRD=0xFF;
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;
TIMSK=0x41;
MCUCR|=0b01110000; // выбираю режим пониженного энергопотребления - Power Sawe, разрешаю усыплять по команде "sleep"
#asm("sei")
while (1)
{};
}Если усыпление перенести из обработчика Т2 в основной цикл, то все нормально работает, но мне в основном цикле не удобно. во первых есть куча мест куда программа может зайти и сидеть там минуту-две, а во вторых, перед каждым засыпанием будет один раз отрабатываться основной цикл(пока по кругу дойдет до SLEEP), что скажется на общем потреблении контроллера когда он спит.
Вот такая проблема. кто может подскажите.......
