ELEMANIA
PIC16F690 - Istruzioni di controllo
Salto incondizionato: GOTO

L'istruzione GOTO salta all'indirizzo in memoria di programma (EEPROM) specificato. L'indirizzo viene normalmente indicato per mezzo di un'etichetta, come nell'esempio che segue;

loop
            MOVLW 0x30  ;caricamento di W con il valore 0x30
            GOTO loop     ;salto alla istruzione dopo "loop"

Un caso usato frequentemente con l'istruzione GOTO è il seguente:

            GOTO $     ; salta all'istruzione stessa (blocca l'esecuzione del programma)

Il simbolo del dollaro $ indica per convenzione l'indirizzo dell'istruzione stessa: perciò in questo modo il programma si blocca in un ciclo infinito. Questa istruzione viene spesso utilizzata al termine dei programmi per bloccare il funzionamento del PIC (il quale non dispone di un'istruzione di HALT, come lo Z80).

E' anche possibile scrivere:

            GOTO $+2     ; salta a due istruzione dopo

Usando il simbolo del $ un ciclo infinito può essere scritto nel seguente modo:

             MOVLW 0x30 
             GOTO $-1     ; salta indietro alla precedente istruzione

NOTA:

Il PIC16F690 possiede 4k = 4096 locazioni di memoria di programma a 14 bit. Per indirizzare l'intera memoria occorrerebbero 12 bit (212 = 4096). In realtà il Program Counter interno del PIC ha 13 bit e dunque è potenzialmente in grado di indirizzare fino a 8192 locazioni di memoria (213 = 8192).

Tuttavia, essendo lo spazio occupato da ciascuna istruzione limitato a 14 bit (che devono contenere sia il codice operativo che l'operando) in realtà l'istruzione GOTO può usare solo 11 bit per indirizzare la memoria:

dove 101 è il codice operativo di GOTO e kkk kkkk kkkk sono gli 11 bit riservati all'indirizzo.

In conclusione con il campo operando della GOTO non è possibile indirizzare l'intera memoria del PIC. Per ottenere questo risultato il Program Counter viene caricato con gli 11 bit forniti dalla GOTO (in figura OPCODE<10:0>) e con 2 bit aggiuntivi forniti dal registro PCLATH (in figura PCLATH<4:3>, di cui il PIC16F690 ne utilizza solo uno). In questo modo si riescono a ottenere fino a 13 bit di indirizzo in memoria:

Per fortuna la complessità di questi calcoli viene risparmiata al programmatore, il quale può indicare l'indirizzo di destinazione della GOTO utilizzando un'etichetta e lasciare all'assembler il compito di gestire l'indirizzo fisico in memoria.

 

Salto condizionati: BTFSC, BTFSS, DECFSZ e INCFSZ

Il PIC dispone di quattro istruzioni di salto condizionato:

Anche se i nomi di queste istruzioni possono apparire complicati, il loro funzionamento è estremamente semplice. In linea di massima si comportano tutte nello stesso modo: se la condizione di salto è falsa si esegue l'istruzione successiva; se invece la condizione di salto è vera, viene saltata l'istruzione immediatamente successiva ed eseguita quella ancora dopo. La figura spiega meglio il concetto:

In questo esempio è stata scelta BTFSS, ma le considerazioni svolte valgono per tutte le istruzioni di salto condizionato. Se la condizione di salto (specifica per ognuna delle istruzioni) è falsa, allora si prosegue normalmente con l'esecuzione del programma, cioè eseguendo istruzione 1, poi istruzione 2 e così via come mostrato nella figura.

Se la condizione di salto è vera allora non viene eseguita istruzione 1 ma si continua con l'esecuzione del programma da istruzione 2 in poi. Molto spesso istruzione 1 è un salto incondizionato (GOTO): in questo modo è possibile redirigere l'esecuzione del programma ad un altro punto:

Loop     

     ....  ; istruzioni del ciclo

     BTFSS STATUS, 2
     GOTO Loop

     ....  ; l'esecuzione prosegue fuori dal ciclo

Nell'esempio precedente viene testato il bit 2 del registro di stato. Finché questo bit non diventa zero, il ciclo viene ripetuto. Il bit 2 del registro di stato è il bit Z, che vale '1' quando il risultato dell'ultima operazione eseguita è zero:

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
IRP RP1 RP0 TO PD Z DC C

In questo modo è possibile programmare un ciclo che termina quando l'ultima operazione eseguita fornisce come risultato zero.

Un altro esempio, che fa uso dell'istruzione INCFSZ, è il seguente:

        BANKSEL TMP    ; seleziono il banco di un registro precedentemente definito TMP
        MOVLW 0xFF     ;carico W con 0xFF (255 in decimale)
        MOVWF TMP     ;scrivo W nel registro TMP

loop
        ....                  ; istruzioni del ciclo

        DECFSZ TMP,F  ;decremento il registro TMP e controllo se vale zero
        GOTO loop        ;non è zero, vai a "loop"
        CLRW               ;se è zero, resetta W

In questo caso il ciclo viene ripetuto 256 volte, finché il registro TMP non si azzera.

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it