INPUT_PULLUP ...Encore...

Bonjour à tous,
Et ben c'est pas gagné. Etat des lieux:
pin22 c'est l'inter qui passe en marche forcée; ça marche.
Les pins de A2 à A15 qui ne sont pas actives (actives à: "0"), sont en l'air.
La question: Pourquoi avec une combinaison fixe j'ai des valeurs qui varient au sérial ?
et qui de plus vont taper dans les 12000, alors que je n'ai que le 4ème bit à "1" (inversé par " ~" au stockage dans InAna[].
Les parties de code concernées:

//......Déclaration......
int anaPins[14] = { A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15 }; //pins marche forcee 
byte AnaTemp = 0;
int InAna[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int combi = 0;
..........
//.......Void setup.....
........
  for (int i = 0; i < 14; i++) {
    pinMode(anaPins[i], INPUT_PULLUP); //Marche forcee 
    digitalWrite(anaPins[i],HIGH);
  }
  pinMode(22, INPUT_PULLUP); //pin Force
  digitalWrite(22, HIGH);
.........
}
//........void loop.......
       if(digitalRead(22)==LOW){ //test Marche forcee ->OK
          Mforce();
       }
.........
//.......Marche forcée......
void Mforce(){
    while(digitalRead(22)==LOW){ // L'inter de commande
      combi=0;
       for (int i = 0; i < 14; i++) {
       AnaTemp = analogRead(anaPins[i]); //lecture anaPins (variable temporaire)
       InAna[i] = ~ AnaTemp; //Inversion + Stockage
       }
       for (int i = 0; i < 14; i++) { 
       combi += InAna[i] << i; // convers decimal combi entree
       }
              Serial.println(combi); // A supprimer*************
              delay(1000); // A supprimer*************
//...Suit un switch dont les cases envoient à des fonctions....
} //Fin switch
} //Fin while
} //Fin void Mforce

Merci d'avance.

Carolyne:

pinMode(22, INPUT_PULLUP); //pin Force

digitalWrite(22, HIGH);

Je ne comprend pas bien la manip (j'ai peut etre loupé qq chose)
tu declare la 22 en entrée avec un pull up et aussitot derriere tu viens essayer d'ecrire en sortie avec un digitalWrite ?
il en fait quoi le digitalWrite du Pullup precedent ? :grin:

Ah oui, d'accord. On ne peut pas "fixer" l'état d'une entrée par un Write. C'est le PULLUP qui mets HIGH.
Mais qu'est-ce qui foire dans ma while ?

Carolyne:
Ah oui, d'accord. On ne peut pas "fixer" l'état d'une entrée par un Write. C'est le PULLUP qui mets HIGH.
Mais qu'est-ce qui foire dans ma while ?

aucune idée , je n'ai (meme) pas regardé :grin:
les problemes se resolvent pas à pas 8)
commence déjà par verifier/stabiliser tes entrées, ensuite tu verifiera l'influence

Pour pallier aux valeurs aléatoires des analog "en l'air", j'ai intercalé ça juste après la lecture:

if(AnaTemp!=0){
AnaTemp=1;
}
J'ai maintenant une valeur fixe, qui ne bouge plus même en variant la combi d'entrée, et qui est de - 32766

aucune idée , je n'ai (meme) pas regardé smiley-mr-green

Grrrr ! [smiley: Pistolet à bouchon !]
Bon, je vais essayer de solutionationner pa t-à patte.

Carolyne:

//.......Marche forcée......

