mercredi 27 juillet 2016

Silvercard, le jeu d'instructions du PIC16F876

Le PIC16F876, caché au cœur d’une Silvercard, ne comporte que 35 instructions, que nous allons voir.

Ces instructions, pour beaucoup d’entre elles, sont des opérations mettant en jeu l’accumulateur (registre W) et un registre f en RAM. Dans les exemples ci-dessous, je prendrai comme adresse 0xAA pour illustrer par l’exemple ce qu’il faut écrire pour manipuler un registre en RAM (registre à l’adresse 0xAA donc) et 0xBB pour illustrer par l’exemple ce qu’il faut écrire lorsqu’on manipule des nombres littéraux. Evidemment, en programmation réelle, il faudra utiliser les bons registres/littéraux.
Les instructions sont les suivantes :
ADDWF 0xAA, F ; ajoute W et le registre 0xAA, met le résultat en 0xAA
ADDWF 0xAA,W ; ajoute W et le registre 0xAA, met le résultat en W
ANDWF 0xAA, F ; ET logique entre W et le registre 0xAA, met le résultat en 0xAA
ANDWF 0xAA,W ; ET logique entre W et le registre 0xAA, met le résultat en W
CLRF 0xAA ; met les 8 bits du registre à 0
CLRW ; met les 8 bits de W à 0
COMF 0xAA, F ; complément à 2 du registre 0xAA, met le résultat en 0xAA
COMF 0xAA,W ; complément à 2 du registre 0xAA, met le résultat en W
DECF 0xAA, F ; décrémente le registre 0xAA, met le résultat en 0xAA
DECF 0xAA,W ; décrémente le registre 0xAA, met le résultat en W
DECFSZ 0xAA, F ; décrémente le registre 0xAA, met le résultat en 0xAA et saute l’instruction suivante si ce résultat vaut 0
DECFSZ 0xAA,W ; décrémente le registre 0xAA, met le résultat en W et saute l’instruction suivante si ce résultat vaut 0
INCF 0xAA, F ; incrémente le registre 0xAA, met le résultat en 0xAA
INCF 0xAA,W ; incrémente le registre 0xAA, met le résultat en W
INCFSZ 0xAA, F ; incrémente le registre 0xAA, met le résultat en 0xAA et saute l’instruction suivante si ce résultat vaut 0
INCFSZ 0xAA,W ; incrémente le registre 0xAA, met le résultat en W et saute l’instruction suivante si ce résultat vaut 0
IORWF 0xAA, F ; OU logique entre W et le registre 0xAA, met le résultat en 0xAA
IORWF 0xAA,W ; OU logique entre W et le registre 0xAA, met le résultat en W
MOVF 0xAA, F ; copie le contenu du registre 0xAA vers lui-même. Permet de tester si ce contenu est égal à 0
MOVF 0xAA,W ; copie le contenu du registre 0xAA vers W
NOP ; pas d’opération
RLF 0xAA, F ; décale le contenu du registre 0xAA d’un bit vers la gauche (multiplication par 2), le bit sortant va dans le carry, et le bit du carry rentre dans le registre comme bit de poids faible. Le résultat de cette opération est mis dans le registre 0xAA
RLF 0xAA,W ; décale le contenu du registre 0xAA d’un bit vers la gauche (multiplication par 2), le bit sortant va dans le carry, et le bit du carry rentre dans le registre comme bit de poids faible. Le résultat de cette opération est mis dans le registre W (le registre 0xAA garde donc sa valeur initiale)
RRF 0xAA, F ; décale le contenu du registre 0xAA d’un bit vers la droite (division par 2), le bit sortant va dans le carry, et le bit du carry rentre dans le registre comme bit de poids faible. Le résultat de cette opération est mis dans le registre 0xAA
RRF 0xAA,W ; décale le contenu du registre 0xAA d’un bit vers la droite (multiplication par 2), le bit sortant va dans le carry, et le bit du carry rentre dans le registre comme bit de poids faible. Le résultat de cette opération est mis dans le registre W (le registre 0xAA garde donc sa valeur initiale)
SUBWF 0xAA, F ; Soustrait le contenu du registre W du contenu du registre 0xAA, met le résultat en 0xAA
SUBWF 0xAA,W ; Soustrait le contenu du registre W du contenu du registre 0xAA, met le résultat en W
SWAPF 0xAA, F ; intervertit les 4 bits de poids fort et les 4 bits de poids faible du registre 0xAA, met le résultat en 0xAA
SWAPF 0xAA,W ; intervertit les 4 bits de poids fort et les 4 bits de poids faible du registre 0xAA, met le résultat en W
XORWF 0xAA, F ; OU exclusif logique entre W et le registre 0xAA, met le résultat en 0xAA
XORWF 0xAA,W ; OU exclusif logique entre W et le registre 0xAA, met le résultat en W
BCF 0xAA,3 ; met à 0 le bit 3 du registre 0xAA
BSF 0xAA,3 ; met à 1 le bit 3 du registre 0xAA
BTFSC 0xAA,3 ; teste le bit 3 du registre 0xAA. S’il est à 0, l’instruction suivante n’est pas exécutée
BTFSS 0xAA,3 ; teste le bit 3 du registre 0xAA. S’il est à 1, l’instruction suivante n’est pas exécutée
ADDLW 0xBB ; ajoute 0xBB à W et met le résultat dans W
ANDLW 0xBB ; ET logique entre W et 0xBB, met le résultat dans W
CALL adresse ; appel à une sous-routine
CLRWDT ; Met à 0 le watchdog timer
GOTO adresse ; aller à l’adresse
IORLW 0xBB ; OU logique entre W et 0xBB, met le résultat dans W
MOVLW 0xBB ; met la valeur 0xBB dans W
RETFIE ; retour d’un programme d’interruption
RETLW 0xBB ; retour d’une sous-routine en mettant au passage la valeur 0xBB dans W
RETURN ; retour d’une sous-routine
SLEEP ; mise en sommeil du micro-contrôleur
SUBLW 0xBB ; Soustrait la valeur 0xBB à W et met le résultat dans W
XORLW 0xBB ; Ou exclusif logique entre la valeur 0xBB et W, le résultat est mis dans W
 
Le tableau ci-dessus montre comment l’instruction sur 14 bits est codée et surtout quels sont les bits Z et C qui sont affectés par l’opération.
Publié par Alan Cartman le 27 juillet 2016

Aucun commentaire: