Vous êtes sur la page 1sur 9

http://www.didel.

com/

info@didel.com

www.didel.com/pic/Cours877-1.pdf

Apprendre programmer avec le 16F877A


Exemples et exercices sous www.didel.com/pic/Cours877-1.zip
Le but est dapprendre crire des programmes en assembleur pour des applications utilisant
un code efficace sur des microcontrleurs en gnral plus petits. Notre dmarche est de tester
les programmes sur un 16F877 qui a 4 ports dentre-sortie, ce qui facilite la comprhension du
fonctionnement. Le Microdule 16F877 est aussi idal pour mettre au point des applications
utilisant des processeurs en botier 6, 8, 14 pattes (voir www.didel.com/pic/Deverminage.pdf).
En plus de la carte 877, 4 cartes Microdules et des composants aident pour les tests.
La grande ide des Microdules est que vous ne les utilisez pas dans votre application. Ils
restent toujours prts pour tester des routines et prparer des nouveaux projets.
Notons encore que pour viter dallonger ce document avec des informations essentielles pour
matriser tous les aspects dun PIC, mais pas indispensables quand on na pas encore le besoin
pour son application, plusieurs renvois sont faits des documents plus spcialiss, dont une
liste exhaustive est faite dans www.didel.com/pic/ToutSurLesPics.pdf
Matriel ncessaire
Pickit2
65.Kit Microdule M2840Eval
140.16F877A
10.Doc sous
www.didel.com/08micro/M2840Eval.pdf
La doc gnrale sur les Microdules est sous
www.didel.com/pic/Microdules.pdf
Table des matires
1ere partie (ce fichier)
Introduction
Entres-sorties et dlais
Compteurs et dcalages
2e partie www.didel.com/pic/Cours877-2.pdf
Entres et poussoirs
Arithmtique et comparaisons
3e partie www.didel.com/pic/Cours877-3.pdf
Toutes les instructions
4e partie www.didel.com/pic/Cours877-4.pdf
Priphriques internes (timer, USART, ..)
Interruptions
Programmes de test

5e partie www.didel.com/pic/Cours877-5.pdf
Squencement et multitche
Structure et mise en page
Applications

Introduction
Avant de pouvoir faire les exercices de ce document, il faut installer
SmileNG www.didel.com/pic/SmileNG.zip extraire dans c: ce qui
cre le dossier c:SmileNG Ouvrir et faire un raccourci
SmileNG.exe
Pickit2 : Chercher sous google Pickit2 install et choisir sur le site
de Microchip Pickit2 install, 3.9 MB).
Les exemples de programmes associs cette partie se trouvent sous
www.didel.com/pic/Cours877.zip. Mettre ces fichiers dans un dossier Cours877.

Connectez le M2840 au Pickit2 reli au PC via USB. Excutez SmileNG et Pickit2. Le


Pickit2 doit avoir reconnu le 16F877.

Lire le 16F877
Cliquez sur Read. Le contenu
saffiche.
Vrifiez que la tension est 5V et
cliquez sur la case On. La LED
du. M2840 sallume et le
programme T877 sexcute. Il
alterne toutes les lignes.
Dplacer lafficheur sur les ports pour vrifier que cela
clignote partout o cela a un sens (sauf RA7, 6, 4).
Le programme de test T877 est trs utile pour vrifier
en tout temps que le 16F877 est en ordre. On le
recharge dans le Pickit2 en cliquant sous File
Import Hex chercher le dossier Cours877 et charger
T877.hex.
Cliquer ensuite sur Write
Charger sous SmileNG le programme T877.asm.
On voit quil initialise les ports en sortie et envoie
des valeurs complmentaires avec une attente
entre deux.
Assembler en cliquant lendroit indiqu ou avec
la touche F5. Ceci recre le fichier T877.hex
que lon peut recharger dans le Pickit2.
Ne vous inquitez pas si vous ne comprenez pas tout ce programme, il sera expliqu par petites
tapes plus loin.
Exercice : modifier la valeur Motif, r-assembler et programmer.
Note : Pour chaque modification, une fois que lon a vu Assembly successful on clique dans
Write et le Pickit2 confirme Reloading Hex file. Ceci est trs efficace pour tester des variantes
de programmes.
(Explications plus dtailles avec copies dcran sous www.didel.com/kits/KiCalm1.pdf page 4)

Notions de base : bits, octets, constantes, variables, registres,


Si le programme T877.asm ci-dessus est du charabia complet, le mieux est de lire la brochure
Dauphin et de faire quelques exercices. http://www.epsitec.ch/Dauphin.zip Cette brochure vous
apprend programmer un processeur invent, la fois plus simple et plus riche que les PICs.
Le notions de nombre, constantes, variables, etc. sont expliques avec plus de dtails dans le
fichier www.didel.com/pic/Bases.pdf dont la lecture est recommande maintenant ou plus tard,
quand vous aurez fait quelques exercices.
Architecture des PICs
Les PICs ont une architecture simple, avec une mmoire dinstructions 12 ou 14 bits, des
variables 8 bits et des priphriques 8 bits dans le mme espace que les variables. Cet espace
des variables est coup en 4 banques, ce qui complique la slection : on travaille principalement
en banque 0 en passant brivement dans dautres banques lorsque cest ncessaire.
Comprendre larchitecture interne nest pas essentiel. La doc de Microchip est naturellement la
rfrence. ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf. Le document
www.didel.com/pic/Architecture.pdf prsente une vue simplifie avec mise en vidence des
notions importantes.
Les priphriques ont plusieurs fonctions et il faut initialiser la bonne selon lapplication. Cette
richesse sera vue dans la partie 4, et les programmes PicTests www.didel.com/pic/PicTests.pdf
vitent de se perdre dans la doc dtaille de Microchip pour les utilisations standard. Si vous
voulez en savoir plus sur des bits qui dfinissent le comportement des priphriques, il faut
chercher dans la documentation du fabricant ou utiliser une traduction en franais, parfois un
peu amliore, par Bigonoff ou Oumnad. Les livres de Tavernier ont la mme approche.
Lassembleur CALM
Les rgles de lassembleur et les pseudo-instructions apparatront petit petit, pafois sans
explications. Si une prsentation systmatique vous est ncessaire avant de voir des exemples
de programme, lisez www.didel.com/pic/Calm.pdf

Entres et sorties
Lintrt des microcontrleurs est quil ont des sorties sur lesquelles on peut brancher des
diodes lumineuses, dans amplis pour commander des moteurs, un haut-parleur. Ils ont des
entres pour connecter des poussoirs et interrupteurs, pour lire des signaux analogiques, pour
mesurer des dures dimpulsions. Ces fonctions sont programmables et cest notre premier
souci : configurer le microcontrleur dans le mode compatible avec lexercice.
Registre de direction
Pour dcider si une broche du processeur est une entre ou sortie, il faut que le contrleur ait
des aiguillages commands par un registre de direction appel Tris. Si le bit Tris est 1 (input)
la broche du circuit est connecte au bus et amne linformation dans le registre W, si
linstructionMove Port,W est excute. Si le bit Tris vaut 0 (output), cest linformation qui vient
du bus qui est mmorise dans le registre et active en sortie.

Ladresse du registre Tris est la mme que pour le port correspondant, mais dans la banque 1,
slectionne en activant le bit RP0 du registre Status.

Un premier exercice : copier le portA sur le PortC


Le 16F877 a cinq ports, A et E sont incomplets. Le
programme le plus simple que lon puisse crire
copie ltat des lignes dentres du PortA sur les
sorties du PortC. Le microdules Sw8 impose ses 0 et
1 sur le portA et transfre linformations sur les
diodes du module Lb8 : rouge pour ltat 0 et vert
pour ltat 1.
Le cur du programme Ex877-101.asm est
Loop:
Move
Move
Jump

PortA,W
W,PortC
Loop

Chargez le programme et observez.RA6 RA7 ne


sont pas disponibles sur le 877.
Peut-on imaginer plus simple ? Move est en fait une copie, on ne
dplace pas linformation, on en fait une copie. On ne peut pas copier
directement du portA vers le portB, il faut passer par le registre W, qui
joue un rle de plaque tournante.
Loop est un nom invent (une tiquette pour dire o est la prochaine
instruction) ; on aurait pu mettre Boucle, Toto, mais pas Jump ou PortA
qui sont des noms rservs. Il faut mettre le : sans espace devant.
Pour copier C dans D, il faut adapter linitialisation, et
comprendre que le concepteur du Pic en 1975 na
pas vu assez loin : il a rserv trois instructions Tris A
B C et cest tout. Pout agir sur TrisD et E, il faut
passer par la banque 1, et utiliser les mmes
numros dadresse que ceuxdes ports D et E.
On pourrait crire pour linitialisation
Set
Move
Move
Clr
Move
Move
Set
Move
Move
Clr

Status:#RP0
#16'06,W ; Dsactive
W,AdCon1 ; le A/D
Status:#RP0
#-1,W
; PortC en entre
W,TrisC
Status:#RP0
#0,W
; PortD en sortie
W,PortD
; TrisD
Status:#RP0

Cest plus simple comme cest fait dans Ex877-102.asm

Profitez de jouer avec le module PoToD8, doc sous www.didel.com/08micro/PoToD8.pdf , pour


mieux comprendre les nombres positifs et ngatifs (relire www.didel.com/pic/Bases.pdf).
Note Il peut y avoir problme pour lire sur le PortB. car le programmateur utilise RB6 et RB7
pour crire dans le 16F877. Un interrupteur ferm peut perturber, malgr la rsistance srie.
Valeur fixe dans le portD
Si on regarde les affichages de la photo prcdente, on lit 14 (hexa) et 00010100 (binaire).
Tous les processeurs travailent en binaire (base 2) que nous noterons 200010100. On prfre
souvent lhexa plus compact 1614.
Assignons une valeur fixe, une constante dans le portD, qui sera en gnral utilis pour afficher
des valeurs. Le cur du programme Ex877-103.asm est
Loop: Move
Move
Jump

#166A,W
W,PortD
Loop

; ou Move #201101010

Faire les exercices proposs au bas du programme (ce qui suit le .end nest pas assembl).
Noubliez-pas que cest trs rapide : modifier la valeur, assembler, dplacer la souris, write,
cliquer assemblage correct pendant que cela programme, observer les microdules. Ce nest que
lorsque le nom du .hex change quil faut aller chercher sur le disque.

Question : ce programme copie sans arrt sur le portD ; une fois suffit. Oui, mais il faut toujours
dire au processeur ce quil doit faire. On pourrait crire
Move #166A,W
Move W,PortD
Ici: Jump Ici
; tourne-toi les pouces !
Encore une modif au programme, enlevons le # qui veut dire constante, valeur
immdiate :
Move 166A,W
Move W,PortD
Ici: Jump Ici
Quelle est la valeur affiche ? Peut-on la prvoir ?
Non car cest une variable qui rsulte dun tat imprvisible des bascules
la mise sous tension (ce nest pas toujours la mme chose si vous coupez).
Essayez

Move 167,W
Move W,PortD
Tiens, cest la copie le portC ! Effectivement les ports sont comme des
variables. Le portC est ladresse 7 sil est initialis en entre on le lit.
Essayez

Move 1685,W
Move W,PortD
Lassembleur signale une erreur ! bien sr, il ny a que 7 bits pour adresser
les variables, ladresse doit tre infrieure 167F.

Osciller le port D
Activer-dsactiver le portD, donc crer une impulsion positive sur tous ses bits, scrit de
plusieurs faons. La premire et la 3e solution sont identiques (les mmes instructions sont
gnres).
Move
Move
Move
Move

#211111111,W
W,PortD
#200000000,W
W,PortD

Move
Move
Clr

#211111111,W
W,PortD
PortD

Move
Move
Move
Move

#-1,W
W,PortD
#0,W
W,PortD

Pour rpter ces instructions dactivation/dsactivation, on cre une boucle en mettant une
tiquette au dbut de la boucle et en ajoutant une instruction qui saute cette tiquette, cest
dire ladresse correspondante dans la mmoire du processeur, comme dans le programme de
test.
Loop:
Move
#211111111,W
; 1 s
Move
Move
Move
Jump

W,PortD
#200000000,W
W,PortD
Loop

Les PICs 4 MHz excutent une instruction par microseconde (mais 2 s pour les sauts). Ce
programme va activer le port D pour 2 micro secondes seulement, et dsactiver pour 3 micro
secondes. On ne verra rien sans utiliser un oscilloscope.
Boucles dattente
Pour que le processeur modifie les sorties une vitesse humaine, il faut insrer des boucles
dattente. On initialise un compteur et on dcompte jusqu la valeur zro, que le processeur sait
bien reconnatre.
Att:

Move #250,W
Move W,Cx1
Dec
Cx1
; 1 s
Skip,EQ
; 1 s
Jump Att
; 2 s

Linstruction Dec diminue de 1 la variable Cx1. Cx1 est un nom invent, et il faut dire o cette
variable se trouve en mmoire. Cest libre partir de ladresse 1620, donc il faut dclarer avant
le dbut du programme
Cx1 = 1620
Linstruction Skip,EQ se prononce Skip If Equal, saute si cest gal, si lopration prcdente a
un rsultat gal zro. Si ce nest pas gal zro, on passe linstruction suivante, dcompte
nouveau. A noter que le Skip,EQ, comme le Jump, sexcute en 2 microsecondes.
Ce bout de programme va faire 250 fois la boucle qui dure 4 microsecondes, donc la dure
totale est de 1 milliseconde (plus les 2 microsecondes dinitialisation du dcompteur).

A noter les trois nouvelles instructions. Dec Cx1 dcompte la variable mentionne. Linstruction
Skip,EQ permet de savoir si le compteur est zro (EQ equal). Si oui, le processeur saute
linstruction suivante. Si non, il excute le saut qui lui fait attendre encore un tour.
Ce nouveau cur de programme scrit (programme complet Ex877-104.asm)
Loop:

Move
Move

#211111111,W
W,PortD

; on allume

; attente de 1ms
At1:

Move #250,W
Move W,Cx1
Dec
Cx1
; 1 s
Skip,EQ
; 1 s
Jump At1
; 2 s

Move
Move

#200000000,W
W,PortD

; on teint

; attente de 1ms
Move #250,W
Move W,Cx1
At2: Dec
Cx1
; 1 s
Skip,EQ
; 1 s
Jump At2
; 2 s
Jump
Loop

Cest encore trop rapide pour notre oeil. On ne peut pas augmenter la valeur 250 au del de
255, car la variable Cx1 est un mot de 8 bits et les PICs nont pas dinstructions pour des
compteurs ou dcompteurs plus grands que 8 bits.
On fait alors une 2e boucle qui appelle la premire et utilise une 2e variable. Vous voulez un
dixime de secondes ? Il suffit de rpter 100 fois la boucle de 1ms .
; Boucle 100 millisecondes = 0.1s
Move #100,W
Move W,Cx2
At12: Move #250,W
Move W,Cx1
At11: Dec
Cx1 ; Boucle 1ms
Skip,EQ
Jump At11
Dec
Cx2
Skip,EQ
Jump At12

On pourrait naturellement compter et comparer quand on atteint la valeur 100 ou 250. Cest
moins efficace avec le PIC.
Relisez plusieurs fois si ce nest pas bien compris. Ces deux boucles imbriques doivent tre
bien assimiles. On les teste dans la section suivante.
Programme complet
Il faut donc insrer nos boucles dattente de 100ms aprs avoir crit et aprs avoir modifi le
motif sur le PortD. Le programme doit aussi initialiser le PortD en sortie, et dclarer ladresse
des variables Cx1 et Cx2.
\prog;Ex877-105|Clignote portD
.Proc 16F877
.Ref
16F877
.Loc
16'2007
.16
16'3F39
CX1
= 16'20 ; Dbut des var
CX2
= 16'21
Motif1 = 16'55 ; 2'01010101
Motif2 = 16'AA ; 2'10101010
Deb:

Clr
Set
Move
Move
Move
Move
Clr

PortA
Status:#RP0
#16'06,W
W,AdCon1
#0,W
; PortD
W,PortD ; sortie
Status:#RP0

Loop:
Move
#Motif1,W
Move
W,PortC
; attente 200ms
Move
#200,W
Move
W,Cx2
At12:
Move
#250,W
Move
W,Cx1
At11: Dec
Cx1
Skip,EQ
Jump
At11
Dec
Cx2
Skip,EQ
Jump
At12

Move
#Motif2,W
Move
W,PortC
; attente 200ms
Move
#200,W
Move
W,Cx2
Att22:
Move
#250,W
Move
W,Cx1
At21: Dec
Cx1
Skip,EQ
Jump
At21
Dec
Cx2
Skip,EQ
Jump
Att22
Jump

Loop

.End

Optimisation et simplifications
Linstruction DecSkip,EQ remplace les deux instructions de la boucle dattente.

Si on na pas besoin dune dure prcise, on peut ne pas recharger les compteurs. Aprs tre
arrivs zro, ils recommencent un tour de 256 pas. La faon la plus simple de faire une
attente de 256x256x3 s =~ 0.2 secondes est dcrire
A$: DecSkip,EQ
Jump A$
DecSkip,EQ
Jump A$

Cx1
; A$ est une tiquette dite locale
Cx2

Le programme T877.asm utilise cette attente simplifie et clignote tous les ports en inversant le
motif avec un ou-exclusif (partie 2). Le programme est nettement plus court.
T877.hex est un programme de test que lon recharge toutes les fois que lon veut vrifier que le
processeur fonctionne et que toutes les sorties sont connectes. Sil ne tourne pas, cest que
loscillateur interne nest pas initialis.
Routines
Ce nest pas trs lgant, ni trs efficace, de devoir crire deux fois la mme boucle dattente,
comme dans le programme Ex877-105.asm. On crit une seule fois le module, appel routine,
et on peut lappeler autant de fois que lon veut. Linstruction Call fait lappel et la fin de la
routine, linstruction Ret (return) retourne linstruction qui suit le Call.
Ecrivons une routine DelWx1ms avec un paramtre en entre qui est le contenu de W.
DelWx1ms signifie Delai de contenu de W fois 1 milliseconde. Cest la grande difficult de
tous les programmes informatiques : dfinir des noms qui expriment au mieux la fonction, et que
lon utilise ensuite sans hsitation.
\rout:DelWx1ms|Attente de (W) fois 1ms
\in:W nombre de ms
\mod:W Cx1 Cx2
DelWx1ms: Move
W,Cx2
A$:
Move #250,W
Move W,CX1
B$: Nop
DecSkip,EQ CX1
; boucle 1ms
Jump B$
DecSkip,EQ Cx2
; boucle (W) fois 1ms
Jump A$
Ret

Cette routine est le premier lment dune bibiothque de routines que chaque programmeur se
constitue. Les 3 premires lignes contiennent toute linformation ncessaire pour lutiliser.
Compteur
Compter ou dcompter en 8 bits est trivial. Comment compter plus loin que 256 ?
Comptons sur le portD, toutes les quelques ms. Toute les fois que le compteur D passe par
zro, le bit Z du registre Status sactive (le Carry dont on parlera plus tard nest pas activ). On
teste ce bit pour dcider si on incrmente le portC.
Les microdules visualisent ce compteur, charger et excuter le programme Ex877-106.asm.
Loop: (attente)
Inc
PortD
Skip,EQ
Jump
Loop
Inc
PortC
Jump
Loop
dure 5 ou 4 us

