Плата на базе ATMega128 должна при отключении питания работать от аккумулятора. В принципе ничего сложного, нужно завести сигнал наличия внешнего питания на какой нибудь INT, засыпать и просыпаться по нему. Проблема в том, что контроллер выполняет помимо всего прочего еще и ф-ию RTC. Выглядит это так:
Код
#define TIMER0_CLK 0x5
//TIMER0 initialisation - prescale:1024
// WGM: Normal
// desired value: 100Hz
// actual value: 100.160Hz (0.2%)
void timer0_init(void)
{
TCCR0=0x00; //stop
ASSR=0x00; //set async mode
TCNT0=0xC0; //set count
OCR0=0x40;
TCCR0=TIMER0_CLK; //start timer
}
//call this routine to initialise all peripherals
void init_devices(void)
{
CLI();
XDIV=0x00;
XMCRA=0x00;
port_init();
timer0_init();
timer1_init();
uart0_init();
spi_init();
MCUCR = 0x00;
EICRA = 0x00;
EICRB = 0x00;
EIMSK = 0x00;
TIMSK = 0x05;
ETIMSK=0x20;// - timer 3 capture -
SEI();
}
unsigned char tcnt0 = 0;
unsigned char led = 0;
//код прерывания - моргает светодиодом и считает время
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void){
tcnt0++;
if(tcnt0 == 225){
tcnt0=0;
if(led){
led=0;
PORTB=PINB&0xEF;
}
else{
led=1;
PORTB=PINB|0x10;
time_change ();//ф-я обновления времени
}
}
}
При такой реализации RTC, нужно просыпаться по прерыванию от таймера 0 и считать время, затем опять засыпать, но я не знаю какой из спящих режимов сюда подойдёт, и можно ли вообще так делать. Буду рад любой помощи. Заранее спасибо.