| Gare du réseau de Jappy: programmation | |
|
|
Auteur | Message |
---|
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Gare du réseau de Jappy: programmation Lun 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 relationJournal des modifications
- 2013.05.06: Création du sujet consacré à la programmation.
Contrôle des sortiesLa 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. |
|
| |
mistigris Membre
Age : 55 Localisation : Maisons Alfort Nombre de messages : 473 Date d'inscription : 11/04/2012
| Sujet: Re: Gare du réseau de Jappy: programmation Mar 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… )
Dernière édition par mistigris le Mar 11 Juin 2013 - 12:37, édité 1 fois |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Mar 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] |
|
| |
mistigris Membre
Age : 55 Localisation : Maisons Alfort Nombre de messages : 473 Date d'inscription : 11/04/2012
| Sujet: Re: Gare du réseau de Jappy: programmation Mar 11 Juin 2013 - 12:46 | |
| Je comprend la différence et l'intérêt… Merci, je vais regarder de plus pret…
|
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Mar 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. |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Mer 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 ! |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Mar 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. |
|
| |
jlb Membre
Age : 60 Localisation : Ici Nombre de messages : 1543 Date d'inscription : 31/12/2011
| Sujet: Re: Gare du réseau de Jappy: programmation Mer 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. |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Mer 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. Bonne soirée. |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Ven 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. |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Lun 20 Jan 2014 - 22:20 | |
| |
|
| |
jlb Membre
Age : 60 Localisation : Ici Nombre de messages : 1543 Date d'inscription : 31/12/2011
| Sujet: Re: Gare du réseau de Jappy: programmation Lun 20 Jan 2014 - 22:52 | |
| Bonsoir Savigny. J'ai lu rapidement mais je vais relire en détails. Notamment les protothreads qui m'interpellent Bonne soirée |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Sam 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. |
|
| |
mistigris Membre
Age : 55 Localisation : Maisons Alfort Nombre de messages : 473 Date d'inscription : 11/04/2012
| Sujet: Re: Gare du réseau de Jappy: programmation Lun 24 Mar 2014 - 10:04 | |
| Merci ! Impressionnant ! Tout ça tiens sur dans un Arduino ??? !!!! |
|
| |
SavignyExpress Membre
Age : 61 Localisation : yyy Nombre de messages : 2032 Date d'inscription : 10/10/2010
| Sujet: Re: Gare du réseau de Jappy: programmation Lun 24 Mar 2014 - 10:30 | |
| - mistigris a écrit:
- Merci !
Impressionnant ! 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. |
|
| |
mistigris Membre
Age : 55 Localisation : Maisons Alfort Nombre de messages : 473 Date d'inscription : 11/04/2012
| Sujet: Re: Gare du réseau de Jappy: programmation Lun 24 Mar 2014 - 11:20 | |
| Merci ! pas pressé, mais impatient |
|
| |
Contenu sponsorisé
| Sujet: Re: Gare du réseau de Jappy: programmation | |
| |
|
| |
| Gare du réseau de Jappy: programmation | |
|