You are on page 1of 8
‘792020 PICTRAIN-X > Ptitrain P Electronique P PicTrain Page précédente Cette rubrique PicTrain est assez nouvelle (deux mois) pour que vous puissiez aisément nous rattraper et sauter en marche ! Aujourd’ hui a notre menu 10. 3e application : PicTrain2 : le programme 10.1, Initialisation . Le traitement de I’ interruption . Conclusion 10. Pictrain2 : le programme Ilya trois parties prineipales dans le programme pictrain2-1.asm : 1m Les initialisations : Timer, interruptions et entrées-sorties, Le traitement des commandes, L interruption Timero, 10.1. Initialisation 10.1.1. Les définitions 10 Sortie sens 10 Sortie Train I0_Acceleration 10 Freinage T0_STOP ‘To_SENS Cran EQU dé" BE ase PTI+ _Les listings de programme respectent un code de couleurs choisi par Jidé pour Jidé mais dont nous n'hésitons pas & vous faire profiter ;~) Une constante (littéral”) égale & 6 est définie comme c_cran. On en verra l'utilisation dans les parties accélération et freinage. Les 6 ports d’E/S du microP sont utilisés ici, GPo et GP1 en sortie, de GP2 4 GP5 en entrée. ‘Nous déclarons également les trois variables (registres généraus), 10.1.2. Initialisation des paramétres hitps wn ptrain.comllectraniquelmicropipage Olin. him 18 ‘792020 PICTRAIN-X clrf bst bsf BANKO clrf VA Vitesse bef TO SENS On déclare d’abord les ports 2 & 5 en sortie, avec résistances de rappel (il n’existe pas de résistance de rappel sur le port 3) On initialise ensuite le pré-diviseur, par trois des bits du registre ‘oPrION_REG selon les valeurs du tableau ci-contre P: Dans notre cas (4° ligne du tableau : pour diviser par 16), il faut mettre a 4] les deux bits de poids faible. On voit l’ensemble de ce registre dans la fiche ci-dessous ¥ prét a imprimer sur une fiche en carton au format standard 125 x 75 mm ‘Valeur des] Pre-avin trois bis par 000 1:2 01 14 ss) 401 see 110 45128 nt 4286 OPTION registre OPTION (OPTION REG) a 0] [0 ae EES FO OES OT 2 = R pull-up commandées par Te Peaistre wu" ® SINTEDG : laisser 40. cf. plus tard ¥ ms Tes: laisser 20, cf. plus tard wr |& 4 ase: Vatsser 80; ef. plus tard Hee 8 woo | a2 ‘ or |S ae SP FES no |b as Timer ant | & 256 (sinon” su WOT) everple ¢ pre-givision Ensuite, on active les interruptions en mettant a i] les interruptions INTCON G1E : activations des interruptions dune maniére générale, Tete : activation Tineré. ‘Toutes les autres interruptions sont désactivées (les autres bits de 1nrcon sont a), ATTENTION : tous ces registres sont dans SANK1. 10.2. Traitement des commandes Dans la boucle principale nous allons traiter toutes les commandes, accélération et freinage, | “arrét d’ urgence et le changement de sens. Rappel des principes : 1m D’une manigre automatique et indépendante, V'interruption Tinerd génére le signal rectangulaire, de fréquence 240 Hz, de rapport cyclique variable proportionnel a la variable hitps:wwn ptrain.comlslectraniquelmicropipage Olid. him du registre de contréle des 218 ‘792020 PICTRAIN-X VA Vitesse I Les commandes, gérées dans notre boucle principale, ne font que modifier la valeur de cette variable vA Vitesse ; 1 Une inertie est prévue, dans le cas dun appui continu sur un bouton la modification de Ta vitesse est effectuée tous les 1/6 de seconde ; im Le changement de sens ne peut étre indique quand cette condition est réalisée. 10.3. Inertie Pour introduire de l’inertie (et également pour faire fonetion a’ anti-rebond), nous avons une premiére boucle qui fait que le traitement des commandes ne s’exécute que tous les 1/6 de seconde (6,15 seconde). On verra plus loin que nous avons 42 “erans” de vitesse, passer de zéro a vitesse maximum (ou Vinverse), le balayage complet s’effectuera done en 7 secondes. que si la vitesse est zéro (va_vitesse = @) ; une led ouclePrincipale novF ‘onpteur_Inertie, bites Sts gots — RouclePrinci dao" VA Conpteur_Inertie t1 Tant que le compteur VA_Conpteur_inertie est supérieur a [0 on tourne dans la boucle BouclePrincipale ; au moment oi le compteur passe par zéro, on saute 4 la suite du programme. Ce ‘compteur est décrémenté a passage au créneau haut dans I’interruption Tiner@, soit Ala fréquence de 240 Hz, ce qui veut dire que si on le “charge” avec la valeur 40, il passe par zéro tous les 240/40 secondes, soit 0,15 seconde, Indicateur d”état Z : pour tester la valeur du compteur, nous utilisons “I‘indicateur d’ état 2” Ce n'est pas Z comme Zorro, mais évidemment Z comme zéro. Cet indicateur est le bit 7 dans le registre spécial STATUS, Cet indicateur est a Hl lorsque le résultat d’une instruction est zéro, comme par exemple la soustraction : si nous avons le chiffre 1 dans un registre général, et que soustrayons le chiffre , le résultat est 2éro, mais surtout lindicateur STATUS,Z est & 4] pour nous indiquer que le résultat (done le contenu du registre) est 2éro. Cet indicateur est utilisé dans beaucoup 4”instructions comme les additions ou soustractions, les, déeréments ou ineréments, les opérations logiques et dans certains nove. Dans notre cas, il s‘agit de instruction nov, qui copie le contenu du registre donné en opérande soit dans W (avec ,4), soit dans le méme registre (avec ,F comme ici) Si vous avez tout compris, vous vous rendez compte que instruction nov VA Conpteur_Inerttie,+ ne fait rien, car elle copie le contenu du registre dans le méme registre, ce qui semble assez inutile ! Détrompe7-vous, c’est la meilleure maniére que nous avons de tester si le registre est a, ce qui nous intéresse ici. Lorsque le registre est a (UJ, cest-a-dire que nous allons exécuter le traitement des commandes, nous remettons d’ abord 4o dans ce registre. 10.4. Freinage et accélération Nous sommes passés dans le traitement des commandes (boutons) proprement dit ILy a iei trois actions possibles : I Accélérer : augmenter la vitesse d’un eran, IW Freiner : diminuer la vitesse d’un eran, Stop : mettre la vitesse & zéro. La vitesse est proportionnelle & la valeur vA_Vitesse (revoir le chapitre sur le Tinere), est peut varier de 0 & 255. D’ une maniere pratique, pour augmenter ou diminuer la vitesse, il faut se limiter & une quarantaine de “crans”, on va donc additionner (ou soustraire) 6 & chaque action sur un bouton. Notre vitesse va done varier de 0 a 255 mais par pas de 6, soit 255/6 = 42 crans, ce qui est plus raisonnable, On va maintenant traiter en détail les trois actions : 10.4.1. Accélération Pour nous faciliter la vie, on commence par copier la vitesse dans W, rappeler-vous que de toute fagon on doit toujours passer par ; on verra a la fin des traitements que I’on aura la nouvelle vitesse (modifiée ou non) toujours dans W, et on la recopiera a ce moment dans le registre VA_Vitesse. hitps wn ptrain.comlslectraniquelmicropipage Olid. him 38 ‘792020 PICTRAIN-X btfsc OAcceleration _ Test si accélération goto ET Suitel Pour I’accélération on teste I’entrée 10 Acceleration : si elle est a [lon passe & I’ instruction suivante qui est, un saut, et on ne fait rien Rappelez-vous aussi que I’on utilise en général une logique “inverse” due & l’électronique, qui fait qu’au repos I’entrée est au + 3 volts par la résistance de rappel, et active (bouton poussoir enfoneé) au niveau zéro volt. On traite done I’ accélération si le bit 10_Accélération est a l(c’ est-a-dire clear). Ensuite on va aborder une nouvelle instruction : addw (add litteral to W). Cette instruction ne fait aw aditionner un itéral aw (qui eontient notre vitesse intial) et qui eontiendra notre nouvelle valeur aprés. RAPPEE. : Ot est mon littéral ? On retrouve ici une des “facilités de programmation” : jai en effet remplaeé le lttéral par une constante définie au début du programme. Cette définition se fait par une directive C Cran £QU d’6” placée en début de programme, et qui indique au logiciel MPLAB que ehhaque fig qu i reneontre Cran, i doit le remplacer (€QU=Equivalenee) par Ia valeur 46" qui est en un littéral. Done adéiw C_cran est égal (6quivalent) a addlw 46” Dans V'instruetion suivante, on teste (bese) un autre “indicateur d’état”, ¢ = celui-ei est 1 “indicateur de “retenue” (carry) ou de dépassement. Je m’ explique : lorsque vous additionnez & la main 8 et 6, vous éeriver."4 et je retiens 1” (= 14) ; vous aver bien un “dépassement” sur vos unités, et uun de retenue. Ici c’est pareil, sauf que I’on raisonne sur des octets, c’est-i-dire des valeurs entre 0 et 255. Que se passe-t-il lorsque le registre contient 252 et que l’on ajoute 6 ? Pour vous le résultat est 258, mais cela notre microP ne sait pas faire, Pour lui le résultat est 2 avec un débordement (une retenue) et ¢”est ce débordement qui est signalé par I'indicateur d'état STATUS, Si vous avez suivi, revenons & notre programme : en additionnant 6 dans W, le résultat peut étre supérieur & 255, il faut done tester le débordement, et si oui remettre 255 dans v. Si vous contimuez d “acotlerer (2 appuyer sur Je bouton “acélérer”),& chaque fois ily aura débordement (255 plus 6), ‘mais la valeur sera toujours ramenée a 255. Avant de passer au freinage, reliser. encore une ou deux fois cette partie, il y a beaucoup de nouveautés, et il faudrait avoir bien compris, car la suite utilise exactement les mémes notions, mais, dans I’aure sens (en moins !). PTI+ Les bits STATUS. — La plupart des instructions effectuant des opérations sur des registres peuvent activer des bits indiquant le "statut” du résultat, dont les deux plus importants sont WE Zéro (STATUS, 2), qui indique que le résultat de I opération est 0, donc que le registre est & 0, Wi Carry (srarvS,C), qui indique un dépassement de capacité (ou une "retenue"), c”est-d-dire que le résultat est supérieur 8 255 ; dans ce cas, la valeur dans le registre est XXX (=résultat de | “opération) moins 256. D ‘autres bits de statut existent dans ce microP, mais ils sont peu utilisé. 10.4.2. Freinage ET _suiter 10 Freinage goto ET Suite novlw ¢_Cran subuf VA Vitesse,i bites clr ET_suite2 On retrouve ici la méme séquence que pour I’accélération : d’abord on teste entrée 10 Freinage, si elle est a [I] (inactive), on saute. Sielle est a @, on rentre dans Ie traitement de freinage. On utilisera ici I“instruetion de soustraetion subw¢ (substract W from F), qui soustrait la valeur de w du registre en opérande. On charge done d’abord notre valeur dans (noviw C_Cran), valeur qui est toujours notre constante d’inertie, puis on soustrait w du registre VA Vitesse qui contient la vitesse actuelle, Le résultat de la soustraction peut étre rangé au choix dans le méme registre (par ,F) ou dans hitps wn ptrain.comllectraniquelmicropipage Olinda. him ais ‘792020 PICTRAINX. (par , 4), ce que nous faisons ici car j’ai besoin de la nouvelle vitesse dans W. Remarquez que dans ce cas, le registre initial va Vitesse n’ est pas modifié Comme pour I’addition, on a ici un risque de débordement, par exemple sila vitesse est & 4 et on soustrait 6, le résultat n’est pas —2 (il n’existe pas de nombre négatif), mais 254, et on va done utiliser Iindicateur d’ état StaTUS, c pour tester le débordement, MALHEUREUSEMENT, il fonetionne ici a V’envers, il est actif (C = 1) ‘il n'y a pas de débordement. Je ne m’étends pas sur le sujet, aucun intérét pour nous, retenez juste que les soustractions sont I’inverse d’une addition (a, vous le saviez déja), mais aussi pour le fonetionnement de STATUS, <. Dans notre programme on saute done A la suite si STATUS, est & fH (set), sinon (ce qui veut dire qu'il y a débordement au sens soustraction), on est passé en dessous de zéro, et on raméne done notre vitesse dans W & zéro. Pour ce faire, on utilise I’ instruction clrw (clear W), qui met a (le registre wc’ est la méme chose que cir qui mettait a lun registre, mais appliqué & W. Done une fois la vitesse a zéro, tout appui sur freinage ne change rien, la vitesse reste & zéro. Sivous aviez compris l’aceélération, le freinage n’a pas posé de probleme, sauf cette inversion de Vindicateur, mais il n’y a rien & comprendre : ¢’est comme ¢a. 10.4.3. Stop Ici c’est tout simple, il s“agit d’un arrét immédiat (d"urgence), done on met W al par cirw si le bouton STOP est appuyé, c”est-A-dire 10_stop al. ET suitez btfes 10_sToP clea Nous avons maintenant traité les trois boutons qui ont une action sur la vitesse, et le résultat est toujours dans W, Il nous reste a ramener cette nouvelle vitesse dans VA_Vitesse par nowt VAVitesse La derniére chose & faire est de traiter le changement de sens, e’est-A-dire la derniére entrée TO_SENS.. 10.5. Changement de sens 10.5.1. Logique et électronique On s’est imposé la contrainte de ne pouvoir changer de sens que lorsque la vitesse est & zéro, encore faut-il savoir quand la vitesse atteint ce niveau. En effet, dans les crans trés bas (1 ou 2 ou 3.0), suivant la locomotive, elle n’avancera pas, méme si dans notre microP la vitesse n’est Das encore & zéro. Il est done visuellement impossible de savoir quand la vitesse est effectivement a zéro . Jai done introduit une led quis’ allume lorsque la vitesse est récllement a zéro (VA Vitesse), et ¢ “est seulement dans cet état-lA que le sens peut étre inversé. Comme nous n’avons que 6 entrées-sorties sur ce microP, qui sont déja toutes occupées (2 en sortie, 4 pour les boutons en entrée), et qu’il nous en faut une supplémentaire, on peut soit changer de microP pour un modéle plus puissant, soit réfléchir un peu et utiliser une des E/S soit cen entrée soit en sortie selon le cas. C’est bien entendu (1) cette dernigre solution ‘que nous alions mettre en ceuvre dans ce schéma Aleetronique P: En fonetionnement_ normal, 1'E/S 4 (commande STOP) est configurée en entrée, reli au 3 V par R6 (220 K), et auo V par R7 (4,7 K) si ‘on appuie sur le bouton poussoir. La led montée en paralléle n’est pas allumée, le courant est bien trop faible. Lorsque la vitesse est & zéro (le poussoir STOP n’est done plus utile), I’E/S est en sortie, état haut (= 1) et alimente la led qui nous indique que Ta vitesse est 2éro et que I’on peut done changer de sens de marche. PTI+ Pour les électroniciens. — Le montage proposé sur le poussoir S2 peut sembler curieux, ‘mais il marche. Lles “caractéristiques électriques du microP sont en effet assez différentes des circuits plus dlassiques CMOS : pour une entrée & 0, elle doit étre vraiment proche de 0 V, typiquement inférieure 30,8 V ou i V selon | entrée, Dans notre montage, I’entrée est & 1,7 V, suffisant pour détecter un 1 par le microP. 10.5.2. Le programme hitps wn ptrain.comllectraniquelmicropipage Olin. him 58 ‘792020 PICTRAIN-X Nous n’entrons dans cette partie du programme lorsque, a la fin du traitement de la vitesse, celle-ci est 0. On s“impose en effet comme contrainte que le changement n’est possible qu’a | “arrét de la locomotive. La premigre chose est dallumer la led, il faut done passer 1’E/S 4 en sortie, état 1. On attend, ‘ensuite une action soit un changement de sens (bouton $i SENS), im soit un redémarrage de la loco (bouton S4 accélération). Dans les deux cas, pour éviter les problémes de rebond, une seule action nous fait sortir immédiatement de ce traitement et revenir dans la situation standard du chapitre précédent. Test vitesse zéro : oa = | bits STATUS, goto BouclePrincipale Nous allons ici aussi utiliser I’ instruction mov, qui copie un registre sur lui-méme, et qui nous permet par indicateur détat 2 de tester le zéro de la vitesse. Si ce n’est pas le cas, on revient au début du programme principal. Allumage LED. 4 Traitement des conmandes si vitesse 80 4} Passage bouton STOP en sortie BANAL a Ici on allume la LED en changeant ’E/S 4 en sortie (TR1510,4 4) et en positionnant la sortie & i Rappel 1 : C’est dans le registre TaTSTO que I’on indique les sens des F/S, bit aM pour sortie (2ér0 comme O, comme Output) ou All] pour entrée (1 comme I comme Input). Rappel 2 : Banko et BANK : Certains registres spéciaux, dont 11S10, sont situés dans la deuxieme partie de la mémoire du microP, et il faut done d’abord se positioner dans cette partie (GaNk1), et ne pas oublier de revenir aprés (BANK). Changement de sens : ET Boucle_sens tics 10_Acceleration goto ET Fin Boucle Sens btfec 10 SENS goto ET Boucle Sens novlw gee" xoruf A ‘Nous avons ici une boucle d‘attente dune des deux actions possibles : accélération : on saute a la fin de cette section sans changer de sens ; i changement de sens (10_SENS) : dans ce cas on exécute I’inversion du bit zéro de GPIO avec un “ou exclusif” (xorwf) de GPIO et du chiffre b 20000001 Rappel : xorwf (cette instruction a déja été vue dans "introduction et le montage Klaxon). Un “ou exclusif” P (xor) entre deux bits donne 1 BET [Sta | résultet si les deux bits sont différents (0 et 1), et 0 si les 7 to i o bits sont identiques (00 ou 1) Sile bit n° z6ro de GPIO était a z6r0 : 26r0 xor tle met 1 (ef. ligne 3 du tableau). Sile bit visé gat alll: 1 xor 1]e met a zéro (ligne 4 du tableau ». gots _BouclePrincipale On raméne ici I’E/S 4 en entrée (181510, 4 & I), et surtout on met la vitesse (qui est 4 0) 81 avant de revenir au programme principal, ce qui évitera de revenir dans la boucle de changement de sens. hitps wn ptrain.comllectraniquelmicropipage Olin. him 68 ‘792020 PICTRAIN-X 10.6. Le traitement de |‘interruption Cela doit étre la troisiéme ou quatriéme fois que nous reprenons le fonctionnement du Tiner, et si vous étes certains d’ avoir tout compris, sautez tout de suite au morceau de programme plus loin. Mais je vous recommande cependant de lire les quelques lignes ci-dessous, moi-méme je trouve que ‘cen’ est pas évident du tout, et une nouvelle couche ne vous fera pas de mal. Notre Tiner comple, ils’inerémente de 1 toutes les 16 S, et déclenche une interruption chaque fois qu’il passe de 255 8 26ro. Nous allons done inverser (de @ aH ou de Hl a Wh notre sortie t0_sortie_train a chaque interruption. Nous avons par ailleurs notre variable vA vitesse, qui contient la valeur lela vitesse. Si la sortie est & 1] on la passe a, puis on charge le timer avec la valeur de VA_Vitesse, ce qui fait qu’il va compter 255 - va_vitesse avant la prochaine interruption. Sila sortie est 4, on la passe aT, et on va compter 255 - (255 - VA Vitesse), c’est-d-dire a vitesse jusqu’& la prochaine interruption. Une période a 1 plus une période aM étant égale a 255 - vA_Vitesse + VA Vitesse, c’est-a-dire toujours 255, done une fréquence fixe de 240 Hz, quelle que soit la valeur de VA vitesse. C'est ce qui est réalisé dans le morceau de programme ci-dessous (il n’y a pas de nouvelle instruction, vous devriez pouvoir le lire et le comprendre). By ietiaers a ‘btfsc 10 Sortie Train goto ET Sortie Haut erumretime bef T0\Sortie.Trnin ELEN ain’ owavitecce dl rublu 4:355! + Chargenent finer avec inverse fréquence nom decf VA Conpteur_tnertie,E ears rssertataene bef 10 Sortie Train novi VA Vitesse, ae return A chaque passage de la sortie a 41, nous avons un décrément du compteur d’inertie, qui permet de tenir compte de I'inertie dans I’accélération ou le freinage, voir plus haut. dec* est une nouvelle instruction, qui ne fait que soustraire 1 au registre indiqué en opérande. Le résultat peut étre soit rangé dans le méme registre (si on indique ,€ comme ici), soit rangé dans le registre w (si on indique ow. Dans ce dernier cas, sion récupére la valeur i inchangé. ile moins 1 dans W, Ie registre général initial reste 10.7. Conclusion Ce montage fonctionne sans probléme, ni réglages, il a été testé chez moi et chez Jidé avec Aifférents types de locos, Plusicurs variantes sont possibles : par exemple on pourrait ajouter, sur Ie circuit de puissance, ‘un dispositif permettant de récupérer un courant continu proportionnel au rapport cyclique. Pire, certains songent déja a récupérer la F.C.E.M. (voir ce terme dans les ouvrages spécialisés) pour améliorer encore le rendement ! Et avee ¢a, on peut faire rouler au ralenti une 020 Decauville Hoe Jouef de 1967, qui ne marchait méme pas en'1967 ! [Montage a venir dans Ptitrain.] En ce qui concerne le programme, vous pouvez bien entendu modifier les paramétres pour avoir plus ou moins de erans dans la vitesse, ‘ou changer l'inertie, ou la fréquence de 240 hertz... je fais confiance a votre imagination. ‘On pourrait aussi sophistiquer le programme cen calculant une valeur de cran différente pour les ‘rans bas et les erans haut, sachant que la vitesse réclle de la locomotive n’est pas une fonction hitps wn ptrain.comlslectraniquelmicropipage Olid. him 718 ‘792020 PICTRAIN-X linéaire de la variable vA Vitesse. Digitally Selected Outputs Bref, beaucoup de choses sont possibles*, ce aii montage est une base’ pour de fates Wee ala nae EA vm Fa 1 soutaite Tapptiquer a des automatons. pias . compliqués comme par exemple une version du a ‘Numerax a microP (bonne chance !). wwe % II serait également possible de remplacer carrément le transistor de pulssance directement par un LM317#*, ce qui permettrait de profiter des sécurites en cas de surcharge et de court-circult, de ce composant, Idée de Jidé, fondée sur ce schéma de National Semiconductor @, pas encore testée, 1 1.P.M. de 'A.M.F.N. nous écrit : "Malheureusement, nous sommes plusieurs & avoir essayé, ‘et ca ne donne pas de bons résultats, parce que cette fonction du LM317 est trés surfaite : en Pratique, ile met en limiteur de courant, surchauffe un max et finit par griller si on n'a pas prévu un Fadiateur surdimensionné....& moins qué ce soit une autre partie du circuit (palpeurs de prise de courant des locos...) qui grille !" N.B. — Textes, schémas, programmes © Psi pour Ptitrain, Photos ‘Jidé ou D.R. quand ‘signals. — Toutes vos remarques ot commentaires sont bienvenus, et les pages de Ptitrain ne sont pas . statiques : les erreurs sont corrigées sitét connues, les Psi améliorations, éclaircissements, etc, feront |’objet de mises § jour 11/1/08 fréquentes. > puitrain P Electronique P PicTrain P Page suivante Ptitrain, "e-magazine du traln éclectique. — Directeur de la publication : Christophe Franchinl Rédacreur en chef ?Jean-Denis Roncinet hitps wn ptrain.comllectraniquelmicropipage Olin. him

You might also like