Loop: (attente)
IncSkip,EQ PortD
Dec
PortC
Inc
PortC
Jump
Loop
dure 4 us

On voit que la 2e solution est astucieuse. Cela ne semble pas rationnel de dcompter et
compter la mme variable chaque cycle, mais le rsultat est que le programme est plus court,
plus rapide et sa dure est toujours la mme.
La dcrmentation, faire en exercice, a aussi une jolie solution.
Saturation
Comme un compteur de voiture, un compteur binaire recommence zro aprs la valeur
maximum. Si on veut bloquer un compteur 8 bits 16FF, on crit
Inc
Cnt
Skip,NE
Dec
Cnt

; saute si diffrent de zro


; on revient en arrire 16FF si =0

Pour bloquer zro un dcompteur, on refuse de dcompter sil est zro. Linstruction Test ne
fait rien dautre que dactiver Z si le contenu de la variable est zro.
Test Cnt
Skip,EQ
Dec
Cnt

; saute si gal zro

Exercice : bloquer un compteur ou dcompteur 16 bits.


Dcalages
Il ny a que deux instructions de dcalage dans les PICs, qui sont en fait des rotations travers
le Carry. Le Carry est un bit dans un registre de fanions, dtat (status) que nous retrouverons
propos darithmtique. Pour le moment, cest un bit dans le processeur, que lon peut mettre
un ou zro avec les instructions SetC et ClrC.
RRC
Var
Rotate Right through Carry
RLC
Var
Rotate Left through Carry

Pour retrouver linformation, il faut donc 9 dcalages.


On peut tester facilement avec le portD et les instructions du programme
Ex877-108.asm. On remarque que pour avoir une dlai dobservation suffisant, il a fallu dfinir
une attente multiple de 0.1 seconde, donc un dlai maximum de 25.5 secondes
Loop:

Move
Call
RRC
Jump

#10,W
DelWx01s ; 10x0.1s = 1 seconde
PortD
Loop

Regardons les programmes faits. Il contiennent beaucoup dinstructions qui reviennent chaque
fois. Crons un module qui ne change plus, et est import depuis le disque chaque
assemblage. Ce module contient en plus des deux routines de dlai une routine dinitialisation
qui met le portA en entre, et les ports B, C, D, E en sortie. Ce fichier Ex877Init1.asi est appel
par le programme Ex877-109.asm qui fait la mme chose que le Ex877-108.asm prcdent.
Les fichiers avec lextension .asi ne peuvent pas tre assembls, il sont toujours appels
(insrs) dans des fichies excutables avec lextension .asm
Jouons encore avec les dcalages
Pour se faire la main, commenons dcaler sur 16 bits, en observant les LEDs sur les ports C
et D. Initialisons ces deus registres (ports) et dcalons droite en vidant, cest--dire en
injectant des zros, en mettant le carry zro avant chaque dcalage.

Loop:

Move
Move
Move
Move
Move
Call
ClrC
RRC
RRC
Jump

#2'10110111,W
W,PortC
#2'10101101,W
W,PortD
#10,W
DelWx01s
PortC
PortD
Loop

On voit dans ce programme Ex877-110.asm que le Carry transporte le bit pouss dehors du
PortC vers le portD.
On veut maintenant faire lquivalent de Move PortC,PortD par dcalage. Il faut 8 dcalages, et
on va utiliser un dcompteur, comme dans les boucles dattente. Voir Ex877-111.asm
On peut tester le Carry avec linstruction Skip,CC qui saute linstruction suivante si le Carry est
Clear ( zro). On a aussi linstruction Skip,CS.
Comme exercice, comptons les bits un. Lalgorithme est simple : on dcale. et toutes les fois
que le carry est un, on compte. En parallle, on affiche le rsultat en binaire sur le portB.
; initialisation
Move #2'10110111,W
Move W,PortC
Move #2'10101101,W
Move W,PortD
Clr
PortB ; servira de compteur

