1/160 - Echelle N

Le Forum consacré à l'Echelle N
 
AccueilAccueil  PortailPortail  ÉvènementsÉvènements  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
N'hésitez pas à consulter le calendrier et les événements du forum pour voir les manifestations près de chez vous !
Le Deal du moment : -28%
Précommande : Smartphone Google Pixel 8a 5G ...
Voir le deal
389 €

 

 Gare du réseau de Jappy: programmation

Aller en bas 
3 participants
AuteurMessage
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeLun 6 Mai 2013 - 22:36

Ce message décrit la programmation du microcontrôleur Atmega8 utilisé dans le projet de la gare de Jappy.

Liens vers les autres sujets en relation
Journal des modifications

  • 2013.05.06: Création du sujet consacré à la programmation.

Contrôle des sorties
La fonction C ci-après permet de contrôler une chaîne de registres à décalage 74HC595 ou similaires.

Les définitions préalables sont (à adapter selon les ports du microcontrôleur utilisé):
Code:

#define SERIAL_IN   PD5
#define REG_CLK      PD6
#define SERIAL_CLK   PD7
#define CONFIG_DDRD   (_BV(SERIAL_IN)|_BV(SERIAL_CLK)|_BV(REG_CLK))

Les sorties sont initialisées au début de la fonction main:
Code:

DDRD = CONFIG_DDRD;

La fonction TestShiftArray reçoit un tableau de bytes en paramètre ainsi que le nombre de bytes (correspond au nombre de registres à décalage):
Code:

void TestShiftArray(uint8_t aData[], uint8_t nBytes)
{
#define   NBITS   8
uint8_t      iByte, iBit;

   PORT_OUT &= ~_BV(SERIAL_CLK);
   PORT_OUT &= ~_BV(REG_CLK);

   // Boucle sur les bytes.
   for (iByte = 0; iByte < nBytes; iByte++)
   {
      // Boucle sur les bits du byte courant.
      for (iBit = 0; iBit < NBITS; iBit++)
      {
         if (aData[iByte] & (1 << ((NBITS-1)-iBit)))
         {
            PORT_OUT |= _BV(SERIAL_IN);
         }
         else
         {
            PORT_OUT &= ~_BV(SERIAL_IN);
         } // if
   
         // Signal d'horloge bit.
         PORT_OUT |= _BV(SERIAL_CLK);
         PORT_OUT &= ~_BV(SERIAL_CLK);
      } // for   
   } // for
   // Pousser les valeurs dans le registre de sortie.
   PORT_OUT |= _BV(REG_CLK);
   PORT_OUT &= ~_BV(REG_CLK);
} // TestShiftArray

Son utilisation, ici dans le cas d'une chaîne de 2 registres à décalage:
Code:

uint8_t aData[2];
...
                aData[0] = 0b00000000;
      aData[1] = 0b00000001;
      TestShiftArray(aData, 2);


Je rééditerai ce post au fur et à mesure de la progression du développement.
Revenir en haut Aller en bas
mistigris
Membre
Membre



Masculin Age : 55
Localisation : Maisons Alfort
Nombre de messages : 473
Date d'inscription : 11/04/2012

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMar 11 Juin 2013 - 10:52

J'ai regardé… mais j'avoue ne pas tout saisir (je suis debutant)… je cherche à gérer les sorties du 74HC595 une à une de manière simple sans être obligé d'écrire des 000010010000xxx et en les appelant simplement par 1,2 ou A,B… j'avoue que les bits … ça me casse les…""
j'ai trouvé ça (gestion de plusieurs registre)…
pensez vous que cela resolve mon problème de base ?
Après j'ai le même problème avec les entrées avec 4 X 74HC165 (lecture des données mais en les isolants : exemple lire l'entrée 12 du 74HC165)… si vous avez des solutions techniques simples je suis preneur…
Code:

int SER_Pin = 13;  //pin 14 data on the 75HC595
int RCLK_Pin = 12;  //pin 12 latch on the 75HC595
int SRCLK_Pin = 11; //pin 11 clock on the 75HC595
 
//How many of the shift registers - change this
#define number_of_74hc595s 3
 
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
 
boolean registers[numOfRegisterPins];
 
void setup(){
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
 
  //reset all register pins
  clearRegisters();
  writeRegisters();
}             
 
//set all register pins to LOW
void clearRegisters(){
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    registers[i] = LOW;
  }
}
 
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){
 
  digitalWrite(RCLK_Pin, LOW);
 
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);
 
    int val = registers[i];
 
    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
 
  }
  digitalWrite(RCLK_Pin, HIGH);
 
}
 
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
  registers[index] = value;
}
 
void loop(){
 
  setRegisterPin(2, HIGH);
  setRegisterPin(3, HIGH);
  setRegisterPin(4, LOW);
  setRegisterPin(5, HIGH);
  setRegisterPin(7, HIGH);
 
  writeRegisters();  //MUST BE CALLED TO DISPLAY CHANGES
  //Only call once after the values are set how you need.
}
Désolé j'arrive pas à le mettre dans une jolie case comme vous… (ça c'était avant… Cool )


