Finnished interrupt impl.
This commit is contained in:
parent
20023c48e0
commit
78317d6c4f
2 changed files with 81 additions and 23 deletions
|
|
@ -22,20 +22,6 @@ void __interruptHandler__() // the interrupt is handled here after wakeup
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(Timer1_COMPA_vect) // timer compare interrupt service routine
|
|
||||||
{
|
|
||||||
//DEBUG("Timer1e Interrupt");
|
|
||||||
__interruptHandler__();
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(WDT_vect)
|
|
||||||
{
|
|
||||||
//DEBUG("WDT Interrupt");
|
|
||||||
//wdt_disable();
|
|
||||||
__interruptHandler__();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Interrupt::wakeUp()
|
void Interrupt::wakeUp()
|
||||||
{
|
{
|
||||||
wakeUpNow = true;
|
wakeUpNow = true;
|
||||||
|
|
@ -68,12 +54,11 @@ void Interrupt::sleep()
|
||||||
power_timer2_disable();
|
power_timer2_disable();
|
||||||
power_twi_disable();
|
power_twi_disable();
|
||||||
*/
|
*/
|
||||||
//while( ! Interrupt::wakeUpNow)
|
while( ! Interrupt::wakeUpNow)
|
||||||
//{
|
{
|
||||||
wdt_reset();
|
|
||||||
sleep_mode(); // here the device is actually put to sleep!!
|
sleep_mode(); // here the device is actually put to sleep!!
|
||||||
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
|
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
|
||||||
//}
|
}
|
||||||
sleep_disable(); // first thing after waking from sleep:
|
sleep_disable(); // first thing after waking from sleep:
|
||||||
// disable sleep...
|
// disable sleep...
|
||||||
|
|
||||||
|
|
@ -96,7 +81,7 @@ void Interrupt::setupPinInterrupt(int pin)
|
||||||
*
|
*
|
||||||
* In all but the IDLE sleep modes only LOW can be used.
|
* In all but the IDLE sleep modes only LOW can be used.
|
||||||
*/
|
*/
|
||||||
attachInterrupt(pin, __interruptHandler__, LOW);
|
attachInterrupt((pin == PIND2 ? 0 : 1), __interruptHandler__, LOW);
|
||||||
|
|
||||||
//detachInterrupt(0); // disables interrupt 0 on pin 2 so the
|
//detachInterrupt(0); // disables interrupt 0 on pin 2 so the
|
||||||
// wakeUpNow code will not be executed
|
// wakeUpNow code will not be executed
|
||||||
|
|
@ -104,10 +89,71 @@ void Interrupt::setupPinInterrupt(int pin)
|
||||||
interrupts(); // enable all interrupts
|
interrupts(); // enable all interrupts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Watchdog timer
|
||||||
|
unsigned int wdtTime;
|
||||||
|
long wdtTimeLeft;
|
||||||
|
void __setWatchDogInterrupt();
|
||||||
|
|
||||||
|
ISR(WDT_vect)
|
||||||
|
{
|
||||||
|
//DEBUG("WDT Interrupt");
|
||||||
|
wdt_disable();
|
||||||
|
if (wdtTimeLeft < 0)
|
||||||
|
{
|
||||||
|
DEBUG("WDT interrupt");
|
||||||
|
Interrupt::wakeUp();
|
||||||
|
__interruptHandler__();
|
||||||
|
wdtTimeLeft = wdtTime;
|
||||||
|
}
|
||||||
|
__setWatchDogInterrupt();
|
||||||
|
}
|
||||||
|
|
||||||
void Interrupt::setupWatchDogInterrupt(unsigned int milliseconds)
|
void Interrupt::setupWatchDogInterrupt(unsigned int milliseconds)
|
||||||
|
{
|
||||||
|
wdtTimeLeft = wdtTime = milliseconds;
|
||||||
|
__setWatchDogInterrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void __setWatchDogInterrupt()
|
||||||
{
|
{
|
||||||
noInterrupts();
|
noInterrupts();
|
||||||
|
|
||||||
|
unsigned short duration;
|
||||||
|
|
||||||
|
if (8000 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 8000;
|
||||||
|
duration = (1 << WDP3) | (1 << WDP0);
|
||||||
|
} else if (4000 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 4000;
|
||||||
|
duration = (1 << WDP3);
|
||||||
|
} else if (2000 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 2000;
|
||||||
|
duration = (1 << WDP2) | (1 << WDP1) | (1 << WDP0);
|
||||||
|
} else if (1000 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 1000;
|
||||||
|
duration = (1 << WDP2) | (1 << WDP1);
|
||||||
|
} else if (500 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 500;
|
||||||
|
duration = (1 << WDP2) | (1 << WDP0);
|
||||||
|
} else if (256 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 256;
|
||||||
|
duration = (1 << WDP2);
|
||||||
|
} else if (128 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 128;
|
||||||
|
duration = (1 << WDP1) | (1 << WDP0);
|
||||||
|
} else if (64 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 64;
|
||||||
|
duration = (1 << WDP1);
|
||||||
|
} else if (32 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 32;
|
||||||
|
duration = (1 << WDP0);
|
||||||
|
} else { //(16 <= wdtTimeLeft){
|
||||||
|
wdtTimeLeft -= 16;
|
||||||
|
duration = 0;
|
||||||
|
}
|
||||||
|
//DEBUGF("WDT t -= %u", wdtTimeLeft);
|
||||||
|
|
||||||
wdt_reset();
|
wdt_reset();
|
||||||
MCUSR &= ~(1 << WDRF); // reset status flag
|
MCUSR &= ~(1 << WDRF); // reset status flag
|
||||||
|
|
||||||
|
|
@ -133,13 +179,25 @@ void Interrupt::setupWatchDogInterrupt(unsigned int milliseconds)
|
||||||
* 1 0 0 0 512K (524288) 4.0 s
|
* 1 0 0 0 512K (524288) 4.0 s
|
||||||
* 1 0 0 1 1024K (1048576) 8.0 s
|
* 1 0 0 1 1024K (1048576) 8.0 s
|
||||||
*/
|
*/
|
||||||
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0);
|
WDTCSR = (1 << WDIE) | duration;
|
||||||
|
//WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0);
|
||||||
|
|
||||||
//wdt_disable();
|
//wdt_disable();
|
||||||
|
|
||||||
interrupts();
|
interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Timer 1
|
||||||
|
/*
|
||||||
|
ISR(Timer1_COMPA_vect) // timer compare interrupt service routine
|
||||||
|
{
|
||||||
|
//DEBUG("Timer1e Interrupt");
|
||||||
|
__interruptHandler__();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
||||||
{
|
{
|
||||||
noInterrupts(); // disable all interrupts
|
noInterrupts(); // disable all interrupts
|
||||||
|
|
@ -159,10 +217,10 @@ void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
||||||
* 1 1 0 External clock source on T1 pin. Clock on falling edge.
|
* 1 1 0 External clock source on T1 pin. Clock on falling edge.
|
||||||
* 1 1 1 External clock source on T1 pin. Clock on rising edge.
|
* 1 1 1 External clock source on T1 pin. Clock on rising edge.
|
||||||
*/
|
*/
|
||||||
TCCR1B |= (1 << CS12); // 256 prescaler
|
/* TCCR1B |= (1 << CS12); // 256 prescaler
|
||||||
TCNT1 = 34286; // preload timer 65536-16MHz/256/2Hz
|
TCNT1 = 34286; // preload timer 65536-16MHz/256/2Hz
|
||||||
//TODO: TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
|
//TODO: TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
|
||||||
|
|
||||||
interrupts(); // enable all interrupts
|
interrupts(); // enable all interrupts
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ public:
|
||||||
static void sleep();
|
static void sleep();
|
||||||
static void setupPinInterrupt(int pin);
|
static void setupPinInterrupt(int pin);
|
||||||
static void setupWatchDogInterrupt(unsigned int milliseconds);
|
static void setupWatchDogInterrupt(unsigned int milliseconds);
|
||||||
static void setupTimerInterrupt(unsigned int milliseconds);
|
//static void setupTimerInterrupt(unsigned int milliseconds);
|
||||||
|
|
||||||
static void setCallback(InterruptFunction callback){ Interrupt::callback = callback;}
|
static void setCallback(InterruptFunction callback){ Interrupt::callback = callback;}
|
||||||
static InterruptFunction getCallback(){ return Interrupt::callback;}
|
static InterruptFunction getCallback(){ return Interrupt::callback;}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue