«

»

Instructions PIC16 (Enhanced Mid-Range)

Les instructions propres à la famille 8-bit PIC® Microcontrollers /  Enhanced Mid-Range sont décrites dans le Tableau 1 dans lequel il est indiqué, lorsque cela est applicable, l’équivalent avec les instructions de la famille 8-bit PIC® Microcontrollers / Mid-range ainsi que la description et des notes relatives à cette instruction.

Cet article s’adresse à ceux qui souhaitent migrer vers cette famille car elle apporte beaucoup d’améliorations en terme de souplesse et de performance comme :

  • Une optimisation du code facilitant tout compilateur C et donc un humain qui écrit en assembleur.
  • Une sauvegarde automatique des registres fondamentaux lors d’une interruption matérielle et leur  restauration tout aussi automatique à l’exécution de l’instruction RETFIE. De plus, 16 niveaux sont autorisés dans la pile d’appel de sous-routines (au lieu de 8 pour la famille Mid-Range) associés à une détection Overflow et Underflow.
  • Une gestion « linéaire » lors de la recopie de données au moyen des 2 registres FSR0 et FSR1 (File Select Registers).

 

Notice

On regrettera simplement l’absence d’une instruction de comparaison sans affecter le registre W qui oblige à une gymnastique d’écriture du code comme décrite dans l’article Opérations arithmétiques des PIC16.

 

Tableau 1– Liste des instructions propres

 

ADDWFC f,d Add with Carry W and f 11 1101 dfff ffff
Description : Addition avec le bit de retenue ; (W) + (f) + (C) -> destination
Équivalent avec les instructions PIC16 / Mid-Range :
.   ; Addition sur 16 bits R_TEMP += C_VALUE (Enhanced Mid-Range)
.   movlw   C_VALUE_LSB
.   addwf   R_TEMP_LSB   ; R_TEMP_LSB += C_VALUE_LSB
.   movlw   C_VALUE_MSB
.   addwfc  R_TEMP_MSB   ; R_TEMP_MSB += C_VALUE_MSB avec report Carry
.
.   ; Addition sur 16 bits R_TEMP += C_VALUE (Mid-Range)
.   movlw   C_VALUE_LSB
.   addwf   R_TEMP_LSB   ; R_TEMP_LSB += C_VALUE_LSB
.   skpnc
.   incf    R_TEMP_MSB   ; Report de la retenue
.   movlw   C_VALUE_MSB
.   addwf   R_TEMP_MSB   ; R_TEMP_MSB += C_VALUE_MSB
Notes :
– Le codage [11 1101 dfff ffff] occupe la place laissée libre de l’instruction SUBLW de la famille Mid-Range  [11 110x dfff ffff] avec x = 1.
– Permet d’implémenter une arithmétique 16 bits et plus (report de la retenue) avec un gain en terme de souplesse et de performance.
ASRF f,d Arithmetic Right Shift 11 0111 dfff ffff
Description : Décalage à droite d’une position avec le bit source<7> inchangé et le bit source<0> -> (C)
Équivalent avec les instructions PIC16 / Mid-Range :
.        clrc                     ; A priori bit R_TEMP_1<7> à 0
.        btfsc   R_TEMP_1,7
.        setc                     ; Bit R_TEMP_1<7> à 1
.        rrf     R_TEMP_1         ; Décalage avec Carry = R_TEMP_1<7>
Notes :
– Le codage [11 0111 dfff ffff] occupe la place laissée libre de l’instruction RETLW dee la famille Mid-Range  [11 01xx kkkk kkkk] avec xx = 11.
– Permet d’implémenter une arithmétique 16 bits et plus (division par 2 de nombres signés) avec un gain en terme de souplesse et de performance.
LSLF f,d Logical Left Shift 11 0101 dfff ffff
Description : Décalage à gauche d’une position avec le bit source<7> -> (C) et 0 -> bit source<0>
Équivalent avec les instructions PIC16 / Mid-Range :
.        clrc                     ; Raz carry
.        rlf     R_TEMP_1         ; Décalage avec Carry
Notes :
– Le codage [11 0101 dfff ffff] occupe la place laissée libre de l’instruction RETLW de la famille Mid-Range [11 01xx kkkk kkkk] avec xx = 01.
– Permet d’implémenter une arithmétique 16 bits et plus (multiplication par 2 de nombres signés) avec un gain en terme de souplesse et de performance.
LSRF f,d Logical Right Shift 11 0110 dfff ffff
Description : Décalage à droite d’une position avec le bit source<0> -> (C) et 0 -> bit source<7>
Équivalent avec les instructions PIC16 / Mid-Range :
.        clrc                     ; Raz carry
.        rrf     R_TEMP_1         ; Décalage avec Carry
Notes :
– Le codage [11 0110 dfff ffff] occupe la place laissée libre de l’instruction RETLW de la famille Mid-Range [11 01xx kkkk kkkk] avec xx = 10.
– Permet d’implémenter une arithmétique 16 bits et plus (division par 2 de nombres non signés) avec un gain en terme de souplesse et de performance.
SUBWFB f,d Subtract with Borrow W from f 11 1011 dfff ffff
Description : Soustraction avec le bit de retenue ; (f) – (W) – (C) -> destination
Équivalent avec les instructions PIC16 / Mid-Range :
.   ; Soustraction sur 16 bits R_TEMP -= C_VALUE (Enhanced Mid-Range)
.   movlw   C_VALUE_LSB
.   subwf   R_TEMP_LSB   ; R_TEMP_LSB -= C_VALUE_LSB
.   movlw   C_VALUE_MSB
.   subwfb  R_TEMP_MSB   ; R_TEMP_MSB -= C_VALUE_MSB avec report Carry
.
.   ; Soustraction sur 16 bits R_TEMP -= C_VALUE (Mid-Range)
.   movlw   C_VALUE_LSB
.   subwf   R_TEMP_LSB   ; R_TEMP_LSB -= C_VALUE_LSB
.   skpc
.   decf    R_TEMP_MSB   ; Report de la retenue
.   movlw   C_VALUE_MSB
.   subwf   R_TEMP_MSB   ; R_TEMP_MSB -= C_VALUE_MSB
Notes :
– Le codage [11 1011 dfff ffff] n’est pas utilisé dans la famille Mid-Range.
– Permet d’implémenter une arithmétique 16 bits et plus (report de la retenue) avec un gain en terme de souplesse et de performance.