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
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 ?
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é
les problemes se resolvent pas à pas 8)
commence déjà par verifier/stabiliser tes entrées, ensuite tu verifiera l'influence
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:
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.
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
}
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
Oh p'tain ! ça c'était la question qu'il ne fallait pas poser.
J'ai enregistrée votre page de Wikipédia cette magouille infernale. C'est pas de la lecture ! c'est du Champollionage ] (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.
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.
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 !
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.