Sketch resets unexpectedly


my project involves putting arduino sleep , waking @ pre-determined times. while awake waits brief time looking incoming serial data. serial data meant update time intervals should wake for. once completes cycle goes sleep , wakes @ next predetermined time. working 328p on breadboard running 32khz external crystal. set seconds variable run async external crystal , keeps time during sleep , creates interupt wake from. use 8mhz internal clock boot loader , 0023 ide. don't use v1 ide because has issues 8mhz internal clock bootloader did not find solution yet.

the problem run 60% of time while sketch running , waiting serial data reboots. if send serial data before error accepts data , goes sleep fine. arduino has tendencay reset when let time out , no serial data sent. started print millis() verified indeed rebooting mid-cycle. reading on forum suggests running out of sram. issue don't understand things enough know how figure out causing memory issue. have seen memoryfree library tried , consistently shows 820 right until resets. suggestions on how can trouble shoot memory issue?


in case helpful here code.

code: [select]


#include <avr/sleep.h>


//10801 = 24 hours, 7.5 = 1 minute
int time0 = 10;
int time1 = 0;
int time2 = 0;
int time3 = 0;
int time4 = 0;
int time5 = 0;
int time6 = 0;
int time7 = 0;
int time8 = 0;
int time9 = 0;
int time10 = 0;
int time11 = 0;
int reset = 10802;


char delimiters[30] = ",";
char* valposition;


int interval[150] = {0, 0, 0};

int midnight = 1;

int gpsdata = 0;
int hours;
int minutes;
int update;
int gsmdata = 0;
int strend = 0;
int = 0;

volatile int seconds = 10800;
volatile int timer = 0;

signal(timer2_ovf_vect){
 seconds++;
 timer++;
}


char inputstring[100];      
int inbyte = 0;

boolean stringcomplete = false;  

void setup() {

 for(int x = 1 ; x < 18 ; x++){
   pinmode(x, input);
   digitalwrite(x, high);
 }


 set_sleep_mode(sleep_mode_pwr_save);
 sleep_enable();

 serial.begin(9600);
 

 //power down various bits of hardware lower power usage
 adcsra &= ~(1<<aden); //disable adc
 acsr = (1<<acd); //disable analog comparator
 didr0 = 0x3f; //disable digital input buffers on adc0-adc5 pins
 didr1 = (1<<ain1d)|(1<<ain0d); //disable digital input buffer on ain1/0

 //setup timer2
 tccr2a = 0x00;
 tccr2b = (1<<cs22)|(1<<cs21)|(1<<cs20); /
 assr = (1<<as2);
 timsk2 = (1<<toie2);

 sei(); //enable global interrupts


}


void loop() {

 sleep_mode();
 sleep_disable();

 adcsra &= ~(1<<aden);
 acsr = (1<<acd);
 didr0 = 0x3f;
 didr1 = (1<<ain1d)|(1<<ain0d);


 if (seconds == time0){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time1){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time2){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time3){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time4){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time5){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }  

 if (seconds == time6){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time7){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time8){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time9){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time10){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }

 if (seconds == time11){
   reset_5s();
   initialize();
   serial.println("type text now");
   serialevent(); //looks serial data fixed period of time
   serial.println("going sleep now");
 }  

 if (seconds == reset){
   serial.print("this millis ");
   serial.println( millis());
   seconds = 1;
   if (midnight > 0){
     reset_5s();
     serial.println("type text now");
     serial.print("this seconds ");
     serial.println(seconds);
     serial.print("this timer before initialize ");
     serial.println(timer);
     initialize();
     serialevent(); //looks serial data fixed period of time
     serial.println("going sleep now");
     serial.print("this millis ");
     serial.println( millis());
   }
 }
}
//
// collect serial data
//

void initialize(){
 gpsdata = 0;
 gsmdata = 0;
 strend = 0;
 minutes = 0;
 hours = 0;
 timer = 0;
 i = 0;
 }



