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à.
|