Weird program behaviour when using interrupts


i'm making solarlogger arduino.
the arduino hooked s0 of kwh counter generates pulse every wh generated. results send on rf base station logging in mysql database

these pulses caught interrupt on pin 2.

every night variable "dailyprod" should reset after 5 hours of inactivity.

but reason resets time time during day... i've put reset variable @ -10 sure it's not arduino that's rebooting.

i suppose  it has interrupt, thought volatile take care of problems might linked iterrupt problems.

the code can downloaded...

code: [select]

#include <rh_ask.h>
#include <spi.h> // not used needed compile

struct rfsensordata
{
 int sensorid;
 float sensorvalue;
};

//pin settings
//============
const byte confirmledpin = 13;
//rf module
const byte rfpin = 6;
//interrupt variables
const byte interruptpins0 = 2; //s0 interrupt

//confirm led variables
const byte confirmledinterval = 100;                    //blink speed confirm led
volatile byte confirmledblinks = 0;                    //program variable not modify
byte confirmledstate = low;                            //program variable not modify
unsigned long confirmledpreviousmillis = 0;            //program variable not modify

// rf transmitter (data)
rh_ask driver = rh_ask(1000,11,rfpin);

//interrupt variables
const byte minimuminteruptdifference = 200;          //minimum ms between interrupts prevents accidental double counts 200 ms 18.000w
volatile unsigned long previousinterruptmillis = 0;  //program variable not modify
volatile float dailyprod = 0;                //program variable not modify

//power variables
const long millisinhour = 3600000;
volatile float currentpower = 0;

// rf data broadcastdelay
unsigned long lastmillisdatabroadcast = 0;     //program variable not modify
const unsigned long delaydatabroadcast = 9333;//how should rf codes rebroadcasted in ms

//const variables
const unsigned long currentpowermilisreset = 600000;
const unsigned long dailyprodmilisreset = 18000000;

void setup()
{
 pinmode(confirmledpin,output);
 pinmode(3,output);
 digitalwrite(3, high);
 //init rf data module
 driver.init();

 //attach interupt interupt pin 0 = pin 2 on arduino
 attachinterrupt(0, s0interrupt, falling);
 confirmledblinks = 5;
}

void loop()
{
 // put main code here, run repeatedly:
 //broadcast data on rf if needed
 unsigned long currentmillis = millis();
 sendwirelessdata();

 //reset currentpower if timeout reached
 if((currentmillis + (unsigned long)1000) - previousinterruptmillis > currentpowermilisreset)
 {
   currentpower = 0;
 }
 
 //reset dailyprod if timeout reached
 if((currentmillis + (unsigned long)1000) - previousinterruptmillis > dailyprodmilisreset)
 {
   dailyprod = -10; // <====== thing triggered time time during day
 }
 confirmblinks();
}

void s0interrupt()
{
 unsigned long currentinteruptmillis = millis();
 //wait 5 ms , recheck pin sure it's low after 5 ms
 delay(5);
 if (currentinteruptmillis - previousinterruptmillis > minimuminteruptdifference && digitalread(interruptpins0) == low)
 {
   dailyprod++;
   currentpower = (float)millisinhour / (float)(currentinteruptmillis - previousinterruptmillis);
   previousinterruptmillis = currentinteruptmillis;
   confirmledblinks++;
 }
}

void confirmblinks()
{
 unsigned long currentblinkmillis = millis();
 if(currentblinkmillis - confirmledpreviousmillis > confirmledinterval && confirmledblinks > 0)
 {
   // save last time blinked led
   confirmledpreviousmillis = currentblinkmillis;

   // if led off turn on , vice-versa:
   // if it's turned off reduce number of blinks go
   if (confirmledstate == low)
   {
     confirmledstate = high;
   }
   else
   {
     confirmledstate = low;
     confirmledblinks--;
   }

   // set led ledstate of variable:
   digitalwrite(confirmledpin, confirmledstate);
 }
}

void sendwirelessdata()
{
 if(millis() - lastmillisdatabroadcast > delaydatabroadcast)
 {

   sendsensorvalue(6,currentpower);
   sendsensorvalue(7,dailyprod);
   lastmillisdatabroadcast = millis();
   confirmledblinks++;
 }
}
void sendsensorvalue(int sensorid, float sensorvalue)
{
 rfsensordata rfdata;
 rfdata.sensorid = sensorid;
 rfdata.sensorvalue = sensorvalue;
 byte buflen = sizeof(rfdata);
 byte buf[buflen];
 memcpy(&buf, &rfdata, buflen);
 driver.send(buf, buflen);
 driver.waitpacketsent();
}

quote
void s0interrupt()
{
  unsigned long currentinteruptmillis = millis();
  //wait 5 ms , recheck pin sure it's low after 5 ms
  delay(5);

weird use of "delay()" in interrupt context.


Arduino Forum > Using Arduino > Programming Questions > Weird program behaviour when using interrupts


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support