Una comparazione
La tabella seguente raccoglie le differenze tra i tre generi di TIMER0
Funzione |
Baseline |
Mid |
Mid enhanced |
Enhanced |
registro di controllo |
OPTION_REG
|
T0CON |
registro interrupt |
- |
INTCON |
registro counter |
TMR0
|
TMR0L/H |
modalità |
8 bit
|
8/16 bit |
prescaler |
shared con WDT |
dedicato |
on/off |
no |
si |
C'è, però, da rilevare un particolare non secondario che riguarda una certa confusione che Microchip
crea spesso con gli acronimi dei registri. Pur avendo funzioni analoghe, i
fogli dati riportano voci differenti e questo può creare situazioni veramente
fastidiose quando si compilano i sorgenti che utilizzano label che sono presenti
in un processore, ma non in un'altro.
Per TIMER0, la situazione è questa:
Funzione |
bit |
Base/Mid |
Mid enhan. |
Enhanced |
registro |
|
OPTION_REG |
T0CON |
bit di controllo |
7 |
- |
TMR0ON |
6 |
- |
T08BIT |
5 |
T0CS |
TMR0CS |
T0CS |
4 |
T0SE |
TMR0SE |
T0SE |
3 |
PSA |
PSA |
2:0 |
PS2:0 |
T0PS2:0 |
Analogamente, per quanto riguarda le label relative ai bit di attivazione e
flag dell' interrupt la situazione è "fluida":
Funzione |
bit |
Baseline |
Mid-range |
Mid enhan. |
Enhanced |
registro |
|
- |
INTCON |
bit di controllo |
5 |
- |
TOIE |
TMR0IE |
2 |
- |
TOIF |
TMR0IF |
Teoricamente, gli .inc relativi ai vari modelli dovrebbero risolvere la
questione: basta che contengano gli alias necessari.
In pratica, verificando alcuni di questi files, troviamo, ad esempio:
P10F322.inc, P16F88.inc, P16F628A.inc, ecc |
;----- OPTION_REG Bits ------------
PSA EQU H'0003'
T0SE EQU H'0004'
T0CS EQU H'0005'
INTEDG EQU H'0006'
NOT_WPUEN EQU H'0007'
PS0 EQU H'0000'
PS1 EQU H'0001'
PS2 EQU H'0002' |
banksel OPTION_REG
; set clock internal & rising edge
bcf OPTION_REG, T0CS
bsf OPTION_REG, T0SE
; set prescaler 1:128
bcf
OPTION_REG, PSA
; prescaler to TIMER0
bsf OPTION_REG, PS2 ;
PS2:0 = 110
bsf OPTION_REG, PS1
bcf OPTION_REG, PS0 |
P16F1826.inc, P16F1933.inc, ecc |
;----- OPTION_REG Bits ------------
PS0 EQU H'0000'
PS1 EQU H'0001'
PS2 EQU H'0002'
PSA EQU H'0003'
TMR0SE EQU H'0004'
TMR0CS EQU H'0005'
INTEDG EQU H'0006'
NOT_WPUEN EQU H'0007'
T0SE EQU H'0004'
T0CS EQU H'0005' |
banksel OPTION_REG
; set clock internal & rising edge
bcf OPTION_REG, TMR0CS
bsf OPTION_REG, TMR0SE
; set prescaler 1:128
bcf
OPTION_REG, PSA
; prescaler to TIMER0
bsf OPTION_REG, PS2 ;
PS2:0 = 110
bsf OPTION_REG, PS1
bcf OPTION_REG, PS0
|
P18Fxxx.inc |
;----- T0CON Bits -----------------
PSA EQU H'0003'
T0SE EQU H'0004'
T0CS EQU H'0005'
T08BIT EQU H'0006'
TMR0ON EQU H'0007'
T0PS0 EQU H'0000'
T0PS1 EQU H'0001'
T0PS2 EQU H'0002' |
; set clock internal & rising edge
bcf T0CON, T0CS
bsf T0CON, T0SE
; set prescaler 1:128
bcf
T0CON, PSA
; prescaler active
bsf T0CON, T0PS2
; T0PS2:0 = 110
bsf T0CON, T0PS1
bcf T0CON, T0PS0
; avvia timer0
bsf T0CON, TMR0ON |
Osserviamo che negli esempi, le istruzioni sono esattamente le stesse (ma va
considerata la necessità di accedere al banco1 nei PIC con registri su più
banchi). Le differenze consistono solo
nella necessità di rinominare PS1:0 <-> T0PS2:0 e T0SE/CS
<->TMR0SE/CS.
Le differenze di label sono poco sensate, dato che non
apportano alcuna informazione in più o in meno, mentre rendono incompatibili i
sorgenti, che, per contenuti e struttura, sarebbero altrimenti del tutto
identici.
Tra l' altro, le label sono uguali in PIC che hanno differente struttura di TIMER0
per quanto riguarda il prescaler, per esempio16F88 e 10F322, mentre sono diverse tra PIC che hanno invece la
stessa struttura del timer, ad esempio.10F322 e 16F1826. E sono diverse, ma solo parzialmente, per gli
Enhanced. Un bel pasticcetto che poteva essere benissimo evitato, dato che
costringe a verificare le label nel passaggio da un micro all' altro.
Le soluzioni possibili sono tre:
- modificare gli .inc aggiungendo gli alias voluti
- aggiungere gli alias alle definizioni del sorgente
- creare un set di macro che aggiusti la situazione
Nel primo caso si potrebbe essere restii a modificare files forniti con l'
ambiente di sviluppo, ma basta farne una copia di sicurezza che sarà possibile
ripristinare in ogni caso. La compilazione avviene comunque correttamente solo
in presenza di questi .inc modificati, rendendo il sorgente poco portabile tra
PC diversi.
Il secondo caso va sempre bene, dato che gli equates sono all' interno del
sorgente. Da notare che nell' .inc dei Mid-range Enhanced questa necessità è
già stata considerata aggiungendo gli equate:
T0SE EQU H'0004'
T0CS EQU H'0005'
il che rende completamente compatibili i sorgenti sia con 10F322 che 16F1826 o 16F88.
La situazione è migliore per i bit relativi all' interrupt, perchè
troviamo inserita una doppia assegnazione che permette direttamente l' uso
alternativo delle due label:
;----- INTCON Bits
--------
T0IF EQU H'0002'
T0IE EQU H'0005'
TMR0IF EQU H'0002'
TMR0IE EQU H'0005' |