Auteur Sujet: Cheksum en DCC  (Lu 85 fois)

Rob1

  • Jr. Member
  • **
  • Messages: 64
    • Voir le profil
    • Mon projet réseau
Cheksum en DCC
« le: juillet 16, 2025, 07:23:08 pm »
Bonsoir à tous
Je suis en quête d'information sur le calcul du cheksum en DCC. Est-ce bien un XOR entre chaque octet
byte cheksum =  b1 ^ b2 ^ b3 ^ b4 ;
Cette syntaxe est-elle correcte ?

J'ai croisé cette proposition: byte cheksum = sum/256 + sum%256
sans conviction

Merci de votre aide

lebelge2

  • Jr. Member
  • **
  • Messages: 85
    • Voir le profil
Re : Cheksum en DCC
« Réponse #1 le: juillet 16, 2025, 11:10:22 pm »
Il faut faire un Xor (^) entre chaque octet ( Avec une boucle)
Et le résultat doit être zéro.
Si non rejeter la trame.

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1188
  • HO avec DCC++ / 3R avec centrale MFX en DIY
    • Voir le profil
Re : Cheksum en DCC
« Réponse #2 le: juillet 17, 2025, 05:51:33 am »
La syntaxe exacte est : (((b1 ^ b2) ^ b3 )^ b4)

Voici un extrait d'un programme que nous avons réalisé avec Marcel :

// Calcul du checksum utilisé pour vérifier l'intégrité des données.
                  byte_1 = (dccPacket.data & 0x000000001FE) >> 1;
                  byte_2 = (dccPacket.data & 0x0000003FC00) >> 10;
                  byte_3 = (dccPacket.data & 0x00007F80000) >> 19;
                  byte_4 = (dccPacket.data & 0x00FF0000000) >> 28;
                  byte_5 = (dccPacket.data & 0x1FE000000000) >> 37;
                  bool send = false;
                  switch (dccPacket.count) {
                    case 28:
                      crc = byte_1 ^ byte_2;
                      if (byte_3 == crc) {
                        Serial.println("send 28 bits");
                        send = true;
                      }
                      break;
                    case 37:
                      crc = (byte_1 ^ byte_2) ^ byte_3;
                      if (byte_4 == crc) {
                        Serial.println("send 37 bits");
                        send = true;
                      }
                      break;
                    case 46:
                      crc = ((byte_1 ^ byte_2) ^ byte_3) ^ byte_4;
                      if (byte_5 == crc) {
                        send = true;
                        Serial.println("send 46 bits");
                      }
                      break;
                  }


Rob1

  • Jr. Member
  • **
  • Messages: 64
    • Voir le profil
    • Mon projet réseau
Re : Cheksum en DCC
« Réponse #3 le: juillet 17, 2025, 09:06:52 am »
Merci de vos deux réponses complémentaires et cohérentes  :)
En fait je suis en train de construire une centrale très très light qui serai pilotée par 3 potentiomètres linéaires avec chaque un commutateur pour choisir l'adresse P1 = adr1,2,3,4 - P2 = adr5,6,7,8 - P3 = adr9,10,11,12.
Le destinataire de ce montage est un nouveau venu dans le monde du modélisme mais totalement réfractaire à l'informatique. ::)
J'ai fini par le faire adhérer au Dcc et accepter de convertir ces anciennes loco. L'argument décisif à été le questionnement autour du cantonnement et son pilotage. :-\
Encore merci.
« Modifié: juillet 17, 2025, 09:09:08 am par Rob1 »

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1188
  • HO avec DCC++ / 3R avec centrale MFX en DIY
    • Voir le profil
Re : Cheksum en DCC
« Réponse #4 le: juillet 17, 2025, 09:24:41 am »
Ok !

Bon tu as une autre solution qui pourrait être de prendre une centrale comme la Box qui est déjà développée car ce n'est tout de même pas une simple affaire et de ne développer que les commandes.

Tu trouveras ici un exemple de manette pour commander la Box avec des commandes CAN :



https://forum.3rails.fr/t/table-de-commande-pour-6-locomotives-ou-plus/28608

Bon courage

Christophe

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3158
  • 100% Arduino et N
    • Voir le profil
Re : Cheksum en DCC
« Réponse #5 le: juillet 17, 2025, 11:56:03 am »
Si tu aimes les potentiomètres, j'en ai mis 12 !

https://forum.locoduino.org/index.php?topic=290.msg4005#msg4005
Cordialement,
Dominique