Convertir une séquence d'impulsions en bits

Bonsoir tout le monde,

A l'entrée de l'Arduino, j'ai une séquence de 15 impulsions. Le niveau haut d'une impulsion dure 45us tandis que le niveau bas dure 100us. La présence de l'impulsion indique que le bit est égal à 1 et son absence est équivalente à 0. La première et la dernière impulsion indiquent le début et la fin de la séquence.

Voilà, je ne sais pas comment récupérer les 13 bits pour pouvoir les exploiter après.

Je vous remercie d'avance pour votre aide.

ça ressemble à une liaison série asynchrone

si tu n’as pas de point de repère indiquant l’arrivée du premier bit, je ne vois pas comment tu peu synchroniser l’acquisition de tron train d’impulsion (surtout si le premier bit est à 0)

il te faut impérativement avoir un start bit à 1

si tu peu avoir cette information (start bit à 1) une des solutions consisterait à :

  • configurer une entrée avec génération d’interruption pour détecter le start bit
  • une fois le start bit détecté, attendre 22.5 µs (la moitié de la durée de présence du bit)
  • attendre 13 fois 145µs (100 + 45µs)
    et à chaque fois lire la valeur de l’entrée
    stocker le résultat
  • reconstruire la valeur finale avec le résultat des 13 acquisitions

pour les temporisation, tu peu utiliser un compteur/timer avec génération d’interruption, sur le même principe que du PWM

tu parles d’une liaison avec 15 bits, dont 13 seulement contiennent l’information.
il semblerait que tu aies 1 start bit et un stop bit
si c’est le cas, tu peu faire l’acquisition sur 14 bits, ce dernier devant impérativement être à 1, mais ne devant pas être utilisé pour reconstituer le valeur transmise

Je te remercie pour ta réponse.

Alain46: tu parles d'une liaison avec 15 bits, dont 13 seulement contiennent l'information. il semblerait que tu aies 1 start bit et un stop bit

C'est exactement ça. Le start bit et le stop sont toujours égales à 1.

Pour le start bit, j'ai pas compris pourquoi il faut attendre la moitié de la durée de présence du bit.

Si j’ai bien compris, ton chronodiagramme doit ressembler à l’image jointe

Si le point A est le point correspondant au temps T0
Le point F doit si situer à 45µs du point A
Le point C doit se situer à 100µs du point F, et donc à 145µs du point A

Donc si tu arrives à capturer le point A (avec une interruption sur un front montant, par exemple), tu peu définir la base de temps pour controler la présence d’un bit à 0 ou 1 toutes les 145 µs

Le problème, c’est que si tu controle l’état 0 ou 1 du point C à 145µs du point A, tu n’est pas sûr de ce que tu mesures. Il suffit qu’il y ait un décalage de temps de la part de l’émétteur, ou dans ta base de temps, ou que le signal ne soit pas encore dans un état stable, et tu récupère à peu près n’importe quoi.

Pour ça, dès que tu détecte le point A, tu attends 22.5µs (point B). 22.5µs c’est la moitié de la durée de l’état stable de ton impulsion
A partir de la tu peu controler l’état du signal toutes les 145µs, ce qui correspond aux point B, D et E du schéma

Evidemment tu fais le controle 14 fois, une fois pour chaque bit, mais tu ignores la 14eme mesure qui correspond au stop bit

Reste après à savoir si c’est le MSB ou le LSB qui est envoyé en premier pour calculer la valeur reçue

Merci pepe pour ton approffondissement

La méthode de recalibrer la temporisation à chaque front montant est bien plus sure, puisque, en gros, le récepteur se cale sur l'horloge de l'émetteur.

Mais tous les bits transmis ne sont pas à 1, et plus in y a de bits à 0 successifs, plus il y a de chance de dériver. Paradoxalement c'est quand tous les bits sont à zéro que l'on a 100% de certitude que la valeur reçue soit correcte.

Il n'y a pas d'explication, dans le post d'ocay, sur son projet. Dans le cas où l'information transmise doit impérativement être reçue correctement, et avec une incertitude sur la qualité de l'information, il serait peut-être nécessaire de transmettre plusieuirs fois la même information et de comparer les résultats pour savoir si l'information est fiable

D’abord, je vous remercie énormément pour vos réponses et vos explications riches en informations.

J’ai pu écrire un code qui utilise la méthode donnée par Alain46, et effectivement l’information que je reçois est parfois erronée et parfois il y a des bits qui oscillent entre 0 et 1.

Si j’ai bien compris votre méthode pepe, il s’agit de détecter le premier front montant et d’enregistrer le temps avec millis() puis au prochain front montant on fait la différence avec la valeur enregistrée ce qui donne la durée entre les deux fronts. Si cette durée est égale à 145us alors le deuxième bit est égal 1. Si elle est égale à 145us * 2 = 290us alors le 3éme bit est égal à 1 et le 2éme à 0 et ainsi de suite.

Pour plus de détail sur mon projet, j’essaye de simuler la réponse d’un transpondeur en mode A. Dans ce mode le transpondeur transmet un code d’identification de 4 chiffres, chaque chiffre est codé sur 3 bits (donc de 0 à 7). Ce qui donne 12 bits auxquels on ajoute le start bit et le stop bit et un bit au milieu qui n’est pas utilisé. L’image ci-dessous montre le placement des bits. A est le premier chiffre (le plus à gauche), B le deuxième, etc.