Discussions Générales > Bus DCC

Une station DCC compatible RailCom

<< < (2/14) > >>

bobyAndCo:
Voila un code opérationnel pour une centrale DCC sur ESP32 compatible RailCom.

Pour l'instant, seule la liaison Serial est opérationnelle.

Je précise à nouveau que pour des raisons de compatibilité, j'ai repris le protocole de communication de DCC++ du type <t 4 31 100 1> pour la traction ou <f 31 144> pour les fonctions (Fonctions FL à 12) pour le moment. Cela veut dire que toutes les stations de commandes qui sont compatibles avec DCC++ le sont avec ce programme. C'est particulièrement vrai pour JMRI qui a été utilisé pour les tests.

Attention, la gestion des surtensions et des courts circuits n'est pas implantée, soyez vigilants si vous faites des tests.

Railcom est opérationnel.

Ma prochaine étape sera d'implanter le WiFi.

Merci à ceux qui veulent bien tester et faire des retours.

trimarco232:
Bonjour,
bravo !
2 questions :
- quel est le timing du cutout dans la séquence des bits du preamble (suis pas cap. de le lire précisément dans ton programme) ?
- quel dispositif pour lire les réponses des décodeurs ?

bobyAndCo:
Le cutout, comme toutes les trames DCC est généré dans la méthode sous interruption void IRAM_ATTR DCC::interrupt(void)

C'est une méthode callback passée à la fonction timerAttachInterrupt et appelée toutes les 28µs (Pascal Barlier suggère 29µs mais bon... dans mon cas ça fonctionne) 28µs correspond à 1/4 de trame pour le bit 1.


--- Code: ---  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &DCC::interrupt, true);

  timerAlarmWrite(timer, 28, true);
  timerAlarmEnable(timer);
--- Fin du code ---

Dans la méthode interrupt, toutes les 28µs, un compteur est décrémenté et, tant qu'il est supérieur à 0, la pin brake est maintenu à LOW


--- Code: ---case DCC_CUT_1: // 1/2 bit : zone de coupure
      switch (m_dataMode)
      {
        case DCC_PACKET_CUTOUT :
          if (!--m_cutoutCount)
          {
            m_dataMode = DCC_PACKET_HEADER;
            m_headerCount = DCC_HEADER_SIZE;
            digitalWrite(PIN_BRAKE, LOW);
          }
          else
            digitalWrite(PIN_BRAKE, HIGH);
          break;
        default :
          m_cut = DCC_CUT_0;
      }
--- Fin du code ---

La méthode interrupt se comporte comme une machine d'état qui toutes les 28µs positionne les pins en fonction des combinaisons de variables.

Comme j'ai pu le préciser un peu plus haut, je n'ai pas implanté les fonctions pour lire ou écrire dans les décodeurs. Je cherche avant tout à réaliser des tests de détection RailCom.

Dans l'ensemble, les méthodes de mes classes sont du "copié-collé" de ce qu'a écrit Pascal Barlier avec des adaptations bien sûr. Il ne serait pas très compliqué d'adapter le code de lecture écriture de CV à mon propre code.

Et comme, je le rappelle, j'ai adopté la messagerie de DCC++, il suffit donc d'utiliser une application compatible DCC++ (comme JMRI) pour cela.

trimarco232:
ok, merci

msport:

--- Citation de: trimarco232 le janvier 15, 2022, 08:13:02 pm ---... lire les réponses des décodeurs ?

--- Fin de citation ---

 les réponses RailCom des décodeurs ? : le at-retour de Pascal Barlier
 les réponses CV des décodeurs ? : rien ici puisqu'on ne mesure pas le courant DCC

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique