Par exemple —> les entrées fausses sont purement ignoreees, j’avais cru comprendre que l’OP voulait tester la séquence ie les 4 valeurs des suite dans l’ordre sans rien entre ces valeurs
J-M-L:
Que se passe-t-il avec votre programme si je balance en entrée (la valeur des pins) la séquence que j’indique ? C’est ma question.
Tu fais une simple opération booléenne avec les données de mon programme et tu as la réponse.
Pour ce qui est de la question: les 4 séquences doivent-elles être absolument en suivant, est-il toléré d'avoir de fausses valeurs ou pas dans l'ordre entre deux et si oui, que faire, seul KdH76 peut nous répondre.
J'ai exposé ma façon de voire la chose, j'ai essayé le montage "en vrai", il fonctionne à la perfection.
C’est juste mon point - il me semble que votre code ne répond pas à sa définition qui était assez précise
il faut que, dans l'ordre chronologique, ces 4 bits aient uniquementles valeurs ci dessous
Je pense que vous adressez bien maintenant la partie chronologie mais pas le besoin sur uniquement puisque d’autres valeurs intervenant dans la chronologie vont être validées par votre code
Mais vous avez raison - seul l’OP peut nous confirmer son intention
dfgh:
JML est dans le vrai, si l'in cite le texte du demandeur en #1
Alors! si @JML est dans le vrai :o , voilà la version corrigée:
#define sequNombre 4 // Nombre de séquences
byte sequEnCours; // Séquence en cours
boolean sequAtteinte; // Si séquences atteintes
byte sequValeurs[] = {B00010000, B00100000, B00110000, B01000000}; // Valeurs des séquences, sur les bits de poids fort du registre D
// Pour ne pas toucher, spécialement les bits 0 et 1 (Tx et Rx)
void setup() {
Serial.begin(115200);
DDRD = B0000000; // Port B en entrée
sequEnCours = 0;
sequAtteinte = false;
}
void loop()
{
byte pindVal = PIND & B11110000; // Pour cacher les bits inutiles
if ((pindVal == sequValeurs[sequEnCours]) && !sequAtteinte) // On met le masque sequValeurs[n] sur la valeur lue pour comparer
{
Serial.println("Sequ. attendue :\t" + String(sequValeurs[sequEnCours], BIN) + "\t " + String(sequValeurs[sequEnCours])+ "\t " + String(sequEnCours));
sequEnCours ++; // On passe à la séquence suivante, les autres sont ignorées
if (sequEnCours >= sequNombre) // Si toutes les séquences sont passées.
{
sequAtteinte = true; // Mettre cette ligne en remarque pour un cycle continuel
sequEnCours = 0; // Compteur de séquences à 0
Serial.println("\nBingo !!!");
}
}
else if(pindVal != 0 && !sequAtteinte) // Si pas dans l'ordre ou pas dans les séquences surveillées et pas 0
{
sequEnCours = 0;
Serial.println("Erreur " + String(pindVal, BIN));
}
while (pindVal != 0) // Tant que pas 0
{pindVal = PIND & B11110000;}
if (sequAtteinte) // Si toutes les séquences sont passées.
{
// Mettre, ici, l'action à exécuter
// Faire un reset pour recommencer ou enlever la remarque de la ligne ci-dessous pour un cycle continuel
//sequAtteinte = false; // Enlever la remarque pour un cycle continuel
}
}
c'est exactement ça que j'aime, la discution et le partage pour avancer, bravo.
Désolé de la réponse tardive, travail oblige, je vous explique :
je travaille dans les radiocommunications et mon projet perso consiste à recuperer des tonalitées que j'envoie en UHF, depuis un site distant (plusieurs KM), ces tonalitées qu'on appelle codes 5 tons .
chaque tonalitée à une fréquence et une durée bien précise de l'ordre de 100ms pour des fréquences autour de 1000hz.Aujourd hui j'arrive à décoder ces tonalités que j'envoie sur le portD via un module .
le reflet de la tonalité se fait sur 4bits .pour remplir la condition, il faut absolument que ces 5 tonalités se suivent l'une dernière l'autre , cela donne
Si le signal tombe à zéro entre 2 tonalités alors le code de jp est fonctionnel car un 0 est ignoré pour séparer les valeurs et n’est pas une valeur de séquence j’imagine
Est-ce que la durée de la tonalité et du blanc importe ?
Ok donc le code de JP doit fonctionner pour vous (si vos Pins tombent bien toutes à zéro exactement en même temps ou à leur valeur de séquence - Simon faudrait gérer une perdiode de stabilisation)
T'en fait pas, depuis que je t'ai croisé sur ce forum j'ai peur d'être devenu un peu maso :o
L'avantage de savoir qu'il y a deux yeux (peut être plus ?) inquisiteurs, qui regardent par dessus ton épaule va faire que je vais devenir parfait
Généralement on suit les posts auxquels on a répondu
et puis c’est bien de devenir parfait (mais pas maso, les commentaires se veulent constructifs, portent sur le code et ne sont pas un jugement de valeur ou un avis sur la personne).
KdH76:
c'est exactement ça que j'aime, la discution et le partage pour avancer, bravo.
Oui c'est super! Surtout que dans ce forum c'est pas des plus facile de s'expliquer, il y a des "gourous" qui rôdent!!!
KdH76:
le reflet de la tonalité se fait sur 4bits .pour remplir la condition, il faut absolument que ces 5 tonalités se suivent l'une dernière l'autre , cela donne
Si et seulement SI ces 5 tonalités se suivent alors on exécute la suite du programme .
je pense qu'il faut impérativement passer par un masque sur le portd pour ne prendre en compte que les 4bits.
S'il y a un passage à 0 entre chaque tonalité alors, le programme fonctionne.
Dès qu'il a une erreur (combinaison de bit "inconnue" arrivée d''une fréquence hors timing) le compteur de tonalité repart à 0 et actuellement le programme attent la première dréquence attendue.
Pour ce qui est du masque, c'est fait PIND & B11110000 pour ne garder que les 4 bits de poids fort du PORTD, les bits 0 et 1 étant "sensibles" Tx et Rx du port série.
C'est surtout pour mettre les bits en entrée. Ce que j'ai fait pour protéger les bits sensibles, c'est de décaler les bits proposés par @KdH76 dans son premier post, bits 0-3 à bits 4-7.
Moi j’aurais préféré DDRD &= B00001111;histoire de ne pas toucher des pins qui n’ont rien à voir avec ce que l’on fait - y compris Tx que vous mentionnez (et que vous passez en entrée ce qui est déconseillé dans la doc que vous avez pointée)
You should note, however, that pins 0 & 1 are used for serial communications for programming and debugging the Arduino, so changing these pins should usually be avoided unless needed for serial input or output functions. Be aware that this can interfere with program download or debugging.
DDRD is the direction register for Port D (Arduino digital pins 0-7). The bits in this register control whether the pins in PORTD are configured as inputs or outputs so, for example:
DDRD = B11111110; // sets Arduino pins 1 to 7 as outputs, pin 0 as input
DDRD = DDRD | B11111100; // this is safer as it sets pins 2 to 7 as outputs
// without changing the value of pins 0 & 1, which are RX & TX
Mais bon c’est juste moi hein - ça n’oblige personne
J-M-L:
Moi j’aurais préféré DDRD &= B00001111;histoire de ne pas toucher des pins qui n’ont rien à voir avec ce que l’on fait - y compris Tx que vous mentionnez (et que vous passez en entrée ce qui est déconseillé dans la doc que vous avez pointée)
Mais bon c’est juste moi hein - ça n’oblige personne
Oui, c'est vrai, mais j'ai lu dans la nomenclature, faudrait que je retrouve où, que si l'on se contente de faire DDRD = B00000000, tout en entrée, cela n'influence pas ceux qui sont comme Tx, en sortie.
Oui câble en dur ça va être mis comme il faut mais c’est juste pas une bonne habitude
Ensuite comme je le dis chacun fait comme il veut
Edit/ retrouvé la doc
• TXD/PCINT17 – Port D, Bit 1
TXD, transmit Data (data output pin for the USART). When the USART transmitter is enabled, this pin is configured as an output regardless of the value of DDD1.
Comme en faisant le Serial.begin() vous avez activé l’USART vous n’avez pas de soucis.