PIC 16F84A

 

Adressage indirect :

Registres FSR et INDF

 

 

 

-> Exemple n°1 : lecture du port B

 

Intéressons-nous au registre PORTB (adresse 0x06 de la mémoire des données).

Supposons que le contenu de ce registre est B'10001111'.

 

movf PORTB, W ; lecture du port B : B'10001111' est chargé dans l'accumulateur

 

Le même résultat est obtenu par adressage indirect, de la manière suivante :

movlw H'06' ; on charge 0x06 dans l'accumulateur

movwf FSR ; on charge 0x06 (= adresse du registre PORTB) dans le registre FSR

movf INDF, W ; lecture du port B : B'10001111' est chargé dans l'accumulateur

 

-> Exemple n°2 : écriture du port B

 

movlw B'00111100' ; B'00111100' est chargé dans l'accumulateur

movwf PORTB ; Ecriture du port B : B'00111100' est chargé dans le port B

 

La même chose par adressage indirect :

movlw H'06' ; on charge 0x06 dans l'accumulateur

movwf FSR ; on charge 0x06 (= adresse du registre PORTB) dans le registre FSR

movlw B'00111100' ; B'00111100' est chargé dans l'accumulateur

movwf INDF ; Ecriture du port B : B'00111100' est chargé dans le port B

 

-> Exemple n°3 : Effacement de la mémoire RAM du PIC 16F84A

 

En pratique, il n'est pas judicieux d'utiliser l'adressage indirect dans les examples 1 et 2.

Voici un example où l'usage de l'adressage indirect est très efficace (pour optimiser la taille du programme) :

Il s'agit d'effacer les 68 octets d'usage général de la mémoire RAM, situés aux adresses 0x0C à 0x4F :

 

movlw 0x0C

movwf FSR ; on charge l'adresse de début (0x0C)

debut

clrf INDF ; effacement du contenu du registre pointé par FSR

incf FSR, f ; on incrémente l'adresse

movlw 0x50 ; adresse de fin + 1 (0x50)

subwf FSR, W

btfss STATUS, Z ; on teste si (FSR) = 0x50

goto debut ; non : on recommence

suite

...

soit seulement 8 instructions (et 477 cycles).

 

N.B.

Par adressage direct, il faut aligner 68 instructions, ce qui est gourmand en mémoire de programme.

clrf 0x0C

clrf 0x0D

...

clrf 0x4F

Par contre, l'exécution demande seulement 68 cycles (optimisation de la vitesse d'exécution).