Auteur Sujet: Récupération données DCC: CircularBuffer et ShiftOut  (Lu 27621 fois)

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #15 le: janvier 24, 2018, 07:48:05 pm »
Bon, c'est fait. j'ai ajouté un "noInterrupts()" juste avant le dépilage des fichiers (.shift) et j'ai mis un "interrupts()" après.
Malheureusement cela n'a rien changé.
J'ai évidemment supprimé le "Serial.print" dans le Handler DCC.

J'ai eu l'idée de supprimer les 3 lignes "shiftout" et là, cela marche, du moins en affichage car du coup je n'ai plus la commande de mes aiguilles.
Après j'ai remis 1 ligne "shiftout", OK puis 2, OK et à 3 NOK.
J'ai aussi essayé en mettant "noInterrupts()" et "interrupts()" de chaque côté des lignes "shiftout" mais sans succès.
Là, j'avoue que je suis un peu "sec" sur la suite.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #16 le: janvier 24, 2018, 09:06:08 pm »
Tu pourrais mettre ton sketch en fichier attaché ?
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #17 le: janvier 24, 2018, 10:40:58 pm »
Ci-joint mon sketch

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #18 le: janvier 24, 2018, 11:57:48 pm »
As tu essayé de mesurer le temps pris par les 3 shiftOut ? et par la totalité de ton programme principal ?

Ajoute avant le premier shiftOut

unsigned long date = micros();

Puis après les shiftOut

Serial.print("Duree = ");
Serial.println(micro() - date);

Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #19 le: janvier 25, 2018, 03:47:44 pm »
Le programme principal (LOOP) s'exécute en 500 microsecondes et les 3 SHIFTOUT en 420/424 microsecondes.

D'un autre côté, la commande des aiguillages est censée se faire avec 0,5s entre chaque soit 500 000 microsecondes. Il ne devrait donc pas y avoir de problème.
J'ai déjà signalé à JPP38 sur le forum CDM-rail ce problème et il m'assure que même lors des commandes d'itinéraires les commandes sont cadencées.
Ce qui est bizarre, c'est qu'à l'initialisation du RUN, tous les aiguillages sont mis en place et là, je constate bien ce cadencement à 0,5s et il n'y a aucun ratés.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #20 le: janvier 25, 2018, 03:49:40 pm »
Quel registre à décalage utilises-tu ?
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #21 le: janvier 25, 2018, 05:09:04 pm »
C'est des 74HC595

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #22 le: janvier 25, 2018, 05:17:38 pm »
Ok,

Je pense que déjà tu peux améliorer les choses en utilisant le SPI pour envoyer tes données. Regarde la dernière section de http://www.instructables.com/id/74HC595-Shift-Register-With-Arduino-Uno/

Tu passera de 420µs à, à vue de nez, 4µs

Il y a aussi du temps à gagner dans la manière dont tu assembles les bits que tu envoies.
« Modifié: janvier 25, 2018, 05:19:22 pm par Jean-Luc »
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #23 le: janvier 25, 2018, 07:19:32 pm »
Effectivement cela me semble plus qu'intéressant et relativement simple. Il faut effectivement que je gagne du temps sur l'envoi vers les registres. j'ai refait des essais cet am en enlevant 1 registre et cela marchait presque à tous les coups.
Je sens que je vais ressortir ma platine d'essai.
Par contre, ce que je ne vois pas, c'est comment on fait si on veut envoyer des valeurs vers 2 ou 3 HC595.
J'ai essayé de m'inscrire sur ce site pour poser une question mais je n'y arrive pas ("date de naissance erronée" ??)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #24 le: janvier 25, 2018, 07:24:06 pm »
Par contre, ce que je ne vois pas, c'est comment on fait si on veut envoyer des valeurs vers 2 ou 3 HC595.

Il faut les chainer, la sortie série du premier sur l'entrée série du second, etc

Citer
J'ai essayé de m'inscrire sur ce site pour poser une question mais je n'y arrive pas ("date de naissance erronée" ??)

Je n'y arrive pas non plus.
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #25 le: janvier 25, 2018, 07:51:36 pm »
Je sais les chainer sur l'aspect hardware mais je ne vois pas, dans son programme avec le SPI, comment on envoie plusieurs valeurs à la suite surtout qu'il utilise un sous-programme qui ne prends qu'un seul argument. A moins qu'il suffise de passer plusieurs arguments comme value1, value2, value3 et de les envoyer avant la ligne de "fin SPI"?


Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #26 le: janvier 25, 2018, 08:14:14 pm »
SPI.transfer envoie un octet comme shiftOut. Pour envoyer plusieurs octets il faut faire plusieurs SPI.transfer
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #27 le: janvier 25, 2018, 11:11:28 pm »

Donc ca donnerait quelque chose comme:

void shiftByte( CDE1, CDE2, CDE3){
PORTC &= B11111101;//Data clock low
   SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));
   SPI.transfer(CDE3);
        SPI.transfer(CDE2);
        SPI.transfer(CDE1);
   SPI.endTransaction();
   PORTC |= B00000010;//Data clock high, latch data
}

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #28 le: janvier 25, 2018, 11:54:45 pm »
Plus simplement, remplace

    digitalWrite(LATCH1, LOW);
    shiftOut(DATA1, CLOCK1, LSBFIRST, CDE3);
    shiftOut(DATA1, CLOCK1, LSBFIRST, CDE2);
    shiftOut(DATA1, CLOCK1, LSBFIRST, CDE1);           
    digitalWrite(LATCH1, HIGH);

Par

    digitalWrite(LATCH1, LOW);
    SPI.beginTransaction(SPISettings(16000000, LSBFIRST, SPI_MODE0));
    SPI.tranfer(CDE3);
    SPI.tranfer(CDE2);
    SPI.tranfer(CDE1);
    SPI.endTransaction();
    digitalWrite(LATCH1, HIGH);
« Modifié: janvier 26, 2018, 02:53:36 pm par Jean-Luc »
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #29 le: janvier 28, 2018, 05:45:58 pm »
J'ai effectué une modification "hard" (changement des pins CLOCK, LATCH, DATA) pour pouvoir tester avec SPI.
Pour le LATCH, j'ai pris la pin 12 (à priori on n'est pas obligé de prendre A1). Comme ça, mes 3 pins sont groupées (11, 12 et 13).
Je me suis assuré que la carte fonctionne toujours en "SHIFTOUT", puis j'ai modifié le programme pour utiliser la fonction SPI.
Problème: je reste "coincé" au premier passage: j'envoi une commande, le la vois bien avec le Serial.print, puis plus rien.
Je ne peux envoyer aucune autre commande.
Je mets mon sketch en pièce jointe.