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?
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
Post a Comment