Loop:

Move #10,W
Call DelWx01s
ClrC
RRC
PortC
RRC
PortD
Skip,CC

Inc
Jump

PortB
Loop

Ce programme Ex877-112.asm narrte pas de dcaler, mais comme le registre est vide et que
cela ne compte plus, on ne sen rend pas compte. Dans un programme rel, il faudrait ajouter
un dcompteur pour sarrter aprs 16 cycles.
Ping-pong vous dinventer
On veut que la led Verte sallume guche, se dcale seule et rebondisse droite. Comment
faire ? On part avec les ports C et D zro. On injecte la Led verte avec le Carry. On dcale en
testant si le carry. Quand il passe un on continue dans une 2e partie de programme. Envoyez
votre programme pour correction info@didel.com.
Rsum du chapitre
On a montr la diffrence entre constante (valeur immdiate) et variable.
Les variables sont numrotes de 0 167F ; de 0 1620, on a des ports avec des noms
rservs (PortA, etc). On a utilis les ports B, C, D comme variables avec des boucles dattente
pour avoir le temps dobserver. On dclare lemplacement des variables en donnant leur
adresse. Cx1 = 1620. On verra plus tard une meilleure faon pour ces dclarations.
Les variables ont 8 bits de large, mais des ports peuvent tre incomplets. On initialise une
variable en passant la valeur par W dabord. Linstruction Move #Valeur,Variable nexiste pas,
elle ncessiterait plus des 14 bits des instructions.
La plupart des instructions agissent sur les fanions (flags) Z et C, qui sont deux bits du registre
Status. Dans ce registre on trouve aussi un bit RP0 qui slectionne un 2e groupe de variables,
qui contient en particulier les registres de direction. Les regitres de direction TrisA, TrisB, TrisC
peuvent tre modifis directement avec les instructions Move W,TrisA, etc. Cest plus
compliqu pour les registres D et E.
Les instructions Inc Var et Dec Var activent le fanion Z quand le rsultat est nul.
Les instructions IncSkip,EQ Var et DecSkip.EQ Var conomisent une instruction. Elles ne
modifient pas Z ! IncSkip,NE et DecSkip,EQ nexistent pas.
Les instructions RRC Var et RLC Var font tourner les 8 bits travers le carry.
Enfin, on a compris lintrt des routines dont on peut oublier le contenu, il suffit de savoir ce
quelles font et leur passer un ou plusieurs paramtres. Dans les cas simples, ce paramtre est
un mot de 8 bits dans W. Pour varier un dlai, 8 bits est insuffisant et on a deux routines
diffrentes pour les dlais courts DelWx1ms et les dlais longs DelWx01s.
Ces routines de librairie sont dans un fichier avec lextension .asi. Le fichier Ex877Init1.asi
contient aussi la routine Init qui initialise le Ports A en entre et les ports B, C, D, E en sortie.
Chaque application a des entres-sorties spcifiques, donc une routine Init: spcifique.
A quoi servent ces .Ascii T e x t e la fin des programmes ? A rien, mais ils laissent une
trace dans le fichier hex, que lon peut lire dans le Pickit2.
Vos autres questions info@didel.com
La 2e section va continuer le petit jeu dobservation de leffet de nouvelles instructions sur des
variables et ports et que lon peut visualiser.
La section i inventoriera toutes les instructions et est une annexe sans exercices que lon lit une
premire fois et consulte quand on nest plus sr de sa mmoire.
La 3e section prsente les priphriques internes du 877, indispensables pour beaucoup
dapplications.
La 4e section montre comment on gre les priphriques externes les plus courants avec des
exemples un peu plus corss. Elle donne quelques conseils pour le dveloppement des
programmes.
jdn 100928