void serialevent(){
 serial.flush();
 while (timer < 5){s
   serial.print("this timer ");
   serial.println(timer);
   if (serial.available() > 0) {
     inbyte = serial.read();
     inputstring[i] = inbyte;
     serial.println(inputstring[i], byte);
     i++;
     if (inbyte == '!'){
       i = 0;
       serial.println("gpsdata 1");
       gpsdata = 1; // set gpsdata bit 1 force update gps
     }

     if (inbyte == '*'){
       i = 0;
       gsmdata= 1; // set gsmdata bit 1 force update gsm
       serial.println("gsmdata 1");
     }

     if (inbyte == '#') {
       if (gpsdata == 1){
         serial.println("went gpsdata");
         verifygps();
       }
       if (gsmdata == 1){
         serial.println("went gsmdata");
         verifygsm();
       }
     }
   }
 }
}
void verifygps(){
 serial.println("went verify gps");
 valposition = strtok(inputstring, delimiters);
 for(int = 0; < 6; i++){
   serial.print("this ");
   serial.println(i);
   interval[i] = atoi(valposition);
   serial.println(interval[i]);
   valposition = strtok(null, delimiters);
   serial.println("this interval 0");
   serial.println(interval[0]);
   //do math create seconds variable
   hours = interval[0];
   minutes = interval[1];
   hours = hours * 450;
   minutes = minutes * 7.5;
   update = minutes + hours + 5; // 5 added since seconds isnt recognized , takes time parse , update
   serial.println("this update");
   serial.println(update);
   // if update between variables updates seconds
   if (update > 0 && update < 10801){
     serial.print("this seconds before update ");
     serial.println(seconds);
     seconds = update;
     serial.print("this seconds after update ");
     serial.println(seconds);
     //timer = 40; // forces go sleep
     //dont overlap cant happen gps times
   }

   else{
     serial.println("gps data not verified , seconds not updated");
   }
 }  


}

void verifygsm(){
 valposition = strtok(inputstring, delimiters);
 for(int = 0; < 6; i++){
   serial.print("this ");
   serial.println(i);
   interval[i] = atoi(valposition);
   serial.println(interval[i]);
   valposition = strtok(null, delimiters);

 }
 if(interval[1] > 0 && interval[1] < 10802){
   midnight = interval[0];
   serial.print("this midnight update ");
   serial.println(interval[0]);
   time0 = interval[1];
   serial.print("this time0 ");
   serial.println(time0);
   time1 = interval[2];
   serial.print("this time1 ");
   serial.println(time1);
   time2 = interval[3];
   serial.print("this time2 ");
   serial.println(time2);
   time3 = interval[4];
   serial.print("this time3 ");
   serial.println(time3);
   time4 = interval[5];
   serial.print("this time4 ");
   serial.println(time4);
   time5 = interval[6];
   serial.print("this time5 ");
   serial.println(time5);
   timer = 40; //forces serial stop , go sleep
 }  
 else{
   serial.println("string did not match or time outside of range");
 }
}
//turns telit on holding pin low 5 seconds.
//uses fake_msdelay create delay no interupt generated. not accurate.
void reset_5s(){
 pinmode(a0, output);
 digitalwrite(a0, low); // needs low
 fake_msdelay(2000);
 digitalwrite(a0, high); // needs high
 pinmode(a0, input);
}

void fake_msdelay(int x){
 for( ; x > 0 ; x--)
   fake_usdelay(1000);
}

void fake_usdelay(int x){
 for( ; x > 0 ; x--) {
   __asm__("nop\n\t");
   __asm__("nop\n\t");
   __asm__("nop\n\t");
   __asm__("nop\n\t");
   __asm__("nop\n\t");
   __asm__("nop\n\t");
   __asm__("nop\n\t");
 }
}


Arduino Forum > Using Arduino > Programming Questions > Sketch resets unexpectedly


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial