Problème de code.

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);
}
//==============================================================

bonjour,
relis bien ton code

// Cas numéro 3 = ok ------------------------
  if(sysex[10] < 0x13 && cvflag[CN] == 0)
// Cas numéro 4 = ne fonctionne pas ---------
 if(sysex[10] < 0x13 && cvflag[CN] == 0)

ca serait pas la même chose dans le if?

idem pour le 1 et 2
en fait, tu n'as que deux if qui fonctionnent (1-3), les autres ne font rien si je comprends bien ton code

Il faut utiliser chaque cas indépendamment des autres, un seul à la fois puisqu'ils sont censés faire tous la même chose.

hello, modifié pour visu et chargé dans nano
testes ce code, attention, remets tes affectations pour le LCD
lances le et regarde ton moniteur en115200

c'est le 2 qui ne laisse pas entrer dans son if, car la condition est verrouillée par le 1

idem pour le 4 avec le 3

//==============================================================
// 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(8, 9, 4, 5, 6, 7);
byte f19 = 0;
byte cv19 = 0;
byte cvpatch[127];
byte cvflag[127];
byte sysex[127];
byte CN = 19;
//==============================================================
void setup()
{
  
Serial.begin(115200);        
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);
  Serial.print("1");Serial.println(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);
  Serial.print("2");Serial.println(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);
  Serial.print("3");Serial.println(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);
  Serial.print("4");Serial.println("end");
  }
 
  lcd.print("  END");
  int a = 0; do{} while(a == 0);
}
//==============================================================

Il y a dèjà un problème de bornes ici

byte cvpatch[127];
byte cvflag[127];
...

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

if(sysex[10] < 0x13 && f19 == 0)

Personnellement j'écrirais plutôt

if( (sysex[10] < 0x13) && (f19 == 0) )

Merci à tous.
Merci Alain46 pour les remarques pertinentes et la correction de mon bug.