Bonjour à tous,
Je vous soumets le problème suivant qui me rend fou.
Le code présenté permet d'afficher sur un LCD "TEST " puis la valeur 35 puis " END"
Dans les cas 1, 2 et 3 du code, cela fonctionne bien mais dans le cas 4 (qui fait la même chose), le programme plante. Il n'y a même rien affiché sur le LCD.
J'ai testé avec une UNO et une MEGA et avec le logiciel Arduino sur mac et pc dans différentes versions y compris la dernière v1.6.7. Je précise qu'il n'y a pas d'erreur de compilation.
Il faut bien sur n'utiliser le code que de l'un des cas à chaque fois.
Merci pour votre aide.
Philippe.
//==============================================================
// PHM FACTORY
// 05/03/2016
// 1 x Carte Arduino Uno (mais même problème avec Mega)
// 1 x Carte Midilickuino utilisée pour interface LCD
// 1 x LCD 2x16
//==============================================================
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);
byte f19 = 0;
byte cv19 = 0;
byte cvpatch[127];
byte cvflag[127];
byte sysex[127];
byte CN = 19;
//==============================================================
void setup()
{
sysex[10]=0x08;
sysex[12]=0x02;
sysex[13]=0x03;
for(int x = 0 ; x < 128; x++) {cvpatch[x] = 0; cvflag[x] = 0;}
lcd.begin(16,2); lcd.clear(); delay(1000); lcd.print("TEST ");
}
//==============================================================
void loop()
{
// Cas numéro 1 = ok -------------------------
if(sysex[10] < 0x13 && f19 == 0)
{
cv19 = ((sysex[12] * 16) + sysex[13]);
f19 = 1;
lcd.print(cv19,DEC);
}
// Cas numéro 2 = ok ------------------------
if(sysex[10] < 0x13 && f19 == 0)
{
cvpatch[CN] = ((sysex[12] * 16) + sysex[13]);
f19=1;
lcd.print(cvpatch[CN],DEC);
}
// Cas numéro 3 = ok ------------------------
if(sysex[10] < 0x13 && cvflag[CN] == 0)
{
cv19 = ((sysex[12] * 16) + sysex[13]);
cvflag[CN] = 1;
lcd.print(cv19,DEC);
}
// Cas numéro 4 = ne fonctionne pas ---------
if(sysex[10] < 0x13 && cvflag[CN] == 0)
{
cvpatch[CN] = ((sysex[12] * 16) + sysex[13]);
cvflag[CN]=1;
lcd.print(cvpatch[CN],DEC);
}
lcd.print(" END"); int a = 0; do{} while(a == 0);
}
//==============================================================
void setup()
{
...
for(int x = 0 ; x < 128; x++) {cvpatch [ x ] = 0; cvflag [ x ] = 0;}
Si x est bien inférieur à 128, il est égal à 127
Le premier élément d'un tableau à pour indice 0
donc l'indice 127 est en 128eme position et hors du tableau
D'autre part dans le cas de test multiples dans une condition if()
prend l'habitude d'utiliser des () pour ne pas laiser le compilateur interpréter la ligne comme il en a envie, même si l'on suppose que les priorités sont respectées par le compilateur