Dernière édition par mistigris le Mar 11 Juin 2013 - 12:37, édité 1 fois
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMar 11 Juin 2013 - 12:22

Bonjour Mistigris,

Le programme que tu décris permet de contrôler une chaîne de registres à décalage 74hc595 ou similaires exactement comme l'exemple que j'ai présenté plus haut. Ma solution, basée sur la manipulation de bits, présente 2 avantages, pour autant qu'on en ait besoin !

  • Le stockage de l'état courant des relais n'occupe qu'un bit, tandis que la solution que présentes occupe la place d'un "boolean" pour chaque relais (donc au moins 8 bits). Si tu n'est pas à court de RAM dans l'Atmega qui équipe ton Arduino, cette solution est tout à fait acceptable.
  • Le stockage sous forme de bits permettrait d'utiliser l'interface SPI pour contrôler la chaîne de registres à décalage car les données auraient déjà le format adéquat. En utilisant des pins de sortie autres que SPI, ce besoin ne se présente pas.


Pour l'envoi aux registres à décalage, les 2 solutions fonctionnent de la même manière: boucle sur les valeurs à transmettre et contrôle de l'entrée digitale, horloge série et horloge de série. Mon code n'étant pas pour l'Arduino, mais directement pour le microcontrôleur, il n'utilise pas digitalWrite, mais l'écriture directe sur les sorties (paires d'instructions PORT_OUT...).

Dans ta solution, commander un relais individuel revient à mettre la valeur 1 dans l'élément du tableau correspondant, puis à appeler writeRegisters. Dans ma solution, commander un relais individuel revient à mettre le bit correspondant à 1, puis à envoyer les bits.

Pour présenter du code d'un langage de programmation en conservant la mise en page, il faut entourer le code source par les 2 balises "code" comme ci-après.

Code:
[code]void setup()
{
...
}[/code]
Revenir en haut Aller en bas
mistigris
Membre
Membre



Masculin Age : 55
Localisation : Maisons Alfort
Nombre de messages : 473
Date d'inscription : 11/04/2012

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMar 11 Juin 2013 - 12:46

Je comprend la différence et l'intérêt…
Merci, je vais regarder de plus pret…
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMar 11 Juin 2013 - 13:35

mistigris a écrit:
Je comprend la différence et l'intérêt…
Merci, je vais regarder de plus pret…

Je pense qu'il vaut vraiment la peine de se poser la question si tu es à court de RAM. Si ce n'est pas le cas, conserve la version avec le tableau de booléens.
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMer 28 Aoû 2013 - 8:18

Avec la rentrée, reprise des travaux sur le projet.

La carte microcontrôleur existe pour l'instant sur breadboard ce qui permet d'avancer sur le développement du programme. Déjà fait:

  • Structure générale du programme.
  • Machines d'états des zones de gare: Lausanne 1 & 2, Berne 1 & 2. Il s'agit de gérer les autorisations et blocages d'entrées / sorties des trains. Prise en compte d'un bouton manoeuvre.
  • Traitement des rebonds sur les poussoirs.
  • Modification pour permettre de presser les 2 poussoirs d'itinéraire l'un après l'autre dans un certain laps de temps (quelques secondes, à déterminer) plutôt que simultanément.
  • Fonction d'envoi des bits de sorties aux cartes relais comme décrit ci-avant.


À faire:

  • Implanter la commande des relais sous forme de tableaux en mémoire programme. Les aiguillages seront actionnés séquentiellement pour ne pas trop tirer de courant de l'alimentation.
  • Tests complets.
  • Documentation au propre des machines d'états.


En parallèle, pour alterner avec la programmation, dessin de la carte microcontrôleur avec KiCad !
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMar 14 Jan 2014 - 22:37

Bonsoir à tous,

Le projet de TCO pour la gare du réseau de Jappy avance bien. La programmation en C est terminée, reste à faire des tests complets et relier le tout au réseau de Jappy.

Les fonctions suivantes sont implantées:

  • Connexions des boutons poussoirs via l'astuce du clavier analogique décrite par jlb sur son blog: http://modelleisenbahn.triskell.org/spip.php?article59.
  • Activation séquentielle des aiguilles (cf dernier post).
  • Contrôle des relais gérant les alimentations traction.
  • Interaction avec les cantons de sortie et d'entrée dans les 2 directions.
  • Mode manoeuvre: pas d'interaction avec les cantons d'entrée et de sortie: on ne tient pas compte des cantons de sortie pour autoriser une voie en sortie et on ne contrôle pas les cantons d'entrée.
  • Mode transit si une voie de gare est reliée soit: provenance Lausanne - direction Berne ou provenance Berne - direction Lausanne. Dans ce cas, la libération du canton de sortie réactive automatiquement le canton d'entrée et les trains peuvent transiter dans la gare sans aucune manipulation. Utile pour laisser passer des trains de fret ou un express !
  • Sauvegarde de l'état courant à chaque changement et reprise du dernier état au démarrage. Pour économiser les cycles d'écriture en EEPROM limités à 100'000 par case mémoire, un algorithme basé sur une note d'application d'Atmel utilisant plusieurs emplacements en EEPROM a été utilisé.


Je compléterai mon blog avec des descriptions plus détaillées ces prochaines semaines.

Bonne soirée.
Revenir en haut Aller en bas
jlb
Membre
Membre
jlb


Masculin Age : 60
Localisation : Ici
Nombre de messages : 1543
Date d'inscription : 31/12/2011

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMer 15 Jan 2014 - 19:06

Bonsoir Savigny

J'ai hâte de lire une description détaillée de ton système. Notamment le fonctionnement des modes.
Revenir en haut Aller en bas
http://modelleisenbahn.triskell.org
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeMer 15 Jan 2014 - 21:05

jlb a écrit:
Bonsoir Savigny

J'ai hâte de lire une description détaillée de ton système. Notamment le fonctionnement des modes.

Bonsoir Jlb,

Je viens de terminer les tests approfondis, une cinquantaine de cas tests, et tout semble fonctionnel. Je m'attaquerai à la documentation un autre soir.  Very Happy

Bonne soirée.
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeVen 17 Jan 2014 - 23:54

Bonsoir à tous,

J'ai restructuré la documentation de la gare de Jappy sur mon blog, voici les premiers articles:


Bonne fin de semaine à tous.
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeLun 20 Jan 2014 - 22:20

Bonsoir à tous,

J'avance dans la documentation... Le lien ci-après pointe sur la table des matières vers les articles consacrés à la gare du réseau de Jappy.

http://savignyexpress.wordpress.com/2014/01/20/gare-du-reseau-dun-ami-toute-la-doc/

À suivre...
Revenir en haut Aller en bas
jlb
Membre
Membre
jlb


Masculin Age : 60
Localisation : Ici
Nombre de messages : 1543
Date d'inscription : 31/12/2011

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeLun 20 Jan 2014 - 22:52

Bonsoir Savigny.

J'ai lu rapidement mais je vais relire en détails. Notamment les protothreads qui m'interpellent  scratch 

Bonne soirée
Revenir en haut Aller en bas
http://modelleisenbahn.triskell.org
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeSam 22 Mar 2014 - 22:53

Bonsoir à tous,

J'ai posté quelques nouveautés sur mon blog, notamment un article sur la gestion des états et des modes de fonctionnement de ce système ainsi que sur la lecture des entrées.



Si vous souhaitez voir l'entier du programme, merci de me contacter par MP et je vous enverrai le code source en C.

Bon dimanche.
Revenir en haut Aller en bas
mistigris
Membre
Membre



Masculin Age : 55
Localisation : Maisons Alfort
Nombre de messages : 473
Date d'inscription : 11/04/2012

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeLun 24 Mar 2014 - 10:04

Merci !
Impressionnant !  Gare du réseau de Jappy: programmation 901388
Tout ça tiens sur dans un Arduino ??? !!!!
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre
SavignyExpress


Masculin Age : 61
Localisation : yyy
Nombre de messages : 2032
Date d'inscription : 10/10/2010

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeLun 24 Mar 2014 - 10:30

mistigris a écrit:
Merci !
Impressionnant !  Gare du réseau de Jappy: programmation 901388
Tout ça tiens sur dans un Arduino ??? !!!!

Bonjour Mistigris,

Le système utilise un Atmega8, un processeur un peu plus petit que celui qui équipe les Arduino (Atmega328 si je ne fais erreur). Le binaire actuel occupe à peine plus de 5 KB sur les 8 KB de mémoire programme disponible. Ces 5 KB incluent des tables en lecture seule, utilisées pour déterminer quels relais activer en fonction de l'état. Cette partie du programme n'est pas encore décrite dans mon blog, c'est pour bientôt !

Comme je le programme directement en ICSP, il n'y a pas de bootloader en mémoire. Cependant, un Arduino devrait sans problème accueillir 5 KB de code, même avec la présence d'un bootloader.

Je t'enverrai un fichier compressé avec les sources dans le courant de la semaine. Ce sera l'état courant du programme, susceptible d'être modifié après les premiers tests relié au réseau de Jappy, prévus ce jeudi soir.

Bon début de semaine.
Revenir en haut Aller en bas
mistigris
Membre
Membre



Masculin Age : 55
Localisation : Maisons Alfort
Nombre de messages : 473
Date d'inscription : 11/04/2012

Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitimeLun 24 Mar 2014 - 11:20

Merci ! pas pressé, mais impatient  sunny 
Revenir en haut Aller en bas
Contenu sponsorisé





Gare du réseau de Jappy: programmation Empty
MessageSujet: Re: Gare du réseau de Jappy: programmation   Gare du réseau de Jappy: programmation Icon_minitime

Revenir en haut Aller en bas
 
Gare du réseau de Jappy: programmation
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
1/160 - Echelle N :: Modèles réduits à l'echelle N :: Electricité / Electronique-
Sauter vers: