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

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #30 le: janvier 28, 2018, 05:56:36 pm »
Il manque le

SPI.begin();

dans setup

Et tu devrais commencer par tester que tu envoies bien en SPI aux 595 dans un sketch séparé sans DCC. Test unitaire !
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #31 le: janvier 28, 2018, 06:16:54 pm »
Un truc qui serait bien : indenter correctement le code. À chaque fois que je regarde un programme il faut que je le ré-indente, c'est pas cool
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #32 le: janvier 28, 2018, 07:37:39 pm »
OK, je vais tester en rajoutant le SPI.begin()

Excuse ma question, mais "re-indente" cela veut dire quoi?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #33 le: janvier 28, 2018, 07:42:01 pm »
https://fr.wikipedia.org/wiki/Style_d%27indentation

Je préfère le K&R ou le Allmann.
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #34 le: janvier 28, 2018, 08:42:08 pm »
OK, je vais essayer de faire au mieux.


Je sais que mon câblage est bon car la carte a fonctionné avec les "SHIFTOUT".
Je vais faire un skectch pour tester un registre en allumant puis éteignant chaque sortie.

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #35 le: janvier 28, 2018, 10:47:47 pm »
c'est bon ça fonctionne mais il a fallut que je mette le LATCH sur la pin A1 (au lieu de 12), alors que sur le site il est dit"generally this one can be any pin".
Maintenant il me faut tout remettre sous le train, recâbler les relais de commande des aiguillages et repasser à une phase de test sous CDM pour voir si mon problème de "ratés" est résolu.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #36 le: janvier 29, 2018, 12:13:37 am »
C’est pas tout à fait anormal. La pin 12 c’est MISO. Ton chip select entrait en conflit avec la réception des données sur le SPI (qui ne sert certes à rien ici mais qui ne peut pas être utilisé comme chip select quoiqu’il en soit)

Sur le site, la pin 12 est celle du 595, pas celle de l’Arduino.
Cordialement

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #37 le: janvier 29, 2018, 11:17:15 pm »
Tout fonctionne parfaitement. Plus de ratés.
Merci pour ton aide.....et ta patience.
Je mets en pièce jointe mon sketch (je l'ai "arrangé" au mieux).

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #38 le: avril 27, 2018, 12:30:06 pm »
Bonjour,

J'ai regardé l'implémentation de CircularBuffer et je ne suis pas très fan de ce qui y est fait, j'ai notamment tiqué sur :

template<typename T, __CB_ST__ S>
T CircularBuffer<T,S>::pop() {
void(* crash) (void) = 0;
if (count <= 0) crash();
T result = *tail--;
if (tail < buffer) {
tail = buffer + S - 1;
}
count--;
return result;
}

Traduction :

  • Déclaration d'un pointeur de fonction appelé crash qui pointe sur l'adresse 0 de la mémoire
  • Si le buffer est vide, appel de crash

Donc exécuté sur une machine de bureau, ce genre de code va planter l'application, ce qui est le but recherché, soit.

Exécuté sur un Arduino/AVR, on exécute le code situé à l'adresse 0. Qu'a-t-on à l'adresse 0 ? le vecteur reset. Sur un Arduino/ARM on a la valeur du pointeur de pile à l'adresse 0  :o

BREF ÇA FAIT N'IMPORTE QUOI. Comment peux-t-on écrire des trucs pareils  ::)

J'ai donc fait mon tampon circulaire, qui en plus occupe moins de mémoire, et qui propose aussi des fonctions de lecture et d'écriture qui sont blindées contre les interruptions.

C'est pour l'instant ici : https://github.com/Locoduino/RingBuffer/releases
et d'ici quelques jours dans le gestionnaire de bibliothèques de l'IDE.
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #39 le: avril 30, 2018, 09:38:26 am »
Ça c’est du beau code !

Comme j’ai écrit mon propre tampon circulaire dans les réceptions de messages Can, je vais intégrer cette bibliothèque à la place.

Merci Jean-Luc  ;D
Cordialement,
Dominique

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #40 le: mai 25, 2018, 06:53:04 pm »
Coucou,

super échange entre Jean-Luc et Dominique sur les tampons circulaires.

Comme toutes mes cartes communiquent par CAN avec ton ancien tampon (à Dominique), pourrais-tu me faire parvenir un exemple avec le nouveau tampon, j'ai beau essayer de comprendre, mon cerveau ne suit plus.

Bon WE
Antoine

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #41 le: mai 25, 2018, 08:50:38 pm »
Bonsoir Tony

Il y a des exemples dans la bibliothèque qui est disponible via le gestionnaire de l'IDE. Il y a également quelques bouts de code à la fin de la doc en bas de page : https://github.com/Locoduino/RingBuffer
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Récupération données DCC: CircularBuffer et ShiftOut
« Réponse #42 le: septembre 26, 2018, 03:51:45 pm »
Salut Loco28,

As-tu changé CircularBuffer pour la solution RingBuffer?
Si oui, peux-tu nous donner ton dernier sketch (je n'ai pas réussi à trouver circularbuffer et vu les remarques de Jean-Luc je ne le ferai pas....)?
Merci d'avance!

A+
Yves