Auteur Sujet: DCC++ BaseStation  (Lu 106095 fois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #15 le: mars 09, 2016, 03:07:24 pm »
Donc, dans le code des interruptions, pour le Timer 1, par exemple, j'ai remplacé la Macro :
DCC_SIGNAL(mainRegs,1)
par son expansion et cela donne ça :

ISR(TIMER1_COMPB_vect){              // set interrupt service for OCR1B of TIMER-1
  if(mainRegs.currentBit==mainRegs.currentReg->activePacket->nBits){    /* IF no more bits in this DCC Packet */ \
    mainRegs.currentBit=0;                                              /*   reset current bit pointer and determine which Register and Packet to process next--- */ \   
    if(mainRegs.nRepeat>0 && mainRegs.currentReg==mainRegs.reg){        /*   IF current Register is first Register AND should be repeated */ \
      mainRegs.nRepeat--;                                               /*     decrement repeat count; result is this same Packet will be repeated */ \
    } else if(mainRegs.nextReg!=NULL){                                  /*   ELSE IF another Register has been updated */ \
      mainRegs.currentReg=mainRegs.nextReg;                             /*     update currentReg to nextReg */ \
      mainRegs.nextReg=NULL;                                            /*     reset nextReg to NULL */ \
      mainRegs.tempPacket=mainRegs.currentReg->activePacket;            /*     flip active and update Packets */ \       
      mainRegs.currentReg->activePacket=mainRegs.currentReg->updatePacket; \
      mainRegs.currentReg->updatePacket=mainRegs.tempPacket; \
    } else{                                                             /*   ELSE simply move to next Register */ \
      if(mainRegs.currentReg==mainRegs.maxLoadedReg)                    /*     BUT IF this is last Register loaded */ \
        mainRegs.currentReg=mainRegs.reg;                               /*       first reset currentReg to base Register, THEN */ \
      mainRegs.currentReg++;                                            /*     increment current Register (note this logic causes Register[0] to be skipped when simply cycling through all Registers) */ \
    }                                                                   /*   END-ELSE */ \
  }                                                                     /* END-IF: currentReg, activePacket, and currentBit should now be properly set to point to next DCC bit */ \
                                                          \
  if(mainRegs.currentReg->activePacket->buf[mainRegs.currentBit/8] & mainRegs.bitMask[mainRegs.currentBit%8]){     /* IF bit is a ONE */ \
    OCR1A=DCC_ONE_BIT_TOTAL_DURATION_TIMER1;                            /*   set OCRA for timer1 to full cycle duration of DCC ONE bit */ \
    OCR1B=DCC_ONE_BIT_PULSE_DURATION_TIMER1;                            /*   set OCRB for timer1 to half cycle duration of DCC ONE but */ \
  } else{                                                               /* ELSE it is a ZERO */ \
    OCR1A=DCC_ZERO_BIT_TOTAL_DURATION_TIMER1;                           /*   set OCRA for timer1 to full cycle duration of DCC ZERO bit */ \
    OCR1B=DCC_ZERO_BIT_PULSE_DURATION_TIMER1;                           /*   set OCRB for timer1 to half cycle duration of DCC ZERO bit */ \
  }                                                                     /* END-ELSE */ \
                                                                                       \
  mainRegs.currentBit++;                                         /* point to next bit in current Packet */ 
}

Une dernière question : à quoi sert l'anti-slash en fin de ligne ?

J'ai recompilé et ça fonctionne encore !
Cordialement,
Dominique

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #16 le: mars 09, 2016, 03:13:43 pm »
Pour le préprocesseur, la fin de ligne termine la macro. Ici la macro est très grosse et donc c'est impossible de l'écrire sur une seule ligne. Le \ permet d'échapper le caractère qui suit. Ici le caractère qui suit est le retour à la ligne. Donc les fin de lignes ne sont pas vue par le préprocesseur et la macro est vue comme étant sur une seul ligne comma attendu. Du point de vue du formatage, c'est lisible.
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Re : DCC++ BaseStation
« Réponse #17 le: mars 09, 2016, 03:17:14 pm »
Pour le préprocesseur, la fin de ligne termine la macro. Ici la macro est très grosse et donc c'est impossible de l'écrire sur une seule ligne. Le \ permet d'échapper le caractère qui suit. Ici le caractère qui suit est le retour à la ligne. Donc les fin de lignes ne sont pas vue par le préprocesseur et la macro est vue comme étant sur une seul ligne comma attendu. Du point de vue du formatage, c'est lisible.

Donc je peux enlever l' \ dans la version expansée. Il n'a aucun effet sur le compilateur ?
Cordialement,
Dominique

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #18 le: mars 09, 2016, 03:18:31 pm »
Merci Jean-Luc pour, littéralement, cette explication de texte.  :)

Le code est lisible et bien optimisé, c'est boooo.  8)

J'allais ajouter qu'effectivement ce test est lui même à l'intérieur d'une macro plus conséquente !

Une macro doit tenir sur une seule ligne, c'est une contrainte du langage. Mais parfois, et c'est le cas là, elle ne tient pas. Et dans ce cas, le '/' en fin de ligne signifie que la macro n'est pas terminée et qu'elle continue sur la ligne suivante !

Pourquoi faire une aussi grosse macro ?
L'autre solution de codage aurait été de faire une fonction avec les mêmes arguments R et N. Mais au moment de l'exécution la routine d'interruption aurait dû appeler cette fonction, et cela aurait généré un peu de code assembleur pour la mémorisation du pointeur d'exécution, le passage des arguments, la valeur de retour, etc... En procédant par une macro, plus de fonction appelée puisque le code de la macro est directement intégré à sa place dans le source. Le principal inconvénient de cette approche réside dans la taille mémoire programme qui augmenterait significativement à chaque appel de la macro puisque l'ensemble de son code est à nouveau compilé. Mais cela ne se pose pas ici puisque la macro n'est appelée qu'une seule fois selon le type d'Arduino... Donc une solution optimale, tout en conservant l'idée des arguments, et en réduisant l'empreinte mémoire mais aussi et surtout le temps passé dans la routine d'interruption.

Ps : flute, battu par Jean-Luc !

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Re : Re : DCC++ BaseStation
« Réponse #19 le: mars 09, 2016, 04:10:21 pm »
Donc je peux enlever l' \ dans la version expansée. Il n'a aucun effet sur le compilateur ?

Oui  :)
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #20 le: mars 09, 2016, 07:32:51 pm »
Voici un oscillogramme du signal DCC sur la patte 12 du Mega.

Vous remarquerez la modernité de mon équipement de labos  :-\ :-\

La base de temps est réglée sur 50 microsecondes et les signaux ont l'air assez propres.
J'ai hate de faire bouger une loco avec ça !
Cordialement,
Dominique

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #21 le: mars 09, 2016, 07:41:00 pm »
GameBoy Pocket  :o
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Re : DCC++ BaseStation
« Réponse #22 le: mars 09, 2016, 08:14:25 pm »
GameBoy Pocket  :o

Pas jeune la bestiole (tu n'étais pas né  ???), mais marche encore. C'est bien une Game Boy Pocket, avec une cartouche ocscilloscope 2 voies. C'est peut-être même un montage Elektor ?

A coté de ça j'ai un oscillo analogique classique, mais pas à mémoire.
Cordialement,
Dominique

DDEFF

  • Hero Member
  • *****
  • Messages: 738
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #23 le: mars 09, 2016, 10:31:16 pm »
Je confirme : Elektor.
Ils l'ont même fait avec une GameBoy Color. ET bi-courbe, SVP !! ;)
« Modifié: mars 10, 2016, 08:54:07 am par DDEFF »
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Re : Re : DCC++ BaseStation
« Réponse #24 le: mars 09, 2016, 11:19:42 pm »
GameBoy Pocket  :o

Pas jeune la bestiole (tu n'étais pas né  ???)

N'exagérons rien  :D. Elle est sortie en 1996 d'après Wikipedia et je n'ai plus 20 ans  ;)
Cordialement

DDEFF

  • Hero Member
  • *****
  • Messages: 738
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #25 le: mars 25, 2016, 04:18:05 pm »
Et une commande par mobile et DCC++

Et pour 10$, s'il vous plait !!  ;D ;D ;D



Si j'ai bien compris, c'est WiThrottle sur l'App Store (Ipod pour la vidéo)
« Modifié: mars 25, 2016, 05:54:42 pm par DDEFF »
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #26 le: mars 25, 2016, 06:12:58 pm »
Oui c'est bien DCC++.
Un Uno et une carte moteurs pour 10$ c'est déjà à peine possible. Alors si tu ajoutes le PC, l'iPhone et le routeur, tu exploses ton budget.

Cela dit DCC++ est très attirant et je pense que ça peut apporter une expérience rapide et réussie du DCC.

Je vais me pencher sur la transformation de DCC++ pour en décliner diverses choses :
- la voie de programmation (j'en ai besoin)
- le va-et-vient (une petite centrale comme ça peut suffire largement)
- des suites logiques à mes articles.
- je ne vais pas utiliser le Uno, ni le L298 mais un Nano (je pense que les macros seront les même) et un LMD18200.
- au total, avec quelques boutons, voire un LCD 4x20, ça ne sera pas loin de 20 à 30 €
- j'ai acheté aussi la bestiole à 43A, mais ce sera pour la version "jardin" sur batterie de voiture.

De toute façon je dois tester ce logiciel qui peut être un bon successeur à CmdrArduino, mais testons avant de vendre la peau de l'ours ..

... après mes travaux de peinture et en partage de temps avec la maçonnerie que je me suis promis de faire :-[
Cordialement,
Dominique

DDEFF

  • Hero Member
  • *****
  • Messages: 738
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #27 le: mars 25, 2016, 07:00:16 pm »
Tu vas faire un UNO en parpaings ?  ;D
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #28 le: mars 25, 2016, 07:37:49 pm »
Non un mur de Nanos  8)
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #29 le: août 09, 2016, 02:32:44 pm »
Juste pour dire à tout le monde que la discussion continue sur le Forum, ici : http://forum.locoduino.org/index.php?topic=203

On y trouvera des tests, des exemples de mise en oeuvre et des adaptations à nos propres besoins.

Ca à l'air vraiment bien  :P :P
Cordialement,
Dominique