Some changes to Interrupt.h
This commit is contained in:
parent
d377bbc0a9
commit
4cf9170616
4 changed files with 98 additions and 44 deletions
|
|
@ -37,8 +37,8 @@ void timerInterruptFunc();
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
timerMultiplierMAX = POWER_TIMER_MULTIPLIER * TEMPERATURE_TIMER_MULTIPLIER * LIGHT_TIMER_MULTIPLIER; // Find a lowest common denominator
|
timerMultiplierMAX = POWER_TIMER_MULTIPLIER * TEMPERATURE_TIMER_MULTIPLIER * LIGHT_TIMER_MULTIPLIER; // Find a lowest common denominator
|
||||||
interrupt = new Interrupt(timerInterruptFunc);
|
Interrupt::setCallback(timerInterruptFunc);
|
||||||
interrupt->setupTimerInterrupt(60*1000); // one minute scheduled interrupt
|
Interrupt::setupTimerInterrupt(60*1000); // one minute scheduled interrupt
|
||||||
|
|
||||||
// Setup Sensors and protocols
|
// Setup Sensors and protocols
|
||||||
#ifdef POWERCON_ENABLED
|
#ifdef POWERCON_ENABLED
|
||||||
|
|
@ -64,15 +64,15 @@ void setup()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void loop() {}
|
|
||||||
|
|
||||||
|
|
||||||
void timerInterruptFunc()
|
void timerInterruptFunc()
|
||||||
{
|
{
|
||||||
++timerMultiplier;
|
++timerMultiplier;
|
||||||
if (timerMultiplier > timerMultiplierMAX)
|
if (timerMultiplier > timerMultiplierMAX)
|
||||||
timerMultiplier = 1;
|
timerMultiplier = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
// Send power consumption
|
// Send power consumption
|
||||||
#ifdef POWERCON_ENABLED
|
#ifdef POWERCON_ENABLED
|
||||||
if(timerMultiplier == POWER_TIMER_MULTIPLIER)
|
if(timerMultiplier == POWER_TIMER_MULTIPLIER)
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,39 @@
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
|
#include <Arduino.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/sleep.h>
|
#include <avr/sleep.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
|
||||||
|
void emptyFunc(){}
|
||||||
|
InterruptFunction Interrupt::callback = emptyFunc;
|
||||||
|
bool Interrupt::wakeUpNow = false;
|
||||||
|
|
||||||
|
|
||||||
void __Interrupt_pinInterrupt__() // the interrupt is handled here after wakeup
|
void __interruptHandler__() // the interrupt is handled here after wakeup
|
||||||
{
|
{
|
||||||
// execute code here after wake-up before returning to the loop() function
|
// execute code here after wake-up before returning to the loop() function
|
||||||
// timers and code using timers (serial.print and more...) will not work here.
|
// timers and code using timers (serial.print and more...) will not work here.
|
||||||
// we don't really need to execute any special functions here, since we
|
|
||||||
// just want the thing to wake up
|
noInterrupts(); // disable all interrupts
|
||||||
|
(Interrupt::getCallback()) ();
|
||||||
|
interrupts(); // enable all interrupts
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interrupt::setupPinInterrupt(int pin)
|
ISR(Timer1_COMPA_vect) // timer compare interrupt service routine
|
||||||
{
|
{
|
||||||
|
__interruptHandler__();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
ISR(WDT_vect) { }
|
||||||
|
|
||||||
|
|
||||||
|
void Interrupt::wakeUp()
|
||||||
|
{
|
||||||
|
wakeUpNow = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Interrupt::sleep()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The 5 different modes are:
|
* The 5 different modes are:
|
||||||
|
|
@ -33,9 +48,32 @@ void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
||||||
* sleep mode: SLEEP_MODE_PWR_DOWN
|
* sleep mode: SLEEP_MODE_PWR_DOWN
|
||||||
*/
|
*/
|
||||||
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
|
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
|
||||||
|
wakeUpNow = false;
|
||||||
|
|
||||||
sleep_enable(); // enables the sleep bit in the mcucr register
|
sleep_enable(); // enables the sleep bit in the mcucr register
|
||||||
// so sleep is possible. just a safety pin
|
// so sleep is possible. just a safety pin
|
||||||
|
/*
|
||||||
|
power_adc_disable();
|
||||||
|
power_spi_disable();
|
||||||
|
power_timer0_disable();
|
||||||
|
power_timer1_disable();
|
||||||
|
power_timer2_disable();
|
||||||
|
power_twi_disable();
|
||||||
|
*/
|
||||||
|
while( ! Interrupt::wakeUpNow)
|
||||||
|
{
|
||||||
|
sleep_mode(); // here the device is actually put to sleep!!
|
||||||
|
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
|
||||||
|
}
|
||||||
|
sleep_disable(); // first thing after waking from sleep:
|
||||||
|
// disable sleep...
|
||||||
|
|
||||||
|
power_all_enable(); // during normal running time.
|
||||||
|
}
|
||||||
|
|
||||||
|
void Interrupt::setupPinInterrupt(int pin)
|
||||||
|
{
|
||||||
|
noInterrupts(); // disable all interrupts
|
||||||
|
|
||||||
/* Now it is time to enable an interrupt.
|
/* Now it is time to enable an interrupt.
|
||||||
* In the function call attachInterrupt(A, B, C)
|
* In the function call attachInterrupt(A, B, C)
|
||||||
|
|
@ -49,22 +87,37 @@ void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
||||||
*
|
*
|
||||||
* 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(0,__Interrupt_pinInterrupt__, LOW);
|
attachInterrupt(pin, __interruptHandler__, LOW);
|
||||||
/*
|
|
||||||
power_adc_disable();
|
|
||||||
power_spi_disable();
|
|
||||||
power_timer0_disable();
|
|
||||||
power_timer1_disable();
|
|
||||||
power_timer2_disable();
|
|
||||||
power_twi_disable();
|
|
||||||
*/
|
|
||||||
sleep_mode(); // here the device is actually put to sleep!!
|
|
||||||
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
|
|
||||||
|
|
||||||
sleep_disable(); // first thing after waking from sleep:
|
//detachInterrupt(0); // disables interrupt 0 on pin 2 so the
|
||||||
// disable sleep...
|
|
||||||
detachInterrupt(0); // disables interrupt 0 on pin 2 so the
|
|
||||||
// wakeUpNow code will not be executed
|
// wakeUpNow code will not be executed
|
||||||
// during normal running time.
|
|
||||||
power_all_enable();
|
interrupts(); // enable all interrupts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Interrupt::setupTimerInterrupt(unsigned int milliseconds)
|
||||||
|
{
|
||||||
|
noInterrupts(); // disable all interrupts
|
||||||
|
|
||||||
|
// initialize Timer1
|
||||||
|
TCCR1A = 0;
|
||||||
|
TCCR1B = 0;
|
||||||
|
|
||||||
|
/* Clock Select Bit Description
|
||||||
|
* CS12 CS11 CS10 Description
|
||||||
|
* 0 0 0 No clock source (Stop timer)
|
||||||
|
* 0 0 1 clk/1 (No prescaling)
|
||||||
|
* 0 1 0 clk/8
|
||||||
|
* 0 1 1 clk/64
|
||||||
|
* 1 0 0 clk/256
|
||||||
|
* 1 0 1 clk/1024
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
TCCR1B |= (1 << CS12); // 256 prescaler
|
||||||
|
TCNT1 = 34286; // preload timer 65536-16MHz/256/2Hz
|
||||||
|
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
|
||||||
|
|
||||||
|
interrupts(); // enable all interrupts
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,28 @@
|
||||||
#ifndef INTERRUPT_H
|
#ifndef INTERRUPT_H
|
||||||
#define INTERRUPT_H
|
#define INTERRUPT_H
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (*InterruptFunction) ();
|
typedef void (*InterruptFunction) ();
|
||||||
|
|
||||||
class Interrupt
|
class Interrupt
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Interrupt(InterruptFunction callback) : callback(callback) {};
|
static void wakeUp();
|
||||||
|
static void sleep();
|
||||||
|
static void setupPinInterrupt(int pin);
|
||||||
|
static void setupTimerInterrupt(unsigned int milliseconds);
|
||||||
|
|
||||||
|
static void setCallback(InterruptFunction callback){ Interrupt::callback = callback;}
|
||||||
|
static InterruptFunction getCallback(){ return Interrupt::callback;}
|
||||||
|
|
||||||
//static void sleep(int milliseconds);
|
|
||||||
void setupPinInterrupt(int pin);
|
|
||||||
void setupTimerInterrupt(unsigned int milliseconds);
|
|
||||||
private:
|
private:
|
||||||
InterruptFunction callback;
|
static InterruptFunction callback;
|
||||||
|
static bool wakeUpNow;
|
||||||
|
|
||||||
|
Interrupt() {};
|
||||||
|
Interrupt(Interrupt const&);
|
||||||
|
void operator=(Interrupt const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // INTERRUPT_H
|
#endif // INTERRUPT_H
|
||||||
|
|
@ -1,16 +1,10 @@
|
||||||
#include "SensorPhotocell.h"
|
#include "SensorPhotocell.h"
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
void pinInterrupt()
|
|
||||||
{
|
|
||||||
//++pulse;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SensorPhotocell::setup()
|
void SensorPhotocell::setup()
|
||||||
{
|
{
|
||||||
interrupt = new Interrupt(pinInterrupt);
|
Interrupt::setupPinInterrupt(PC2); //PC3
|
||||||
interrupt->setupPinInterrupt(PC2); //PC3
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int SensorPhotocell::getConsumption()
|
unsigned int SensorPhotocell::getConsumption()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue