[Non réglé] : exécution du programme non fonctionnel

Bonjour,

je viens vers vous pour trouver de l'aide sur mon projet de chronomètre à base de barrière infrarouge.

carte débarquée
cible arduino mini pro
capteur IR tsop1738
LCD 16x2 en I2C

carte embarqué
cible arduino mini pro
émetteur IR

fonctionnel:
une carte embarquée émet un code en IR.
La carte débarqué reçoit le signal IR, récupère le code IR et stocke le temps du passage.

je vous expose la problématique:

lors de la compilation je n'ai aucune erreur de code et la taille total du code est inférieur au max de la mémoire ("Taille binaire du croquis : 22 730 octets (d'un max de 30 720 octets)")

lors de l'exécution, le système plante royalement et impossible de comprendre pourquoi.

J'ai testé sur une cible arduino mega AT1280 et là tout est fonctionnel.

pouvez vous m’éclairer? je suppose un problème de mémoire, sachant que j'ai déjà fait très attention à stocker les gros volumes dans la mémoire programme avec "PROGMEM".

H_Power:
...
lors de l'exécution, le système plante royalement et impossible de comprendre pourquoi.
...

bonjour
Scientifiquement , un "plantage royal" ce n'est pas très "parlant" :grin:
symptomes sur la cible ?

Parfois "void setup()" n'arrive pas à s'exécuter complètement et plante entre 2 config d'interruption.
parfois c'est dans le programme même (pas d’acquisition de la roue codeuse ou pas d'affichage ou fonctionnement incohérent.

voici le code du setup
"
void setup()
{
#if DEBUG_TO_SERIAL
Serial.begin(57600);
Serial.println("start init");
#endif

// initialize variable
for(uint8_t i=0;i<Size_Mark;i++)
{
Time_Mark*=0;*
Time_Int*=0;
_
} *_

* for(uint8_t m=0;m<10;m++)
_
{_
for(uint8_t i=0;i<Size_lap;i++)
_
{_
IR_count[m].Time_Lap=0;
_ }
}*_

* // attach interruptions*
* pinMode(IRreceive_pin, INPUT);
attachInterrupt(0, IRreceive_acquisition_Rising,RISING); // add more attachInterrupt code as required*

* //attachInterrupt(0, &IRreceive_acquisition_Falling,FALLING);
pinMode(Switch_pin, INPUT);digitalWrite(Switch_pin, HIGH);
_ attachInterrupt(1, blinking, FALLING);*_

* // load EEPROM*
* IR_config.nbrs_ID=EEPROM.read(EEPROM_nbrs_ID);
for(uint8_t i=0;i<10;i++)
_ {_
IR_count.ID=EEPROM.read(EEPROM_ID1+i);
_ }_
IR_config.Time_disengage=EEPROM.read(EEPROM_Time_disengage);
IR_config.Time_race=(long)(EEPROM.read(EEPROM_Time_race)10);
IR_config.Start_Mode=EEPROM.read(EEPROM_Start_Mode);

* for(uint8_t i=0;i<4;i++)
_ {_
IR_config.BT_Name=EEPROM.read(EEPROM_BT_Name_0+i);
IR_config.BT_Code=EEPROM.read(EEPROM_BT_Code_0+i);
_ }*_

* lcd.begin(16,2); // initialize the lcd for 16 uint8_ts 2 lines, turn on backlight*
}
"

est ce correct le code suivant:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Encoder.h>
#include <avr/pgmspace.h>

#define DEBUG_TO_SERIAL 1

#define IRreceive_pin 2
#define Batt_pin A0
#define Switch_pin 3
#define encoder_A_pin 4
#define encoder_B_pin 5
//#define SAD_pin A4
//#define SCL_pin A5

// EEPROM adress
#define EEPROM_nbrs_ID 0
#define EEPROM_ID1 1
#define EEPROM_ID2 2
#define EEPROM_ID3 3
#define EEPROM_ID4 4
#define EEPROM_ID5 5
#define EEPROM_ID6 6
#define EEPROM_ID7 7
#define EEPROM_ID8 8
#define EEPROM_ID9 9
#define EEPROM_ID0 10
#define EEPROM_Time_disengage 11 // 1/10 time => Time_race=30 => real time = 300s
#define EEPROM_Time_race 12
#define EEPROM_Start_Mode 13
#define EEPROM_BT_Name_0 14
#define EEPROM_BT_Name_1 15
#define EEPROM_BT_Name_2 16
#define EEPROM_BT_Name_3 17
#define EEPROM_BT_Code_0 18
#define EEPROM_BT_Code_1 19
#define EEPROM_BT_Code_2 20
#define EEPROM_BT_Code_3 21

#define Size_Mark 20
#define Size_lap 50

struct IR_Data {
uint8_t ID;
uint16_t Time_Start;
uint16_t Time_Lap[Size_lap];
uint16_t nbrs_laps;
};

struct IR_Setting
{
uint8_t nbrs_ID;
uint8_t Time_disengage;
uint16_t Time_race; // 1/10 time => Time_race=30 => real time = 300s
uint8_t Start_Mode;
uint8_t BT_Name[4];
uint8_t BT_Code[4];
};

// define Encoder
Encoder myEnc(encoder_A_pin, encoder_B_pin);

//define LCD donfig
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

int16_t Time_Mark[Size_Mark];
int16_t Time_Int[Size_Mark];
uint16_t Time_Rising =0;
uint16_t Time_Falling =0;
uint8_t Count_tick=0;
boolean Flag_start=false;
boolean Flag_end=false;
boolean Decoded=false;
boolean MODE=true;
double ratio_batt=0.23275;
boolean Exit_Lap_count=true;
boolean Exit_setup=true;
boolean Exit_display=true;

//define IR data
IR_Data IR_count[10] PROGMEM;
IR_Data IR_received PROGMEM;
IR_Setting IR_config PROGMEM;

yep!

Peux-tu mettre la totalité de ton code entre balise [code][/code] pour plus de lisibilité svp ?

@+

Zoroastre.

Tout d'abord merci pour vos réponses.

je vais mettre la partie avant le void setup pour plus de lisibilité

il se peut qu'il y est des changements car j'essais résoudre le problème.
par contre je n'arrive pas à tout mettre d'un coup à cause de la taille du fichier

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
//#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
#include <avr/pgmspace.h>

#define DEBUG_TO_SERIAL 1

#define IRreceive_pin 2
#define Batt_pin A0
#define Switch_pin 3
#define encoder_A_pin 4
#define encoder_B_pin 5
//#define SAD_pin A4
//#define SCL_pin A5

// EEPROM adress
#define EEPROM_nbrs_ID 0
#define EEPROM_ID1 1
#define EEPROM_ID2 2
#define EEPROM_ID3 3
#define EEPROM_ID4 4
#define EEPROM_ID5 5
#define EEPROM_ID6 6
#define EEPROM_ID7 7
#define EEPROM_ID8 8
#define EEPROM_ID9 9
#define EEPROM_ID0 10
#define EEPROM_Time_disengage 11 // 1/10 time => Time_race=30 => real time = 300s
#define EEPROM_Time_race 12
#define EEPROM_Start_Mode 13
#define EEPROM_BT_Name_0 14
#define EEPROM_BT_Name_1 15
#define EEPROM_BT_Name_2 16
#define EEPROM_BT_Name_3 17
#define EEPROM_BT_Code_0 18
#define EEPROM_BT_Code_1 19
#define EEPROM_BT_Code_2 20
#define EEPROM_BT_Code_3 21

#define Size_Mark 20
#define Size_lap 10

struct IR_Data {
uint8_t ID;
uint16_t Time_Start;
uint16_t Time_Lap[Size_lap];
uint16_t nbrs_laps;
};

struct IR_Setting
{
uint8_t nbrs_ID;
uint8_t Time_disengage;
uint16_t Time_race; // 1/10 time => Time_race=30 => real time = 300s
uint8_t Start_Mode;
uint8_t BT_Name[4];
uint8_t BT_Code[4];
};

int Time_Mark[Size_Mark];
uint16_t Time_Int[Size_Mark];
uint16_t Time_Rising =0;
uint16_t Time_Falling =0;
uint8_t Count_tick=0;
boolean Flag_start=false;
boolean Flag_end=false;
boolean Decoded=false;
boolean MODE=true;
double ratio_batt=0.23275;
boolean Exit_Lap_count=true;
boolean Exit_setup=true;
boolean Exit_display=true;

//define IR data
IR_Data IR_count[10] PROGMEM;
IR_Data IR_received PROGMEM;
IR_Setting IR_config PROGMEM;
// define Encoder
Encoder myEnc(encoder_A_pin, encoder_B_pin);

//define LCD donfig
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

pour reprendre pepe. je soupçonne fortement que la source d'erreur vient bien:
"IR_Data IR_count[10] PROGMEM;
IR_Data IR_received PROGMEM;
IR_Setting IR_config PROGMEM;"

mais je n'ai pas de retour d'erreur du compilateur.

Par contre si j'ai bien compris, je ne peux pas utiliser la mémoire programme pour stocker des variable.
Comment je peux faire pour stoker ces 3 structures sans dépassement de mémoire?

bon après une lecture de ce site (link) je comprend mieux pourquoi ça plante de manière anarchique sur mes différents tests mais aussi pourquoi cela ne fonctionne pas avec PROGMEM.

il ne me reste plus que l'eeprom.
si toute fois vous avez des solutions pour stocker un grand volume de données, je suis preneur.

WIP

Si tu nous mettais ton code en pièce jointe on y verrait plus clair. A vue de nez, au vu du morceau de code que tu montres, je n'ai pas l'impression d'un si gros volume de RAM consommée par ton application.