OpenDCC: Notes sur le décodage de DCC

Principe de la réception DCC:

    Essentiellement pour un décodeur la question est: comment peut-on décoder DCC ?
    DCC est en principe une Modulation de Fréquence: "1" est codé avec deux courtes impulsions (nominalement à 58 µs), "0" avec deux longuess impulsions (à 116 µs). Un décodeur doit interpréter une impulsion entre 52 µs et 64 µs comme "1", des impulsions entre 90 µs et 12ms comme "0".

    Les possibilités suivantes de décodage en résultent:
    1. Mesurer les durées d'impulsion et les comparer avec les limites spécifiées dans la NMRA.
      • Option de mise en œuvre 1: La durée de l'impulsion peut être mesurée, par exemple en utilisant le timer sur l'AVR.
      • Option d'application 2: Le signal d'entrée est échantillonné avec une routine de logiciel.
      • Evaluation : un bon enregistrement du signal (bien sûr en fonction de la fréquence d'horloge du scan), lors de la réalisation avec la mode de Capture, cependant, aussi une grande vulnérabilité aux perturbations - de courtes erreurs de signal et réflexions peuvent perturber la mesure.
        Le mode de capture provoque faible charge CPU.
        Ou mieux un échantillonnage (par exemple 100 kHz) qui est ensuite filtré - cela peut compenser des conditions de réception défavorables (par exemple coupures brèves du signal dues à des pistes sales) .
        Calcul du taux d'échantillonnage requis
        A = max. Les échantillons avec détection 1: 64µs / Period + 1
        B = min. Les échantillons avec détection 0: 90µs / Period
        Condition pour distinguer 0/1: A < B
        Bénéfice (à partir de Delta): Period < 13µs
        De plus la condition "N est un nombre naturel" doit être prise en considération à l'une des deux frontières. Comme N est un entier des parties fractionnaires semblables peuvent résulter aux deux bornes si bien que de l'autre côté de la borne la condition d'autres valeurs de Period puissent être trouvées lesquels permettent une distinction univoque.
        Pour préciser cette remarque:
        Quel est l'écart maximun entre 1.000 and 5.000: 3.998 (presque 4)
        Supposons le premier front à 1.001, et le second à 4.999 et supposons que la mesure de l'écart est un nombre entier: On trouve 4-1 = 3. Ce qui crée une erreur importante.
        Supposons le premier front à 1.001, et le second à 4.001 et supposons que la mesure de l'écart est un nombre entier: On trouve 4-1 = 3. Pas d'erreur. Partie fractionnaire semblabe.
        Sur la figure ci-dessous, quand la partie entière de la fréquence d'échantillonage est de 20us, il est possible que l'on ne puisse pas dsitinguer entre 1's et 0's dans DCC du fait de la troncature. Pour 22us, la distinction est possible , puisque les frontières ont des parties fractionnaires similaires.
        Ici vous pouvez voir que pour des périodes d'échantillonnage jusqu'à 15μs une distinction univoque 0-1 est toujours possible. Dans le domaine 17-18us et pour 22us on trouve des fenêtres qui permettent aussi une distinction. Pour les petites périodes d'échantillonnage, la différence est toujours plus grande, ce qui augmente la sécurité.
      • Filtres:
        Une amélioration significative de la réception en particulier pour les récepteurs mobiles (où même le contact roue-rail est une incertitude considérable) peut être obtenu avec un filtre passe-bas adapté dont la réponse impulsionnelle devrait être d'environ la moitié de la largeur d'un «un». Le filtre passe-bas utilisé pour augmenter l'immunité aux interférences en raison de la symétrie de DCC doit avoir une longueur impaire, par exemple 3, 5 ou 7 en longueur. La période d'intégration ne doit pas être supérieure à la demi-période minimale d'un "1" (environ 50 us). Par conséquent, il en résulte les alternatives suivantes:
          Longueur du filtre 3, Période ~ 17μs
          Longueur du filtre 5, Période <11μs
          Longueur du filtre 7, Période <7μs
        Ci-dessous est montré l'effet d'un tel filtre (L = 5) pour un signal fortement perturbé :

        Résultat: les interruptions de signaux courts sont filtrés.
        Cette méthode d'échantillonnage peut entraîner une trop grande incertitude temporelle pour le BiDi (RailCom) et n'est pas utilisable tout au moins dans la variante 22 µs.
    2. Réglage d'une durée d'impulsion moyenne entre 1 et 0 et balayage précis du signal d'entrée.
      • Possibilité de réalisation: Le signal DCC démarre l'échantillonneur (par exemple sur un front de déclenchement). Celui-ci échantillonne le signal pour une durée de 1,5 la durée d'un "1" et reconnaît ainsi, si les changements de niveau rapides (la polarité ont changé) ou les changements de niveau lents (la Polarité n'a pas changé) sont présents.Cela est possible avec les interruptions de l'AVR et des minuteries. Avantage: faible surcharge du logiciel.
      • Note: l'évaluation est relativement sûre (mesure au centre de l'oeil), mais est seulement une évaluation du signal. Si cela est perturbé, un bit erroné est détecté (mais DCC a un checksum :-) Si le scan n'est pas mis en œuvre proprement (parce que la première interruption, qui commence l'intervalle de balayage est traitée qu'après un délai, ou parce que les retards de commutation pour le front montant et descendant du signal d'entrée ne sont pas égaux), il peut également fonctionner correctement.
        Pour RailCom une détection de front est également nécessaire pour assurer la référence temporelle pour le retour (mais cela est possible)
        .
    3. Le déclenchement sur front, la comparaison directe de temps
      • Possibilité de réalisation: L'ISR reconnaît ainsi, si les changements de niveau rapides ou lents sont ajustés. Le signal DCC génère une interruption, l'heure actuelle est notée (circulaire) et et est comparé avec le temps préalable. L'ISR reconnaît ainsi, si les changements de niveau rapides ou lents sont appliquées. Avantage: faible surcharge du logiciel.
      • Note: décision relativement simple, sûre. Problèmes avec les réflexions et les interférences. Convient pour Railcom, car il existe déjà une référence du bord dur.
    4. Démodulation FM par exemple par Transformée de Fourier Discrète glissante ou par corrélation
      • Possibilité de réalisation: échantillonner le signal d'entrée de l'exemple 14.5us (qui est 0,125 * la durée totale d'un "1"). Ces huit valeurs sont ensuite corrélées avec les séquences d'impulsions qui correspondent à "1" ou "0" en fonction le décodage est donné par la déviation du corrélateur.
      • Note: décodage sûr même en signaux fortement perturbés, mais il nécessite une très grande puissance de calcul ;-) . Moins approprié pour RailCom.
        Avec un tel algorithme on tire au canon sur le moineau, tout au moins s'il s'agit du décodeur de signal; pour des décodeurs de locomotive, pour lesquels le le contact rail roue et le moteur créent des parasites, cela pourrait être absolument rationnel.
    Pour OpenDecoder (V.1) la méthode 2 est actuellement utilisée. Pour OpenDecoder (V.2) la méthode 2 est utilisée, mais à défaut, la méthode 1 (échantillonnage et filtrage) peut être sélectionnée.

La mise en œuvre de la réception DCC (méthode 2):

    Le signal DCC déclenche l'Interruption 0 de l'AVR. Dans le sous-programme de service d'interruption pour interrompre ce que la minuterie 1 est démarré. Cette minuterie 1 est programmé comme suit:

      Programmierung Timer 1
      Mode CTC Clear Timer on Compare Match: Une Interruption est déclenchée au passage du compteur à la valeur CompA et le compteur est remis à 0.
      CompA 87µs Valeur de comparaison pour la mode CTC
    Lorsque la minuterie 1 a maintenant atteint sa valeur de comparaison (TIMER1_COMPA), L'interruption est déclenchée . Dans cette routine d'interruption (ISR) l'entrée de DCC est lu en premier, puis le chronomètre est arrêté et remis à zéro. Puis, le bit lu est évaluée. Pour cela, l'ISR utilise une variable d'état Recstate . Recstate décrit où en est 'ISR dans le protocole DCC.
        variable d'état Recstate
      Etat de l'ISR
      WF_PREAMBLE attendre la réception complète du préambule (au moins 10 fois "1")
      WF_LEAD0 d'attente pour le premier "0" qui indique le début d'un message.
      WF_BYTE attendre la réception complète de l'octet. Reste dans cet état pour 8 bits
      WF_TRAILER Attendent le bit de séparation définitif d'un octet.
      Est-ce «0», suivi par un autre octet - l'Etat remonte à WF_BYTE
      Est-ce bit de séparation "1", de sorte qu'un message complet est reçu.
    Si un message complet a été reçu, le drapeau est mis à C_received, ce qui déclenche alors le programme principal pour tester et évaluer ces message DCC.

La mise en œuvre de la réception DCC (méthode 1):

    La minuterie est programmé de telle sorte qu'une interruption est déclenchée chaque 10µs. Dans le sous-programme d'interruption, la valeur du signal DCC est lue et introduite dans un filtre passe-bas de longueur 5.

    La sortie du filtre peut maintenant prendre des valeurs de 0 à 5, où une majorité de valeurs 0,1,2 indiquent "LOW", les valeurs 3,4,5 indiquent «HIGH».
    Si la sortie de filtre change de polarité, un passage de zéro du signal de DCC est reconnu.On peut utiliser un seul sens pour le changement de polarité ou comme ici les deux directions. Si le temps depuis le dernier changement de polarité est < 70us, la moitié d'une DCC "1" a été reconnue.
    Ce quartet est maintenant reconnu comme évalué. Pour cela, l'ISR utilise une variable d'état Recstate. Recstate décrit où en est 'ISR dans le protocole DCC.
        variable d'état Recstate
      Etat de l'ISR
      WF_PREAMBLE attendre la réception complète du préambule (au moins 20 fois "demi" 1)
      WF_LEAD0 attendre pour le premier "0" qui indique le début d'un message.
      WF_SECOND_HALF attendre le deuxième demi-bit. Il doit avoir la même valeur qe le premier demi-bit.
      WF_BYTE attendre la réception complète d'un octet. Rester dans cet état pour 8 bits et après chaque bit l'état WF_SECOND_HALF zuästzlich est activé pour contrôler le deuxième demi-bit.
      WF_TRAILER attendre le bit de séparation définitif d'un octet.
      Si c'est "0", un autre octet suit - l'état est de nouveau sur WF_BYTE+WF_SECOND_HALF.
      Si est ce bit de séparation est "1", un message complet est reçue.
    Si un message complet a été reçu, le drapeau est mis à C_received, ce qui déclenche alors le programme principal pour tester et évaluer ces message DCC.