Il CONFIG nei PIC18
Lo scopo dei registri CONFIG e della relativa direttiva di
assemblaggio è quello di:
fornire al PIC una base di partenza su cui avviare l'
hardware.
Per cercare di avere ben chiaro il problema, dobbiamo tenere presente che i
progettisti di Microchip hanno reso programmabili dall' Utente quante
più funzioni possibili, comprendendo in esse non solo le gestioni dei vari
moduli (GPIO, USART, MSSP, AD, Timer, ecc), ma anche la struttura di base.
Per fare un esempio semplice, è analogo al fatto di scegliere le gomme più
adatte e il carico degli ammortizzatori prima di partire per una specifica
tappa del rally; queste scelte si devono fare PRIMA della partenza e
sono fondamentali per come si svolgerà la tappa.
Similmente, nei PIC sono programmabili molte funzioni di base che rendono
disponibile un certo hardware all' uso delle successive istruzioni; e queste
scelte (modo di oscillatore, assegnazione di pin ad un modulo piuttosto che ad
un' altro, watchdog, protezione della memoria, set di istruzioni, ecc)
dovranno essere fate PRIMA che il programma sia avviato.
Quindi, un sorgente dovrà forzatamente iniziare, in qualsiasi
programma, con una sezione dedicata alla configurazione del processore.
Attenzione, perchè non si tratta di "istruzioni"
che verranno eseguite, ma di assegnazioni all' hardware di base che
vengono fissate nel processore una volta per tutte all' atto della
programmazione, anche se in alcuni casi potranno essere modificate
successivamente via software.
Queste assegnazioni saranno scritte in opportuni registri non
volatili e saranno conservate fino ad una successiva programmazione
che le modifichi.
Queste assegnazioni non fanno parte della memoria programma e non
saranno "eseguite", ma, al reset (POR) esse imporranno alla
struttura hardware del PIC una determinata configurazione che il
programma potrà sfruttare.
|
Queste assegnazioni saranno fatte in funzione delle necessità del programma che
si vuole eseguire.
Ovviamente, se le scelte sono errate, non si potrà avere il funzionamento
voluto.
Due considerazioni importanti:
-
In primo luogo, più il processore è complesso, ovvero
ricco di funzioni, più la sezione di configurazione sarà importante (e
complessa)
-
I parametri iniziali sono fissati con default, ma questi
possono non essere quelli desiderati per l' applicazione specifica.
Quindi, la
fase di CONFIG iniziale richiede un minimo di attenzione e non va
sottovalutata o trascurata.
Certamente per applicazioni in cui i default sono adeguati, non occorrerà
modificarli e la sezione di configurazione potrà essere ridotta o addirittura
assente.
Questo, però, presume che l' utilizzatore conosca perfettamente quali sono
le funzioni disponibili e quali sono quelle definite dai default. In caso
contrario, come già detto, la mancata assegnazione delle funzioni desiderate
ai vari pin o moduli potrà impedirne l' uso.
Per questa ragione si consiglia vivamente di inserire
sempre e comunque una sezione di CONFIG in testa a qualsiasi sorgente,
anche se non strettamente indispensabile, onde avere un reale controllo
diretto di quanti sarà allocato nella memoria del processore.
Si potranno certo non applicare tutte le opzioni, in
quanto, ad esempio, se il Watchdog non viene usato, non serve definirne un
prescaler; così pure, se si sta effettuando un debug, non verrà attivata
alcuna protezione dell' area di memoria, che sarà magari richiesta solo in
fase di programmazione del prodotto definitivo.
Però, di nuovo, ricordiamo che dalla configurazione
iniziale possono dipendere molti elementi critici, dalla modalità dell'
oscillatore all' assegnazione dei pin ad un modulo piuttosto che al GPIO, ecc.
e l' importanza di questa sezione del sorgente non va sottovalutata.
In particolare, l' Assembler dei PIC prevede una direttiva
specifica, __CONFIG (preceduto da due __) che origina queste assegnazioni.
I PIC18 hanno una struttura molto più complessa dei PIC16 per
quanto riguarda i registri di configurazione, data la maggiore disponibilità
di periferiche, e chi provenga da questi ultimi
si può trovare spiazzato davanti al loro elevato numero.
Ma questo non è un problema reale: il Macro Assembler MPASM fornisce un supporto
esaustivo, che rende l' azione di configurazione molto più semplice di quanto
si possa credere e l' uso di un template adeguato permette di risolvere questa
fase della scrittura del programma in modo molto semplice.
Come effettuare il CONFIG
Sostanzialmente, in fase di programmazione del chip,
occorrerà stabilire i valori da assegnare ad alcuni registri, i registri
CONFIG, che si trovano nella parte più alta della mappa di memoria
del chip e a cui normalmente non si accede durante l' esecuzione del
programma.
Una prima via è quella di utilizzare la direttiva __CONFIG
così come era impiegata nei PIC16. La sua sintassi è :
__CONFIG _nomeregistro, <opzione1> &
<opzione2> & <opzione3> ...& <opzionen>
dove nomeregistro indica il registro
CONFIG su cui si vuole agire.
Questa può essere una sequenza di inizializzazione dei
registri di configurazione per un tipico PIC 18F (registri CONFIG del
PIC18F2450/4450) :
__CONFIG
_CONFIG1H, _OSCS_ON_1H &
_XT_OSC_1H
; External Clock on OSC1 & OSC2
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L &
_PWRT_OFF_2L ; Brown out reset on at 2.0V,
; no power-up timer
__CONFIG _CONFIG2H, _WDT_OFF_2H &
_WDTPS_128_2H
; watchdog off, postscaler count 128
__CONFIG _CONFIG3H,
_CCP2MX_ON_3H
; CCP2 pin Mux enabled. What is this?
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_ON_4L &
_DEBUG_OFF_4L ; Stack under/overflow reset on,
; LVP on, debug off
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L &
_CP2_OFF_5L & _CP3_OFF_5L ; all protection off
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L &
_WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H &
_WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
& _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
|
La direttiva __CONFIG, usata
nel modo ora visto, è perfettamente compatibile con quanto ci si è trovati a
fare sui PIC16, ma non è la via migliore per i i PIC18, in quanto le ultime
versioni di MPASM (dalla 7.0 in poi) consento una impostazione molto più
semplice del problema.
L' uso classico di __CONFIG da origine ad una lunghissima linea di difficile
lettura, oltre alla necessità, nei PIC18, di identificare a quale registro ci
si stia rivolgendo, perchè, come vediamo nell' esempio qui sopra, i registri
di CONFIG sono ben 7, a due bytes.
La nuova implementazione è molto più semplice, in quanto permette di prescindere dal conoscere in quale registro si trova una particolare
funzione: basterà citare l' opzione scelta e MPASM provvederà automaticamente ad associare
la disposizione voluta al registro adeguato.
Ad esempio, la configurazione di cui all' esempio qui sopra, diventerà :
:
CONFIG
OSCS = ON ; enable both oscillator
CONFIG OSC = XT ; XT
oscillator
CONFIG BOR = ON ;
brown out detector on
CONFIG BORV = 20 ; BOR level
2.0 volt
CONFIG PWRT = OFF ; no Power up
time
CONFIG WDT = OFF ; no
watchdog
CONFIG CCP2MX = ON
CONFIG STVR = ON ; Stack
under/overflow reset on
CONFIG LVP = ON ; low
voltage programming enabled
CONFIG DEBUG = OFF ; debug option ofgf
CONFIG CP0 = OFF ; all
protection off
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB =_OFF
CONFIG CPD = OFF
CONFIG WRT0 = OFF
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG_ WRT3 = OFF
CONFIG WRTC = OFF
CONFIG WRTB = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
CONFIG EBTRB = OFF
|
Il
risultato è decisamente più semplice, leggibile ed auto esplicativo.
Le opzioni disponibili sintassi possono essere diverse da processore a
processore, dipendendo, come detto, dalle caratteristiche e dalle periferiche
integrate; come sempre, il foglio dati è il mezzo più efficace per venirne a
conoscenza.
UN TEMPLATE PER IL CONFIG
Nella pratica, la cosa più semplice è quella di utilizzare un form (template
o maquette) iniziale che sarà sempre uguale per ogni progetto e verrà
adeguato alle specifiche necessità del momento.
Il template ideale contiene una guida alle funzioni, in modo tale da
ridurre la necessità di scratabellare il foglio dati, che può essere anche
molto voluminoso (400 pagine o più).
Ad esempio, questa è una
possibile lista delle variazioni della configurazione degli oscillatori
:
; Oscillator Selection:
; OSC = LP LP
; OSC = XT XT
; OSC = HS HS
; OSC = RC RC
; OSC = EC EC-OSC2
; OSC = ECIO EC-OSC2
; OSC = HSPLL HS-PLL
; OSC = RCIO RC-OSC2
; OSCS = ON OFF
Eliminando il ; di commento e le linee o opzioni non desiderate, in
un attimo si definisce la configurazione voluta, senza bisogno di ricorrere ad
una complicata consultazione del foglio dati.
La seguente è una
possibile lista delle variazioni della configurazione per un PIC della
famiglia 18F4321: anche qui, eliminando il ; iniziale di commento per le linee desiderate, in
un attimo si definisce la configurazione voluta, senza bisogno di ricorrere ad
una complicata consultazione del foglio dati (nella lista sono evidenziati in verde
i commenti, in viola gli statements selezionati,
in nero i valori assegnati, similmente a come apparirà la lista stessa
nell' editor di MPASM).
;-----------------------------------------------------------------------------
; CONFIG List
; Togliere il commento dalle linee scelte
;-----------------------------------------------------------------------------
; PORTB A/D Enable bit:
CONFIG PBADEN = DIG ; PORTB<4:0> pins are configured as digital I/O
;CONFIG PBADEN = ANA ; PORTB<4:0> pins are configured
as analog input
;
; CCP2 MUX bit:
CONFIG CCP2MX = RB3 ; CCP2 input/output is multiplexed with RB3
;CONFIG CCP2MX = RC1 ; CCP2 input/output is multiplexed with
RC1
;
; Extended Instruction Set Enable bit:
CONFIG XINST = OFF ; Instruction set extension disabled (Legacy mode)
;CONFIG XINST = ON ; Instruction set extension
enabled
;
; Background Debugger Enable bit:
;CONFIG DEBUG = ON ; Background debugger enabled,
RB6 and RB7 to ICSP
CONFIG DEBUG = OFF ; Background debugger disabled, RB6 and RB7 as GPIO
;
; Single-Supply ICSP Enable bit:
CONFIG LVP = OFF ; Single-Supply ICSP disabled
;CONFIG LVP = ON ; Single-Supply
ICSP enabled
;
; Oscillator Selection bits:
CONFIG OSC = HS ; HS oscillator
;CONFIG OSC = HSPLL ; as above + PLL (Clock Frequency
= 4 x FOSC1)
;CONFIG OSC = LP ; LP Oscillator
;CONFIG OSC = XT ; XT Oscillator
;CONFIG OSC = HS ; HS Oscillator
;CONFIG OSC = RC ; External RC
oscillator, RA7 input, CLKO function on RA6
;CONFIG OSC = RCIO ; External RC oscillator, RA7
input, GPIO on RA6
;CONFIG OSC = EC ; EC oscillator,
RA7 input, CLKO function on RA6
;CONFIG OSC = ECIO ; EC oscillator, RA7 input,
GPIO on RA6
;CONFIG OSC = INTIO2 ; Internal oscillator, GPIO on RA6 and
RA7
;CONFIG OSC = INTIO2PLL ; as above + PLL
;CONFIG OSC = INTIO1 ; Internal oscillator, CLKO function on
RA6, GPIO on RA7
;CONFIG OSC = INTIO1PLL ; as above + PLL
;
; Low-Power Timer1 Oscillator Enable bit:
CONFIG LPT1OSC = OFF
; Timer1 configured for higher power operation
;CONFIG LPT1OSC = ON ; Timer1 configured for low-power
operation
;
; Fail-Safe Clock Monitor Enable bit:
CONFIG FCMEN = OFF
; Fail-Safe Clock Monitor disabled
;CONFIG FCMEN = ON ; Fail-Safe Clock Monitor
enabled
;
; Internal/External Oscillator Switchover bit:
CONFIG IESO = OFF
; Oscillator Switchover mode disabled
;CONFIG IESO = ON ; Oscillator Switchover
mode enabled
; Power-up Timer Enable bit:
CONFIG PWRT = ON
; PWRT enabled
;CONFIG PWRT = OFF ; PWRT disabled
;
; Brown-out Reset Enable bits:
CONFIG BOR = ON
; Brown-out Reset enabled in hardware only (SBOREN is disabled)
;CONFIG BOR = OFF ; Brown-out Reset
disabled
;CONFIG BOR = SOFT ; Brown-out Reset enabled and
controlled by software
;CONFIG BOR = NOSLP ; Brown-out Reset enabled in
hardware only and disabled in Sleep
;
; Brown-out Reset Voltage bits:
;CONFIG BORV = 0 ; Soglia reset 4.5V
CONFIG BORV = 1
; Soglia reset 4.2V
;CONFIG BORV = 2 ; Soglia reset 2.7V
;CONFIG BORV = 3 ; Soglia reset 2.0V
;
; MCLR Pin Enable bit:
;CONFIG MCLRE = OFF ; RE3 input pin enabled; MCLR
disabled
CONFIG MCLRE = ON
; MCLR pin enabled; RE3 input pin disabled
;
; Watchdog Timer Enable bit:
CONFIG WDT = OFF
; WDT disabled (control on SWDTEN bit)
;CONFIG WDT = ON ; WDT enabled
;
; Watchdog Timer Postscale Select bits:
;CONFIG WDTPS = 1 ; 1:1
;CONFIG WDTPS = 2 ; 1:2
;CONFIG WDTPS = 4 ; 1:4
;CONFIG WDTPS = 8 ; 1:8
;CONFIG WDTPS = 16 ; 1:16
;CONFIG WDTPS = 32 ; 1:32
;CONFIG WDTPS = 64 ; 1:64
;CONFIG WDTPS = 128 ; 1:128
;CONFIG WDTPS = 256 ; 1:256
;CONFIG WDTPS = 512 ; 1:512
;CONFIG WDTPS = 1024 ; 1:1024
;CONFIG WDTPS = 2048 ; 1:2048
;CONFIG WDTPS = 4096 ; 1:4096
;CONFIG WDTPS = 8192 ; 1:8192
;CONFIG WDTPS = 16384 ; 1:16384
;CONFIG WDTPS = 32768 ; 1:32768
;
; Stack Full/Underflow Reset Enable bit:
;CONFIG STVREN = OFF ; Stack full/underflow will not cause
Reset
CONFIG STVREN = ON
; Stack full/underflow will cause Reset
;
; Boot Block Size Select bits:
;CONFIG BBSIZ = BB256 ; 256 Word
;CONFIG BBSIZ = BB512 ; 512 Word
;CONFIG BBSIZ = BB1K ;1024 Word
;
; Code Protection bit Block 0 and 1:
;CONFIG CPx = ON ; Block x
code-protected
;CONFIG CPx = OFF ; Block x not
code-protected
CONFIG CP0 = OFF ; code protection block 0 (ON/OFF)
CONFIG CP1 = OFF ; code protection block 1 (ON/OFF)
;
; Boot Block Code Protection bit:
CONFIG CPB = OFF
; code protection bootblock (ON/OFF)
;
; Data EEPROM Code Protection bit:
CONFIG CPD = OFF
; code protection eeprom (ON/OFF)
;
; Write Protection bit Block 0 and 1:
;CONFIG WRTx = ON ; Block x
write-protected
;CONFIG WRTx = OFF ; Block x not write-protected
CONFIG WRT0 = OFF
; Write protect block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Write protect block 1 (ON/OFF)
CONFIG WRTB = OFF ; Write protect bootblock (ON/OFF)
;
; Configuration Register Write Protection bit:
CONFIG WRTC = OFF ; Write protecte configurations (ON/OFF)
;
; Data EEPROM Write Protection bit:
CONFIG WRTD = OFF ; Write protect eeprom (ON/OFF)
;
; Table Read Protection bit Block 0 and 1:
;CONFIG EBTRx = ON ; Block x protected from
table reads in other blocks
;CONFIG EBTRx = OFF ; Block x not protected from table
reads in other blocks
CONFIG EBTR0 = OFF
; Read protect table block 0 (ON/OFF)
CONFIG EBTR1 = OFF
; Read protect table block 1 (ON/OFF)
;
; Boot Block Table Read Protection bit:
;CONFIG EBTRB = ON ; Boot block protected from
table reads in other blocks
CONFIG EBTRB = OFF
; Boot block not protected from table reads in other blocks
|
Cancellando le linee indesiderate, si otterrà facilmente una lista
limitata:
;-----------------------------------------------------------------------------
; CONFIG List
;-----------------------------------------------------------------------------
CONFIG PBADEN = DIG
; PORTB<4:0> pins are configured as digital I/O
CONFIG CCP2MX = RB3
; CCP2 input/output is multiplexed with RB3
CONFIG XINST = OFF
; Instruction set extension disabled (Legacy mode)
CONFIG DEBUG = OFF
; Background debugger disabled, RB6 and RB7 as GPIO
CONFIG LVP = OFF
; Single-Supply ICSP disabled
CONFIG OSC = HS
; HS oscillator
CONFIG LPT1OSC = OFF
; Timer1 configured for higher power operation
CONFIG FCMEN = OFF
; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF
; Oscillator Switchover mode disabled
CONFIG PWRT = ON
; PWRT enabled
CONFIG BOR = ON
; Brown-out Reset enabled in hardware only (SBOREN is disabled)
CONFIG BORV = 1
; Soglia reset 4.2V
CONFIG MCLRE = ON
; MCLR pin enabled; RE3 input pin disabled
CONFIG WDT = OFF
; WDT disabled (control on SWDTEN bit)
CONFIG STVREN = ON
; Stack full/underflow will cause Reset
CONFIG CP0 = OFF
; code protection block 0 (ON/OFF)
CONFIG CP1 = OFF
; code protection block 1 (ON/OFF)
CONFIG CPB = OFF
; code protection bootblock (ON/OFF)
CONFIG CPD = OFF
; code protection eeprom (ON/OFF)
CONFIG WRT0 = OFF
; Write protect block 0 (ON/OFF)
CONFIG WRT1 = OFF
; Write protect block 1 (ON/OFF)
CONFIG WRTB = OFF
; Write protect bootblock (ON/OFF)
CONFIG WRTC = OFF
; Write protecte configurations (ON/OFF)
CONFIG WRTD = OFF
; Write protect eeprom (ON/OFF)
CONFIG EBTR0 = OFF
; Read protect table block 0 (ON/OFF)
CONFIG EBTR1 = OFF
; Read protect table block 1 (ON/OFF)
CONFIG EBTRB = OFF ; Boot block not protected from table reads in other blocks
|
Va notato che :
- teoricamente, non è obbligatorio inizializzare tutti i bit dei
registri di configurazione,
potendo essere adeguato il valore che
assumono di default (ad esempio, nella lista qui sopra non è importante
configurare un prescaler per il Watch Dog se questo è disabilitato).
In ogni caso è da ritenere pratica migliore il
dichiarare sempre esplicitamente come si vuole configurato ogni registro.
Questo non costa nulla in termini di risorse del processore e pochi secondi in termini di tempo per la scrittura del sorgente, ma evita interpretazioni dubbie, assicura dell' esattezza della
configurazione voluta e rende chiaro cosa si voglia ottenere.
Inoltre è opportuno utilizzare simboli e non assoluti, ad esempio
assegnando un valore esadecimale direttamente al registro di
configurazione : questa pratica
barbara e insensata non porta nessunissimo vantaggio in fase di
compilazione, mentre, per contro, rende criptica la lettura del sorgente.
Non è ideale, anche se possibile, fissare i parametri di
configurazione attraverso le utilities del dispositivo programmatore : in
questo modo si rischia di ritrovarsi con una configurazione diversa da
quella voluta.
Invece, la definizione della configurazione nel sorgente, in qualsiasi
buon programma, sovrapassa eventuali default e fornisce le giuste
assegnazioni desiderate.
Inoltre, un tool di sviluppo
integrato come MPLAB IDE utilizza le opzioni indicate nel CONFIG per
predisporre correttamente l' ambiente per il debug e la programmazione.
Dato che aggiungere qualche riga in più al sorgente non costa nulla, nè i
termini battitura, nè in tempo di esecuzione della compilazione, non si vede
alcuna ragione per non utilizzare una forma ragionevolmente chiara di lavoro.
Ovviamente, per la definizione dei vari parametri e delle loro opzioni,
occorrerà consultare il foglio dati del componente usato, anche se, a parte i
chip dotati di funzioni speciali (USB, CAN, ecc), registri e funzioni
basilari sono gli stessi per tutti i PIC di una stessa famiglia.
Vedremo maggiori dettagli su questi argomenti nelle pagine che trattano le
varie funzioni.
|
Nell' area di download è
disponibile un template per il CONFIG dei PIC18
I REGISTRI CONFIG
Diamo per conoscenza una breve panoramica dei registri più comuni nel CONFIG dei
PIC18.
Si tratta di registri a 16 bit che sono identificati da un numero e dall'
indicatore H o L a seconda si tratti del byte basso o alto. Sono posti a
partire da un indirizzo elevato, tipicamente 300000H, a cui si può accedere
solamente usando le istruzioni di lettura/scrittura delle tabelle (table reads
and writes) o in fase di programmazione.
Ad esempio, per i PIC della famiglia 18F4321, i registri CONFIG sono i
seguenti :
Registro |
Indirizzo |
Funzioni |
_CONFIG1H
|
30001H,
|
contiene i bit di
selezione della modalità dell' oscillatore e i due bit di switch tra
clock esterno e interno e di abilitazione del fail safe clock
monitor.
|
_CONFIG2L
|
30002H
|
contiene i bit di
controllo di BOR e PWRT
|
_CONFIG2H
|
30003H
|
contiene le opzioni per il
watchdog
|
_CONFIG3H
|
30005H |
abilita varie opzioni : funzione del pin MCLR, abilitazione dell'
oscillatore low power di TMR1, abilitazione dei convertitori A/D sul
POTB4:0, multiplex di CCP2 |
_CONFIG4L
|
30006H |
abilita le funzioni di debug, il set di istruzioni esteso, le
dimensioni del boot block, la funzione di ICPORT, di LVP e la
richiesta di reset a seguito di un errore di stack |
_CONFIG5L
|
30008H |
contiene i code protection bit CP1:0 |
_CONFIG5H
|
300009H |
contiene i code protection
bit CPD:B |
_CONFIG6L
|
30000AH |
contiene i code protection
bit
WRT1:0 |
_CONFIG6H |
30000BH |
contiene i code protection
bit
WRTD:C
|
_CONFIG7L
|
30000CH
|
contiene i code protection
bit
EBTR1:0 |
_CONFIG7H
|
30000DH
|
contiene il
code protection bit
EBTRB
|
Al di là della scrittura iniziale con il
dispositivo di programmazione hardware, la programmazione software dei
registri CONFIG si effettua allo stesso modo della flash, utilizzando il bit
WR in EECON1 e le istruzioni TBLWT con il puntatore TBLPTR che punta ai
registri di configurazione. Viene scritto un registro per volta.
Per modificare una cella, una istruzione TBLWT può scrivere un 1 o uno 0
nella cella stessa.
Attenzione, perchè anche se è
possibile modificare aree di CONFIG durante l'esecuzione del
programma, questa opzione va valutata in modo molto accurato, in
quanto si tratta di andare a modificare le basi dell' hardware del
processore, con la possibilità di avere risultati inaspettati o
situazioni critiche.
|
I REGISTRI ID
Ai registri CONFIG si accodano i registri di identificazione del
dispositivo
Registro |
Indirizzo |
Funzione |
DEVID1 |
3FFFFEH |
bit meno significativi dell' identificatore del chip e bit della
revisione |
DEVID2 |
3FFFFFH |
bit più significativi dell' identificatore del chip |
Il contenuto di questi due registri è read only
e, fissato dal costruttore, identifica il tipo di chip e la revisione del
silicio.
Come sempre, la stesura di un sorgente ordinato e l' uso intensivo di
label invece di assoluti, facilita grandemente il lavoro del programmatore
quando si arriva alla fase di collaudo del software.
|