You are on page 1of 6
‘792020 PICTRAIN-V > Ptitrain P Electronique P PicTrain Page précédente Cette rubrique PicTrain est toute nouvelle, elle a débuté il y a un mois ! Vous pouvez aisément nous rattraper et sauter en marche ! Aujourd”hui a notre menu : 5. Les sous-programmes 5.1. Premler sous-programme : émission du san ‘i 5.2. Deuxiéme sous-programm: 5.3. Tr ous-programme : fintertuption 5.4 5.5, . Initialisation des paramétres : Bank, Trisio, Wpu, Intcon, Pie... Résumé des instructions rencontrées jusqu‘ici 5. Les sous-programmes Pour réaliser tout ce que la page 4 présentait, nous allons done définir trois sous-programmes I les sous-programmes SON_1 et oN_T29, qui mettent en place les paramétres de chaque son, Ef le sous-programme inttimert, exécuté a chaque interruption (inttimert est le nom que j “utilise en standard pour le sous-programme de Timers intesrupt) 5.1. Premier sous-programme : émission du son ti son TL, 668 Hz Son_TLL rovlw '253 valeur poids fort du tiner nove ‘SAV_THRAH sauvegarde ovat THR changement tiner poids fort ov aa } valeur poids faible du timer rove ‘SAV _THRAL sauvegarde nove THRIL chargenent tiner poids faible bet TAcoN, THRION Tancenent cu tiner novi "255° 5 chargenent conptour durée rove cr. 256 5 boucle_ tii befsc TacoN, TaRION 3 goto boucle_tii 4} attente fin durée return j Que fait ce programme A ? Il ne fait que charger les valeurs que nous avons calculées avant pour le son ti dans le Tinert et aussi dans deux registres généraux que nous utiliserons plus loin, et ensuite il lance le comptage. Enfin, il attend (boucle) que la durée soit écoulée et revient Al appel du sous programme. Nous allons décortiquer ce sous-programme ligne par ligne = SON_TLL Ceci A est une étiquette, c'est-a-dire le nom du sous-programme. ovlw 253 5 valeur poids fort du timer rnovwf ‘SaV_THRAH } Sauvegarde’ rove THT J changenent timer poids fort Ici Aon charge la valeur 253 (poids fort) dans les registres SAVTMRAH et THRAH. 5.1.1, Pourquoi ? Nous aurons besoin de cette valeur plus loin, on I’éerit done dans un coin pour pouvoir ia retrouver plus tard, et on charge une premiére fois le Tinert. Comment ? Rappelez-vous qu’ on ne peut pas utiliser deux registres dans la méme instruction, et qu'il faut done passer par le registre de travail W: 1 Par rovin, nous chargeons notre valeur 253 dans le registre de travail ; poviw signifie “Move Literal to W", cest-d-dire copie du littéral dans W ; “littéral” est Ie terme utilisé pour indiquer une valeur dans une ligne de programme. 1 nov SAV_THRAH copie le registre de travail dans le registre SAV_THRIH I novwf THRAH copie le registre de travail dans THRIH ; novus signifie “Move from W to File”, Cest-&-dire copie du contenu de W dans un registre. novi 9:27 5 valeur poids faible du tiner nove SAV_IHaIL J souvegarde rovef TwRaL } changement timer poids faible Ensuite nous faisons & exactement la méme chose avec la valeur et les registres de poids faibles. hitps iw pttrain.comlelectraniquelmicropipagedslindx. him ‘792020 PICTRAIN-V ose acon, THRION 5 ancenent du tiner Eton lance le comptage & Tinert, 5-1.2. Pourquoi ? Jusqu’a présent nous n’avons fait que paramétrer notre timer, mais il est toujours al’ arrét. Cette instruction lance le comptage. Comment ? Linstruetion bsf (Bit Set in File) met & 1 un bit dans un registre, Ie bit TwR10N dans le registre TICON. Ce registre est le registre de controle du Tiner, qui contient différents parametres ‘qui ne nous intéressent pas ici, sauf le bit TARION qui en quelque sorte I’interrupteur du Timert : sil est 1, le timer compte, sil esta zéro, il est arrété. existe bien entendu I’instruction inverse, bef (Bit Clear in File), qui met le bit &o. Remarque : lorsque I’on manipule un seul bit comme dans I’instruction sf, l’opérande est toujours “Registre, Bit”. Pour les registres spéciaus, les bits ont en général des noms, comme ici le bit TACON du registre THRION, cependant on peut aussi écrire TICON, @, car THRION est le bit o de ce registre. Retenez done que pour les registres spéciaux les bits peuvent étre appelés par des noms plutat ‘que par leur position dans le registre, ce n’est qu’ une facilité de programmation, le résultat est le Voici, par exemple,e registre INTCON ¥ (qui contre les interruptions), montrant les huit bits de son contenu du bit n° 0 (e plus @ droite) qui s“appelle GPIF et qui est actuellement a zéro,jusqu au 7e, GIF qui actuellement vaut 1. (Ces noms de baptéme ne tombent pas du cel, is sont “enseignés” a assembleur par intermédiaire du fichier ‘Pr2F675,ine. On pourrait méme les changer sion voulait (mais on ne veut pas). [Note de Jidé) bse ‘acon, TaRION 5 Tancenent cu timer rovlw '255° 3 changenent’ conpteur durée ove c7T_256 Ii on charge 255 (valeur maximum) dans un compteur (registre général), comme plus haut en cchargeant un “littéral” dans W puis en copiant W dans le registre. est ce registre que nous utiliserons pour contréler la durée du son. boucle Tit btfse TAcoN, TaRION 5 test fin durée (xtimer arrété) goto boucle_Tii } attente Fin durée Enfin, nous avons la boucle d’attente & qui tourne en rond jusqu’ a la fin du son. ‘Nous avons déja vu I'instruction btfsc, qui teste la valeur dun bit, et qui saute I’instruction suivante si le bit est a zéro ; dans ce cas, on teste I’interrupteur du Tinert, tant quil est en fonction (1) on bouele, sinon on saute (on ignore) le goto. return 5 Ceci A est toujours la derniére instruction d’un sous-programme, elle renvoie I’exécution du. programme vers |’appel du sous-programme, cest-a-dire vers le call eorrespondant. ‘Normalement, avec tout ce que nous avons vu jusqu’a présent, vous devez avoir compris le fonetionnement de ce sous-programme. Résumé des instructions rencontrées jusqu ici Instr. Opérande Fonction ote étiquette call étiquette return pas d-opérande btfsc registre, bit btfss registre, bit nov Littéral nowt registre bsf —registre, bit bef __registre, bit hitps iw pttrain.comlelectraniquelmicropipagedslindx. him ‘792020 PICTRAIN-V 5.13. Remarque : si vous n’aver pas haussé un sourcil dans mon explication ci-dessus, c’est que vous n’ avez pas tout a fait regardé dans le détail : la valeur chargée dans le registre TuR1 de poids faible (TMR1L) est de 27 et non de 10 comme nous |’ avions calculé. Ce n’est pas une erreur, il y a une explication bien précise. On verra plus loin qu’a chaque interruption nous allons exécuter un certain nombre d ‘instructions, notamment pour recharger le compteur avec les valeurs sauvegardées. Entre |’instant ot interruption de décienche (le timer vient de passer a zéro) et le moment oi on le relance pour un nouveau comptage, il sest passé un certain temps, qui vaut 17 uS ¥. 11 faut done diminuer le temps de comptage de cette valeur pour ne pas compter ces 17 nS deux fois (c'est-a-dire augmenter le départ du compteur puisque |’ on fonctionne “a I’ envers”). Interruption Interruptios Dasculement basculement Durde du traitement de Comptage 1 334 ys Vinterruption 37 ys Ces 17 pS ne sont pas évaluées “au pif’, mais caleulées en tenant compte du temps d”exéeution des instructions entre I’interruption et le redémarrage du compteur, sachant que la plupart des instruction s’exécutent en 1S (= un tic dhorloge). Attention, n’essayez pas de caleuler vous- ‘mémes, car une partie des instructions ne vous est pas visible car dans le fichier “cache”. Cette correction s” applique bien entendu aussi dans le sous-programme ta. 5.2. Deuxiéme sous-programme : émission du son ta son Taa, 370H2 Son_Taa novi '250 5 rove ‘SaV_TwRaH 5 nove Ra 5 ov 203 3 nove SAV_THRIL : rove TwRIL j bse T1cON, THRION : rovlw. 255 i nove cr_256 : boucle Tae i otFse acon, TaRION : goto boucle_Taa i return : Je n’insisterai pas, & ce sous-programme est identique au précédent, sauf que les valeurs chargées dans les registres sont celles du son ta. 5.3. Troisiéme sous-programme : l’interruption A chaque interruption (c'est-i-dire a chaque fois que le Téner1 passe par zéro), un sous- programme spécifique est appelé qui eflectue les opérations suivantes : IH Arrét du timer et rechargement des valeurs pour le cycle suivant, Inversion de la sortie, 1 D6crément du compteur de durée, test si fin durée (eompteur=0) 1 Sinon, relancerle Timer. pour une autre période. 3 Anterruption THR, J appelée. 8 chaque interruption TAR inttieert oct TacoN, TaRION 5 arret tiner novtw SAV_THRLH J chargenent timer poids fort rovet THR 5 novi SAV-THRIL } changement timer poids faible rover TwRIL j novi b'oneaeaes0: 5 inversion sortie xorwf rI0,F b decfsz 1.256, € 5 décrénent conpteur durée bse TAcON, TAMRON } relancer timer hitps:iwn ptrain.comlelectraniquelmicropipagedsindx. him ‘792020 PICTRAIN-V return i 4} interruption THRE |} appelée.a chaque interruption ThRe * return 3 On va aussi suivre ce sous-programme 4 ligne par ligne, snttinert ‘A Etiquette nom du programme oct TACON, THRION 5 arret tiner Arrét du timer ; on met I“interrupteur a zéro (le bit THRI0N de I’octet T1coN). Ceci est une précaution car on va juste aprés modifier la valeur du timer, et le modifier alors qu'il continue de tourner risque de lui faire perdre les pédales. novi SSaV_THRAH 5 changenent timer poids fort ove THR 5 novi SSAV_THRAL 5 chargenent timer poids faible nove THR 5 A On charge les valeurs sauvegardées dans les sous-programmes précédents dans le Timer1 pour ‘un nouveau cycle. a-dire On a ici une nouvelle instruction movfu (Move File to W), qui est I’inverse de nova, cest qu'elle charge le contenu du registre dans W. Je pense que vous savez. maintenant qu'il faut procéder ainsi : pour charger une valeur MaValeur dans un registre MonRegistre, il faut d’abord copier MaValeur dans W, puis de W dans ce MonRegistre, Encore une fois : il n’existe pas dinstruction qui utilise deux registres, il faut toujours passer par intermédiaire du registre de travail W. nov *epee00010" 5 Anversion sortie sort G10, i Chargement du littéral (en binaire) 20000010 dans W, et nouvelle instruction xorwf (eXclusive Or W with File), ou exclusif ii entre W et le registre spécial GPO. bits bit 2 résultat 4.Un “ou exclusif” entre deux bits donne 1 si 0 0 0 les deux bits sont o - 1 (différents), et 0 si les bits 0 1 1 sont 0-0 ou 1-1 (identiques). 1 0 1 Voir en rubrique Ja Techno facile, la_page 1 1 ° consacrée 8 cette fonction logique méconnue. Sile bit 1 est Ao, le résultat vaut le bit 2; sile bit 1 esta 1 le résultat est l’inverse de bit 2. xoruf est toujours effectué sur tous les bits du registre concerné, ici cP10, mais seul le bit 1 (deuxiéme & partir de la droite) est concerné = il est automatiquement inversé. D’une maniére générale, lorsque vous modifiez le registre P10, tous les bits déclarés en sortie (uniquement le bit 1 du haut-parleur dans notre exemple), sont écrits, c'est-A-dire la valeur électrique sur la patte est modifiée, Le # aprés GPL0 indique que le résultat de I” instruction est rangé dans le méme registre. dectsz 1.256, décrément compteur durée ost TacbN, TRON } relancer tiner L’instruction decfsz (Decrease File and Skip if Zero) décrémente de 1 le registre, et saute 1 struction suivante si le compteur passe & zéro. Pour nous, ce compteur (chargé a 255 au Jancement dun son) est décrémenté & chaque période. Lorsqu ‘il arrive a zéro, le programme saute la remise en route du compteur Tiner2, et I’émission du son s’arréte ; s’il n’est pas a zéro, on relance le compteur pour une autre période. Ici aussi, le F indique que la valeur initiale moins un est rangée dans le méme registre, return 7 ‘A Fin du sous-programme. j interruption THR ippelée a chaque interruption TARO Inetizero return 3 Pour des besoins de construction de mon programme, il est nécessaire d’avoir un sous- programme inttinerd “bidon”, c'est-i-dire juste avec I’ instruction return. No signale simplement la fin des lignes de programme, 5.4. Initialisation des paramétres Au début du programme, j’avais volontairement sauté cette partie du code hitps:iww ptrain.comlslectraniquelmicropipagedslindx. him ‘792020 PICTRAIN-V 5 PARAMETRES SPECIFIQUES © sank. crt TaISIO } port en sortie ost TRISIO,5 J Sau 5 pour déclenchenent ost wu,5 } résistance de rappel sur le port 5 5 registre controle interruptions crf TNICON 5 ost INTCON, GTE J Anterruptions activées en permanence ost INICON, PETE } autorise interruption périphériques 5 (notamment Tinert) | registre interruptions périphériques clr I 3 ost PIE, THRITE. } 5 autorise les interruptions Tiaert Banko i oct rI0,1 } sorcie a @ On va maintenant également la passer en revue ligne par ligne, cela devrait etre facile aprés avoir compris le reste du programme. Rappel : ce bout de programme n’est exécuté qu’ une seule fois, au début du programme, avant d “entrer dans la boucle principale. an, 3 5.4.1. Pour des raisons physiques, les registres spéciaux du microP sont rangés dans deux endroits différents nommés BANK@ et 5ANK2. Le déroulement normal du programme se fait en général en 8ANK@, mais pour certains registres particuliers comme ceux que nous allons initialiser ici, il faut passer en 8ANK1, Ces deux instructions permettent de naviguer entre les deux parti clef Tasi0 5 port en sortie ost TRISIO,S } Sauf 5'pour déclenchenent 5.4.2. Le registre TRISI0 est le registre qui permet de définir le sens des entrées/sorties, les bits 0 45 correspondent aux B/S 0 8 5. Un bit & 1 indique une E/S configurée en entrée, un bit & zéro une B/S en sortie. En général, il vaut mieux mettre les E/S non utilisées en sortie, pour ne pas récupérer de parasites Dans notre eas, seule I’E/S 5 est en entrée (cest le bouton poussoir), les autres en sorte. Arf est une nouvelle instruction (Clear File), qui met & zéro les huit bits du registre. bsf, déja vu plus haut, met a 1 juste le bit 5 du registre. clef wou 5 pas de résistances de rappel sauf ost wus: } Pésistance de rappel sur ie port 5 5.4.3. WPU : Tl est possible de mettre en action dans le mieroP des résistances de rappel (ou de tirage, ou pullup) sur les E/S R de ordre de 20 kQ) [comme dans la réalité, voir “Résistances de tirage” dans la FAQ du Meceano], et cela permet d’éviter d'utiliser des composants physiques hors du montage. C’est le registre weU V qui commande la mise en service par ses bits 0, 1, 3, 4 et § : bit A un (set) R en service, bit & zéro (clear) = R hors service. Dans notre cas, seule 1"E/S 5 est utilisée. Voici le schéma général du microP et de son registre WPU. La patte GP3 n’en a pas, elle est un peu “spéciale”. WPU 45v ve Bu ip ragiter 0] [0 wa bit weu2 a1 ("set") x commucaceun Ferme, Ren service ‘Ges commutateurs sont ‘commands parle registra WPU. ces, conmandes via weU Mont, dietfet que STes'e/s bit weus a0 ("clear") | ont ere configures AS commurateur ouvert, Comme dee entrees R hors service Via TRISIO | résstances "pullup™ "oe 2 trouvent danse botir ds microP) 4 registre controle interruptions clr TINTCON 3 ost INTCON, GTE } interruptions activées en permanence hitps iw pttrain.comlelectraniquelmicropipagedslindx. him ‘792020 PICTRAIN-V ost INTCON, PETE autorise interruption périphériques } (notamment Timer) 5.4.4. Le registre INTCON A (oui, le “tiroir” de tout a I’heure !) commande toutes les interruptions existantes dans le microP. Dans notre cas, nous mettons a1 (on, set) deux bits : 1 leit Gre, qui autorise les interruptions d’ une maniere générale, MH le bit PETE, qui autorise une catégorie particuligre d’interruptions appelés “interruptions périphériques”, et dont le Tiner2 fait partie. 5 registre interruptions périphériques. cine osF THRATE J autorise les interruptions Timera 5.4.5. Le registre PIE est le registre spécifique aux interruptions périphériques. Dans notre eas ‘nous mettons a 1 le bit correspondant & Timer (THR11E = Timert Interrupt Enabled), Attention, tous ces paramétrages ne sont que des paramétrages, c’ est-dedire que I’ on ne fait que préparer le microP a ‘utilisation ultérieure du timer, il ne se passe rien pour I’ instant. Banko 5 5.4.6. & Ala fin de ces paramétrages, il ne faut pas oublier de repasser en sank pour Ie déroulement du programme. bef 10,1 A titre de précaution, on met la sortie haut-parleur a 2éro. D’une maniére générale, il est préférable de mettre les sorties a zéro (cest-a-dire a la masse) au début du programme, ear les sorties peuvent étre dans une position “ indéterminée” lorsque I’ on met le courant. 5.5. Résumé des instructions rencontrées jusqu ici Instr. Opérande Fonction got —étiquette call étiquette ‘return pas d‘opérande btfse registre, bit bits registre, bit novlw Literal nowt registre bsf —registre, bit bef —_reaistre, bit xorsf registre, dest decfsz registre, dest clef registre Sur les 35 instructions de notre microprocesseur, nous n’en avons finalement utilisé que 13 pour ce Kaxon, N.B. — Textes, schémas, programmes © Psi pour Ptitrain Photos ‘sidé ou D.R. quand. signal. — Toutes vos remarques et commentaires sont bienvenus, et les pages de Ptlerain ne sont pas . statiques : les erreurs sont corrigées_ sitét connues, les Psi Strullorations, Sclaircserents, ete! fersnt objet de mises jour 15/12/07 Fréquentes > Ptitrain P Electronique P PicTrain > Page suivante Ptitrain, I’e-magazine eu train éclectique. — Directeur dela publicatos ‘Rédacteur tn chet: Jean-Denis Rondinet hitps iw pttrain.comlelectraniquelmicropipagedslindx. him

You might also like