Tutorials - PIC peripherals

 

TIMER0

 


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'

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 07/04/13.