Décodage signal

Bonjour,
Je cherche a décoder un signal particulier.
Un 0 est représenté par une periode de 600 hz.
Un 1 est représenté par une période de 1200hz
Avec pulsein je récupère les durées .
Le souci c'est que le ne peux lire le durées que soit pour l' état haut ou bas
Les etat alterne successivement haut bas, bas haut.
Est il possible de récupérer la fréquence plutôt que la durée de l' état?

Merci d'avance

Les signaux à 600 et 1200 Hz sont-ils centrés sur 0V ( c'est à dire compris entre -V et +V) ou sont-ils compris entre 0V et + 5V ?

Une carte arduino ne doit pas recevoir de signaux négatifs.
Si c'est le cas il faudra ajouter un circuit d'adaptation.

Donne plus de détails.

Merci pour votre réponse.

Oui c’est du 0, 5v
mais le codage ne se fait pas sur 0-5v, mais codé en modulation de fréquence (en signal carré).
voici le test que je fait, mais je perd des bits :

    if (digitalRead(pin) == LOW) { 
      duration = pulseIn(pin, LOW, 0);}
    else if (digitalRead(pin) == HIGH) { 
      duration = pulseIn(pin, HIGH, 0);}

Ci joint le principe de codage
Ghislain.

2015-12-23_09h59_47.png

Je pense qu’il faut utiliser une interruption plutôt que pulseIn().
En utilisant une impulsion sur tous les fronts, tu comptes le temps entre 2 interruptions (en utilisant micros()).

Merci pour cette piste.

par contre micros() me retourne des valeurs énorme.

Ce que tu veux faire est très ressemblant avec la gestion du capteur de température DH22 (AM2302) --> voir la lib
Dans ce capteur un bit d'information est constitué d'un élément binaire (eb) 0 suivi d'un eb 1
Codage :
bit 0 = eb0 + eb 1 plus court que l'eb 0
bit 1 = ebo + eb 1 plus long que l'eb 0.
Les durées sont détectées par des boucles while.

Tu n'es pas obligé d'utiliser millis() comme dans la lib du dht22.
A la place tu peut utiliser le registre compteur (TCNTx) d'un timer .
Le compteur d'un timer (registre TCNTx) peut de mettre à 0 quand on veut et se lire quand on veut.
Le pas de comptage d'un timer dépend de sa fréquence horloge qui est réglable.
Grosso modo c'est le principe de millis() ou plutôt millis utilise ce principe.
millis () est complexe car elle est prévue pour mesurer des temps très grand, elle doit donc gérer les passages à zéro du compteur du timer.
Dans ton cas il n'y a pas cette difficulté : il suffit de faire une raz du registre compteur avant de commencer une détection.
Ex
//Détection d'un 1L
TCNT1 =0; // raz du timer 1
while (le signal est 1)
{ gestion d'un timeout par sécurité}
T1 = TCNT1;
DT = T1 ;
// gestion etc......

// Détection du zéro qui suit :
TCNT1 =0; // raz du timer 1
while (le signal est 0)
{ gestion d'un timeout par sécurité}
T2 = TCNT1;
DT = T2 ;

Pour utiliser les timers il faut lire la datasheet du micro-contrôleur utilisé.