sequence sur le portd

Oui ça permettra de traiter le cas B00000000 dans les entrées attendues et votre code est fonctionnel pour détecter effectivement

B00010000, B00100000, B00110000, B01000000

Comme attendu mais il va aussi dire qu’il est ok si vous faites

B00010000, B01010101, B11110101, B00100000, B00110000, B01000000

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:
Comme attendu mais il va aussi dire qu’il est ok si vous faites

B00010000, B01010101, B11110101, B00100000, B00110000, B01000000

Dans mon programme je fais:

byte pindVal = PIND & B11110000;

Je lis le port D avec PIND, j'y applique un masque AND pour éliminer les bits de poids faible, donc comment "passent" les B01010101, B11110101 ?

Cordialement
jpbbricole

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.

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.

Cordialement
jpbbricole

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

Hello

JML est dans le vrai, si l'in cite le texte du demandeur en #1

je voudrais executer une fonction à condition que le portD (en entree) recoive 4 séquences à la suite.

si une entrée non attendue arrive sur le port D, il faut remettre le compteur à 0

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
	}
}

Allez je vais faire encore mon pénible :slight_smile: mais si j’envoie la séquence

B00010000, B00100000, B00000000, B00000000, B00110000, B01000000

Qu’est-ce qu’il va se passer ?

bonsoir messieurs,

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

1ere tonalité__________2eme tonalité_______3eme tonalité_______4 eme tonalité______5ème tonalité

entre chaque tonalité il y a une pause de 135ms.

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.

cordialement,
KDH

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 ?

bonsoir

oui le signal tombe à 0 entre deux.
je gère en amont la durée du blanc et des tonalités, ca importe peu .

bonne soiree

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)

Salut J-M-L

J-M-L:
Allez je vais faire encore mon pénible :slight_smile:

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 :slight_smile: (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).

Bonsoir KdH76

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

1ere tonalité__________2eme tonalité_______3eme tonalité_______4 eme tonalité______5ème tonalité

entre chaque tonalité il y a une pause de 135ms.

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.

A ta disposition pour toute question.

Cordialement
jpbbricole

les bits 0 et 1 étant "sensibles" Tx et Rx du port série.

Ce qui explique que vous fassiez DDRD = B0000000; c’est ça ?

J-M-L:
Ce qui explique que vous fassiez

DDRD = B0000000;

c’est ça ?

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.

Cordialement
jpbbricole

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.

Cordialement
jpbbricole

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.