FRONT MONTANT ET COMPTAGE AVEC PIC 16F628

On peut profiter d'avoir un réseau minature ferroviaire pour faire de l'électronique et de l'informatique.
Par exemple, on peut compter et afficher  le nombre de trains qui passent devant une gare ( cette fonction n'a peut être aucun intérêt d'un point de vue ferroviaire ,mais ce n'est pas grave, le but est de se divertir).


 


Des trains peuvent circuler dans les deux sens : sensG et sensD devant la GARE1.
On se propose de compter et d'afficher le nombre de passages de trains effectués devant cette gare.
De chaque coté de la gare est disposé un ILS (Interrupteur à Lame Souple)  logé entre les rails. La distance entre les ILS doit être au moins égale à la longueur du plus grand convoi.
On utilisera un compteur pour le nombre de passages dans le sensD, un compteur pour le nombre de  passages dans le sensG et un compteur totalisateur du nombre total de passages.
L'affichage du nombre de passages est assuré par un afficheur LCD de quatre lignes de 20 caractères.
Le traitement est réalisé par un PIC 16F628 programmé en Mikropascal.
Pour l'alimentation des voies une utilise une carte d'alimentation avec information du sens.
Un bouton poussoir  INIT , sur le pupitre , permet de remettre à zéro les compteurs.
 





Schéma de branchement         





On utilise l'horloge interne du pic (4Mz).
Pour la configuration des bits, voir l'application "feux de carrefour pic".
Sept  sorties du pic de PB1 à PB7 sont reliées à l'afficheur qui est configuré en demi octet..
Quatre entrées de RA0 à RA4  reçoivent des différents signaux d'entrée.




Au repos , les deux ILS et le bouton poussoir sont tirés à la masse  par une resistance de 22K (valeur non critique).





Ces schémas ont déjà été vus dans l'application afficheur LCD.




Programme de l'application en Mikropascal.







Explication du programme.
Lignes 3 à 9 : déclaration des variables utilisées dans le programme.
Ligne 12 : déclaration du PORTA entrée.
Ligne 13 : déclaration du PORTB en sortie.
Ligne 14 : désactivation des comparateurs.
Ligne 15 : configuration de l'afficheur LCD. Voir librairies du Mikropascal.
Lignes 16 à 18 : affichage textes sur les différentes lignes de l'afficheur et en colonne 5.
Ligne 21 : on réalise une boucle infinie de scrutation du programme qui suit l'instruction do. Cette partie de programme débute par                    begin et se termine par end;
Lignes 24 à 28 : affectation des entrées par la fonction Testbit. Voir manuel du Mikropascal.
Lignes 42 à 48 : programme de comptage sensG.

Cette partie de programme nécessite quelques explications.
Pour le comptage des passages dans le sensG , on utilise une variable  "compteur_sensG" qui, est déclarée "byte" , ce qui permet
de compter jusqu'à 255. Si on désire compter plus, il faut déclarer cette variable "integer" qui permet de compter jusqu'à 32768.

Le comptage doit s'effectuer sur front montant de la variable "a" . C'est-à-dire à l'apparition du signal "a".
Si l'on ne prend pas cette précaution, compte tenu de la vitesse de scrutation du PIC (4Mz), et du temps de passage de l'aimant sur l'ILS (quelques centaines de millisecondes),  le compteur serait incrémenté plusieurs milliers de fois pendant le temps de passage de la locomotive au dessus de l'ILS. La valeur affichée serait donc fausse.

Comment détecter un front montant ?
La solution (parmi d'autres) que j'adopte pour cette application est la suivante :
Nous allons utiliser une variable auxilliaire que j'appelle "flaga" (mais on peut lui donner tout autre nom).
 



La variable  "flaga"  doit être positionnée par programme à l'état haut avant l'apparition de "a" .
Ensuite on forme l'équation logique :
         
            si a=1 ET si SensG=1 ET si flaga=1  ALORS incrémenter  compteur_sensG  .

Lorsque le compteur a été incémenté, il faut mettre "flaga" à zéro de manière à interdire une incrémentation du compteur à la scrutation suivante du programme.
Si flaga= 0  , l'équation vaut 0.
L'incrémentation s'est donc effectuée sur front montant de la variable "a".

Le raisonnement est identique pour le compteur_sensD.

C'est ce que l'on retrouve  aux lignes  44 et 45 pour le compteur_sensG et aux lignes 54 et 55 pour le compteur_sensD.
 
Bien entendu, il faut repositionner par programme flaga à 1 et flagb à 1  pour les prochains  fronts  montants  de "a" et de "b".

Autre précaution.

Dans la pratique, le signal provenant de l'ILS n'est pas aussi parfait que celui représenté sur le schéma ci-dessus.
Par exemple, l'aimant de la locomotive n'est peut-être pas parfaitement aligné par rapport à l'ILS, ce qui peut se traduire par deux montées et descentes de l'ILS.
Au moment où l'aimant arrive en contact avec l'ILS il peut se produire des rebonds mecaniques des lames.
Donc, le signal de l'ILS peut ressembler au chronogramme suivant, et le compteur sera incrémenté plusieurs fois pendant le passage de la locomotive.




Pour éviter des comptages intempestifs il est nécessaire d'attendre un certain temps avant de remettre flag1 à 1.
On pourrait utiliser unr temporisation avec la procédure "delay_ms" disponible en mikropascal. Mais ce genre de temporisation interrompt la scrutation du programme pendant la durée affichée, et peut donc faire ignorer certaines informations sur le réseau.
Dans notre cas, la solution adoptée est de remettre flaga a 1 par l'ILS qui suit , donc "b".





Ce qui correspond à la ligne 48 du programme.

Le raisonnement est identique pour la remise à 1 flagb. Ligne 58 du programme.

Lignes  32  à  38 : Remise à zéros des compteurs et positionnement à 1 de flaga et flagb.
Ligne 61 : le compteur total des passages est la somme des deux compteurs .


Commentaires sur l'affichage LCD.

Pour utiliser l'afficheur LCD , Mikropascal fourni une librairie qui simplifie la programmation.
Il faut savoir que l'on ne peut afficher que des caractères ou des codes ASCII.
La valeur contenue dans un compteur est une valeur décimale. Pour pouvoir l'afficher il faut la convertir en une chaine de caractères (une suite de caractères ASCII).
L'instruction qui permet de faire cete conversion est dans notre cas  "BytetoStr". Cette instruction convertit une valeur décimale sur 1 octet en une chaine de caractères.
Si la valeur décimale était sur un entier l'instruction serait  "InttoStr".
La variable  "chaine_sensG" est à déclarer en tant que "string[3]" dans la zône  Var.
La valeur entre crochets définit la longueur maximale de la chaine.


Pour les puristes de l'orthographe , on constate qu'avec ce programme  "PASSAGES" prend un S même si le nombre est inférieur à 2.
Je fournis  une solution de programme qui permet de respecter le pluriel des mots.









Application un peu plus compliquée.







a , b , c et d sont des ILS.

Le principe reste le même , il faut compter les trains venant de gauche et de droite.







Dernière mise à jour le 28 juillet 2012.


RETOUR ACCUEIL