« Utiliser les PIC 16F et 18F/Les sous-programmes en assembleur » : différence entre les versions

Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-\n(==={0,3})(?: *)([^\n=]+)(?: *)\1(?: *)\n +\n\1 \2 \1\n)
m Robot : Remplacement de texte automatisé (-(<|</)source([ \t>]) +\1syntaxhighlight\2)
 
Ligne 76 :
== Les choix multiples ==
La programmation de suivant le cas faire... peut se faire de différentes manières. Nous commençons par en présenter une :
<sourcesyntaxhighlight lang="pic16">
CBLOCK 0x00 ; début de la zone variables en ACCESS RAM
w_temp :1 ; Zone de 1 byte
Ligne 105 :
goto suite
....
</syntaxhighlight>
</source>
{{Remarque|contenu=Les [[w:Sous-programme|sous-programme]]s ne sont pas ici de vrais sous-programmes (car appelés avec goto et non avec call, et finissant par goto au lieu de return). D'autre part, cette technique ne traite pas le dépassement de l'index signalé par "; erreur ici". À vous d’être créatifs...}}
 
Ligne 111 :
 
Comme aucune instruction ne permet de lire un [[w:Octet|octet]] en mémoire programme, l’astuce est d’utiliser l’instruction retlw qui permet de retourner une valeur passée en argument. Écrivons donc notre tableau sous forme de retlw (voir plus haut, cela donne :
<sourcesyntaxhighlight lang="pic16">
retlw 0 ; premier élément = 0
retlw 1 ; deuxième élément = 1
...
retlw 225 ; nième élément = 225
</syntaxhighlight>
</source>
Nous pouvons ensuite utiliser '''PCL''' (poids faible du [[w:Compteur_ordinal|compteur programme]]) pour accéder à ce tableau. Si l'index d'accès au tableau est dans une variable "index" :
<sourcesyntaxhighlight lang="pic16">
movf index, w ; index -> W
call tableau
Ligne 128 :
...
retlw 225 ; nième élément = 225
</syntaxhighlight>
</source>
Donc, si on charge 1 dans '''W''' et qu’on effectue un appel « call tableau ». Le programme se branche sur la bonne ligne, le PCL est incrémenté de 1 et le programme exécute donc alors la ligne « retlw 1 ». Si l'origine du tableau est au-delà des {{Unité|8|bits}}, par exemple :
{{Exemple|contenu=
<sourcesyntaxhighlight lang="pic16">
ORG 0x300
tableau
addwf PCL , f ; ajouter w à PCL
retlw 0 ; premier élément = 0
</syntaxhighlight>
</source>
ne pas oublier de positionner PCLATH correctement. Pour l'exemple ci-dessus, cela donne :
<sourcesyntaxhighlight lang="pic16">
movlw 03
movwf PCLATH
</syntaxhighlight>
</source>
}}
 
Ligne 160 :
 
{{Exemple|contenu=
<sourcesyntaxhighlight lang="pic16">
movlw 0x50 ; chargeons une valeur quelconque
movwf mavariable ; et plaçons-la dans la variable « mavariable »
Ligne 169 :
; on dira que FSR POINTE sur mavariable
movf INDF,w ; charger le CONTENU de INDF dans W.
</syntaxhighlight>
</source>
}}
Les puristes peuvent se demander pourquoi ne pas écrire directement
<sourcesyntaxhighlight lang="pic16">
movf FSR,w
</syntaxhighlight>
</source>
au lieu de
<sourcesyntaxhighlight lang="pic16">
movf INDF,w
</syntaxhighlight>
</source>
C'est tout simplement parce que movf FSR,w existe mais a une autre signification, mettre le registre '''FSR''' dans '''w''' ! On a bien besoin d'un pseudo registre pour l'adressage indirect.
 
Ligne 184 :
 
On complète l'adressage indexé de la section précédente.
<sourcesyntaxhighlight lang="pic16">
movf INDF,w ; W<-(FSR)
</syntaxhighlight>
</source>
avec
<sourcesyntaxhighlight lang="pic16">
movwf INDF ;(FSR)<-W
</syntaxhighlight>
</source>
Nous pouvons ainsi utiliser l'adressage indexé dans les deux directions.
 
Ligne 204 :
Le concept précédent a été étendu dans les PIC 18F pour pouvoir accéder à de plus grandes quantités de mémoires. Il y a maintenant 3 registres '''FSR'''. Puisqu’ils doivent permettre d'adresser toute la mémoire ils doivent avoir {{Unité|12|bits}} chacun, d'où la présence de '''FSR2H:FSR2L''', '''FSR1H:FSR1L''' et '''FSR0H:FSR0L'''. Pour compliquer un peu les choses, il y a cinq équivalent à INDF : INDFn, POSTINCn, POSTDECn, PREINCn et PLUSWn. Évidemment cette complexité est faite pour simplifier la construction des compilateurs sur cette architecture.
{{Exemple|contenu=
<sourcesyntaxhighlight lang="pic16">
movlw LOW(mavariable)
movwf FSR0L
Ligne 210 :
movwf FSR0H
movf INDF0,w ; charger le CONTENU de INDF0 dans W.
</syntaxhighlight>
</source>
peut être remplacé par :
<sourcesyntaxhighlight lang="pic16">
lfsr FSR0,mavariable
movf INDF0,w ; charger le CONTENU de INDF0 dans W.
</syntaxhighlight>
</source>
}}
Microchip a donc ajouté une instruction pour faciliter ce mode d'adressage.