void Mforce(){
    while(digitalRead(22)==LOW){ // L'inter de commande
      combi=0;
       for (int i = 0; i < 14; i++) {
       AnaTemp = analogRead(anaPins[i]); //lecture anaPins (variable temporaire)
       InAna[i] = ~ AnaTemp; //Inversion + Stockage
       }

Le problème est dans cette partie de code.
Et en plus il y a 2 erreurs:

  1. tu fais un analogRead alors que tes pins sont en digital. L'analogRead retourne un peu n'importe quoi du coup. Pour cette erreur là tu peux te mettre une claque c'est une étourderie.
  2. tu complémentes le résultat. Si tu avais fait un digitalRead tu aurais eu en retour soit 0 pour un niveau bas, soit 1 pour un niveau haut. Après complément:
    le 0 devient 0xFF soit 255
    le 1 devient 0xFE soit 254
    Je te laisse faire le calcul pour comprendre ce que cela donne dans la suite de ta fonction.
    Donc règle importante toujours appliquer un masque sur les valeurs lorsque tous les bits ne sont pas significatifs.
//.......Marche forcée......
void Mforce(){
    while(digitalRead(22)==LOW){ // L'inter de commande
      combi=0;
       for (int i = 0; i < 14; i++) {
       AnaTemp = digitalRead(anaPins[i]); //lecture anaPins (variable temporaire)
       InAna[i] = ~ AnaTemp & 0x01 ; //Inversion ,ne conserve que le poids faible + Stockage
       }

Oh ! Gros merci fdufnews ! Mon sauveur ! :stuck_out_tongue:
Mais que veux-tu dire par "je complémente" ?

Bonjour,
Tu as une explication ici : Complément à deux — Wikipédia

Re,
Mauvaise réponse 20 sec après

icare:
Bonjour,
Tu as une explication ici : Complément à deux — Wikipédia

Mauvaise pioche, cette fois c'était le complément à un.
Mais cela fera quand même un peu de lecture pour Carolyne. Elle adore ça. Et ça nous évitera peut être une autre question :smiley:

Oh p'tain ! ça c'était la question qu'il ne fallait pas poser. :stuck_out_tongue_closed_eyes:
J'ai enregistrée votre page de Wikipédia cette magouille infernale. C'est pas de la lecture ! c'est du Champollionage ]:slight_smile: (Champollion: 23-12-1790/04-03-1832. A compris l'incompréhensible.)
Bon, fdufnews, ton truc marche bien; les valeurs sont cohérentes.
Mais il reste un soucis: Les trois premiers inverseurs (A0; A1; A2) ne sont pas lus (renvoient "0")., bien que le contact soit bon (les leds que j'ai branchées en // s'allument) ça commence à 1 sur le 4ème inverseur, après ça continue bon (2; 4; 8; 16..ext)
ça ne peut venir que des contacts sur la carte. Je sens que ça va finir avec des soudures et des petits dominos, la carte va ressembler à un poulpe, mais au moins je ne serai plus em****dée.
En tous cas gros merci, je n'aurais jamais pu y arriver seule, rapport au: "& 0x01". Ces manips de bits, c'est vraiment pas évident.

Mauvaise analyse du problème.
Je suis un peu pris par le temps
L'erreur est là

       for (int i = 0; i < 14; i++) { 
       combi += InAna[i] << i; // convers decimal combi entree
       }

Réponse plus tard quand j'aurais de la disponibilité
J'étais tellement pris par le temps que j'ai écrit une co...ie

Ok, merci, je vais cogiter ça. .....à+.

J'ai repris mot pour mot la procédure qui marche à merveille dans mon autre montage (12 bits découpés par paquets de 4)
for( x=0; x<4; x++){
somunit += invbin[x] << x; // BON
}
J'ai donc réduit la conversion à 4 bits; ça n'y change rien.
C'est à croire que c'est les noms de pins (A0; A1) qui ne sont pas bons.
J'ai aussi testés en continuité que l'info arrive bien jusqu'à la carte, et "assuré" au niveau contacts-carte.

En même temps dans le code de départ il n'y a ni A0, ni A1. Si tu n'as rien changé c'est normal que tu ne lises rien

Ah ! ça y'est j'ai trouvé la c***ie. J'ai branché A0, A1 et j'ai déclaré à partir de A2. Quelle cne ! :blush:
Toutes mes excuses pour le dérangement et encore merci pour la magouille du: & 0x01. Sans laquelle l'univers ne serait pas ce qu'il est.

Bon moi je retourne à Star Wars.

Bonne soirée