Tutorials - PIC

 

 

Il Program Counter


Il Program Counter nei PIC12/16F

Nei PIC12F/16F il Program Counter impegna 13 bit (ovvero può indirizzare memoria programma da 0 a 8 k) ed è costituito da due registri:

  • PCL, che contiene i bit da 0 a 7. Questo registro è mappato in memoria come gli altri SFR ed è accessibile direttamente in lettura e scrittura
  • PCH, che contiene i bit da 8 a 12. Questo registro non è accessibile direttamente e può essere  scritto solo attraverso un meccanismo che coinvolge il registro PCLATH.

La figura qui sopra  schematizza due situazioni per il caricamento del PC. 
L'esempio superiore mostra come il PC viene caricato su una scrittura PCL (PCLATH <4:0> → PCH), ad esempio, a seguito di una normale successione di istruzioni. 
Sotto, il PC è caricato durante un'istruzione di chiamata o di salto (PCLATH <4:3> → PCH).

Nel caso di istruzioni che non attivino salti o simili, il PC viene semplicemente aggiornato aumentandolo di una unità.
Nel caso di istruzioni di branch, l' apporto dell' istruzione all' indirizzo di destinazione è limitato a 8 bit, il che permette di spaziare in un raggio massimo determinato da questo limite.
Il PCLATH contribuisce con gli altri 5 bit necessari a completare l' indirizzo a 13 bit.
Questo richiede che se si vuole superare il limite degli 8 bit codificati nell' istruzione occorre manipolare il PCLATH.

D' altronde, con 13 bit di indirizzo è possibile affrontare un blocco memoria programma continuo da 8, ma, le istruzioni CALL e GOTO, che sono codificate su un numero maggiore di bit, possono fornire solo 11 bit all' indirizzo di destinazione. E con 11 bit è possibile un accesso a pagine ampie solo 2K.

Ed in effetti la memoria programma nei PIC12/16 è divisa proprio in pagine da 2K.

Ad esempio, in un PIC16F876/7 la mappa di memoria è la seguente:

Pagina Indirizzo (hex)
0 0005h-07FFh
1 0800h-0FFFh
2 1000h-17FFh
3 1800h-1FFFh


Per l' indirizzamento all' interno della pagina sono sufficienti gli 11 bit dell' istruzione, ovvero, se l' istruzione di GOTO è nella pagina 0 e la sua destinazione è sempre nella stessa pagina, l' indirizzo fornito dall' istruzione stessa è adeguato. 

Va notato che al Reset il contenuto di  PCLATH <4:3> è 00, ovvero viene puntata per default la pagina 0.
E questo consente di operare in questa pagina senza preoccuparsi del PCLATH stesso.

Però va considerato che, quando si esegue CALL o GOTO, il PC necessita di tutti e 13 i bit : i due bit più significativi dell'indirizzo sono forniti da PCLATH <4:3>.  
Questi bit devono essere settati in modo tale da condurre il Program Counter nella pagina voluta.
Quindi, quando si introduce un'istruzione di CALL o GOTO, l'utente deve garantire che i bit di selezionare pagina siano programmati in modo che venga indirizzata la pagina desiderata.
infatti se istruzione di GOTO è nella pagina 0 e la sua destinazione è  nella pagina 3, l' indirizzo fornito dall' istruzione stessa non è sufficiente a determinare la giusta destinazione.

Per l' esempio precedente:

Pagina PCLATH
4 3
0 0 0
1 0 1
2 1 0
3 1 1

Per capire meglio quanto ora detto, vediamo un esempio: si vuole chiamare una subroutine che è posta in pagina 1, partendo dal programma che è svolto in pagina 0.

   ORG 0x500

   BCF PCLATH,4
   BSF PCLATH,3       ;Select page 1 (800h-FFFh)

   CALL SUB1_P1       ;Call subroutine in page 1 (800h-FFFh)
   

   next_instruction

:   ORG 0x900         ;page 1 (800h-FFFh)

SUB1_P1               ;called subroutine
    .
    .
    RETURN            ;return to Call subroutine in page 0

Se non avessimo modificato il PCLATH in modo da puntare alla pagina voluta, il valore 00 contenuto nei bit 4:3 avrebbe condotto il PC non a 0900h, ma a 0100h.

Da notare che, se viene eseguito un ritorno da un'istruzione di chiamata (RETURN, RETLW) o ritorno da interrupt (RETFIE), l'intero PC a 13 bit è recuperato dallo stack 

Al CALL il PC corrente, contenete l' indirizzo di next_instruction   viene salvato nello stack e quindi con il valore di PCLATH<4:3> relativo a questa  next_instruction
Al RETURN il contenuto del PC è sostituito per intero dal valore prelevato dallo stack per rientrare proprio a next_instruction in pagina 0.
Ovvero, per il ritorno non è richiesta una la manipolazione dei PCLATH <4:3>.


Da osservare che, trattandosi di una architerrtura Harvard, la larghezza del bus dati, che è a 8 bit è diversa da quello del bus istruzioni (a 12,14,16 bit) e dello stack.

Quindi non c'è niente di strano, ad esempio, nel fatto che la larghezza di uno strato dello stack sia di 13 bit e che questi bit siano trattati dal processore in una unica azione.

Il definire "byte" o "word" questi gruppi di più di 8 o meno di 16 bit non è perfettamente coretto, ma è pratica corrente, giusto per indicare che si tratta di array ben definiti e trattati dal processore come unità logiche.


La mancanza di meccanismi interni al processore o al set di istruzioni per gestire il problema dei passaggi interpagina costringe alla creazione di algoritmi, generalmente sotto forma di macro, per sopperire a questa necessità.


    

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 12/01/13 .