Tutorials - PIC18

 

Passare da PIC16 a PIC18

 


Tabelle RETLW

Particolarmente utilizzate nei mid-range, le tabella con RETLW richiedono modifiche se utilizzate anche negli enhanced, modificando l' offset prima di chimare la tabella.

Nel caso di tabelle di subroutines, sarà necessario modificare l' offset nella tabella.

Poichè un computed GOTO causa un salto del PC all' istruzione RETLW, PCL<0> deve essere a zero, dato che negli enhanced il passo delle istruzioni è pari (2 byte per passo).
Questo richiede che l' offset sia moltiplicato per due per raggiungere la corretta locazione nella tabella. 

L' esempio seguente schematizza le modifiche da effettuare ad un computed GOTO del genere.
Si tratta di una tabella a 256 ingressi (offset da 0 a 255).
Occorrerà una locazione temporanea di RAM ed una label all' ingresso della tabella.

      movf OFFSET,w      ; OFFSET= 0x00 - 0xFF
           call table
           ...

    ORG 0x3C0

table movwf taboff        ; salva l' offset della table
      bcf   STATUS,C      ; clear Carry per shift
           rlcf  taboff,F      ; taboff = taboff * 2
           movlw HIGH(tab_st1) ; high byte di table
 
         btfsc STATUS,C      ; test carry
           incf  WREG,W
           movwf PCLATH        ; modifica PCLATH se richiesto
           movlw LOW(tab_st1)  ; low byte di table
           addwf taboff,W      ; somma all' offset
           btfsc STATUS,C      ; test per overflow
           incf PCLATH,F       ; incrementa se necessario
           movwf PCL           ; PCLATH e PCLATU sono scritti in
                                               ; PCH e PCU

tab_st1 
      retlw 0x00          ; primo ingresso, offset=0
           retlw 0x01          ; (256 entry, 256 word/512 byte)
      .....
 

Da notare la   rlcf taboff,F che moltiplica l' offset per 2.
PCLATU, la parte upper del PC, non viene modificata se si sta lavorando in una memoria al di sotto dei 32K.

Le tabelle RETLW sono quindi possibili anche negli enhanced senza particolari problemi, ma va notato che viene tabellato un solo byte di dato in ogni coppia di bytes dell' istruzione e la tabella è limitata a 256 entry.

Utilizzando le istruzioni di TABLE_READ e TABLE_WRITE proprie del set degli enhanced si può meglio sfruttare la memoria, senza limiti per il numero degli elementi della tabella.

 


Azione

E'opportuno sostituire la gestione delle tabelle con la modalità che impiega le nuove istruzioni.
Se si mantiene il vecchio sistema, occorre modificare i puntatori x 2 o x 4.

 


Table Reads

I PIC18 dispongono di un puntatore a 21 bit, quindi in grado d coprire tutta l'estensione della memoria, che può essere caricato con l' indirizzo del dato da leggere.

Questo puntatore comprende tre registri a 8 bit:

  • TBLPTRU
  • TBLPTRH
  • TBLPTRL

Una specifica istruzione, TBLRD*, rende nel registro TABLAT il contenuto della memoria puntata. In sostanza, i registri TBLPTR sono equivalenti agli SFR, ma nell'area flash.

Alcune variazioni dell' istruzione TBLRD* consentono di incrementare o decrementare il puntatore in modo automatico.

Istruzione Effetto
TBLRD* Copia il registro puntato in TABLAT
TBLRD*+ Copia il registro puntato in TABLAT e incrementa TBLPTR dopo la lettura
TBLRD*- Copia il registro puntato in TABLAT e decrementa TBLPTR dopo la lettura
TBLRD+* Incrementa TBLPTR, poi copia il registro puntato in TABLAT

Per utilizzare queste istruzioni bastano tre passi:

  1. caricare in TBLPTR l' indirizzo desiderato (che può essere pari o dispari)
  2. eseguire una istruzione TBLRD*
  3. leggere il risultato nel registro TABLAT

Un esempio:

; copia una stringa di testo su PORTB
;
RdStr   movlw HIGH(string)
        movwf TBLPTRH          ; high byte nel pointer (0x12)
        movlw LOW(string)
        movwf TBLPTRL          ; low byte nel pointer (0x34)
        read  tblrd*+          ; leggi un byte e incrementa il pointer
        movff TABLAT,PORTB     ; metti il byte su PORT B
        tstfsz TABLAT          ; dato = 0 ?
        goto   read            ; no, altro loop
        return                 ; si, fine tabella

      ORG 0x1234

String DW "This is a test.",0x00 ; text string

Da osservare l' istruzione MOVFF - Move File to File, a 32 bit, che raggiunge qualunque posizione di memoria dati in modo del tutto automatico.

 


Azione

E'opportuno sostituire la gestione delle tabelle con la modalità che impiega le nuove istruzioni.

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 05/06/19.