Sistemi integrati: timer / contatore
UN timerè un tipo di orologio specializzato che viene utilizzato per misurare gli intervalli di tempo. Un timer che conta da zero in su per misurare il tempo trascorso è spesso chiamato astopwatch. È un dispositivo che esegue il conto alla rovescia da un intervallo di tempo specificato e utilizzato per generare un ritardo, ad esempio una clessidra è un timer.
UN counterè un dispositivo che memorizza (e talvolta visualizza) il numero di volte in cui si è verificato un particolare evento o processo, rispetto a un segnale di clock. Viene utilizzato per contare gli eventi che si verificano all'esterno del microcontrollore. In elettronica, i contatori possono essere implementati abbastanza facilmente usando circuiti di tipo registro come un flip-flop.
Differenza tra un timer e un contatore
I punti che differenziano un timer da un contatore sono i seguenti:
Timer | Counter |
---|---|
Il registro viene incrementato ad ogni ciclo macchina. | Il registro viene incrementato considerando la transizione da 1 a 0 in corrispondenza di un pin di ingresso esterno (T0, T1). |
La velocità di conteggio massima è 1/12 della frequenza dell'oscillatore. | La velocità di conteggio massima è 1/24 della frequenza dell'oscillatore. |
Un timer utilizza la frequenza dell'orologio interno e genera un ritardo. | Un contatore utilizza un segnale esterno per contare gli impulsi. |
Timer dell'8051 e relativi registri associati
L'8051 ha due timer, Timer 0 e Timer 1. Possono essere usati come timer o come contatori di eventi. Sia il timer 0 che il timer 1 hanno una larghezza di 16 bit. Poiché l'8051 segue un'architettura a 8 bit, si accede a ogni 16 bit come due registri separati di byte basso e byte alto.
Timer 0 Registro
Si accede al registro a 16 bit del Timer 0 come byte alto e basso. Il registro di byte basso è chiamato TL0 (Timer 0 byte basso) e il registro di byte alto è chiamato TH0 (Timer 0 byte alto). È possibile accedere a questi registri come qualsiasi altro registro. Ad esempio, l'istruzioneMOV TL0, #4H sposta il valore nel byte basso del Timer # 0.
Timer 1 Registro
Si accede al registro a 16 bit del Timer 1 come byte alto e basso. Il registro a byte basso è chiamato TL1 (Timer 1 byte basso) e il registro a byte alto è chiamato TH1 (Timer 1 byte alto). È possibile accedere a questi registri come qualsiasi altro registro. Ad esempio, l'istruzioneMOV TL1, #4H sposta il valore nel byte basso del timer 1.
TMOD (modalità timer) Registrati
Sia il timer 0 che il timer 1 utilizzano lo stesso registro per impostare le varie modalità di funzionamento del timer. È un registro a 8 bit in cui i 4 bit inferiori sono messi da parte per il Timer 0 e i quattro bit superiori per i Timer. In ogni caso, i 2 bit inferiori vengono utilizzati per impostare in anticipo la modalità timer e i 2 bit superiori per specificare la posizione.
Gate - Quando è impostato, il timer funziona solo quando INT (0,1) è alto.
C/T - Bit di selezione contatore / temporizzatore.
M1 - Modalità bit 1.
M0 - Modalità bit 0.
CANCELLO
Ogni timer ha un mezzo per avviare e arrestare. Alcuni timer lo fanno tramite software, altri hardware e altri hanno controlli sia software che hardware. I timer 8051 hanno controlli sia software che hardware. L'avvio e l'arresto di un timer sono controllati dal software utilizzando l'istruzioneSETB TR1 e CLR TR1 per il timer 1 e SETB TR0 e CLR TR0 per timer 0.
L'istruzione SETB viene utilizzata per avviarla e viene arrestata dall'istruzione CLR. Queste istruzioni avviano e arrestano i timer finché GATE = 0 nel registro TMOD. I timer possono essere avviati e arrestati da una sorgente esterna impostando GATE = 1 nel registro TMOD.
C / T (OROLOGIO / TIMER)
Questo bit nel registro TMOD viene utilizzato per decidere se un timer viene utilizzato come file delay generator o un event manager. Se C / T = 0, viene utilizzato come timer per la generazione del ritardo del timer. La sorgente di clock per creare il ritardo temporale è la frequenza del cristallo dell'8051. Se C / T = 0, la frequenza del cristallo collegata all'8051 decide anche la velocità con cui il timer dell'8051 scatta a intervalli regolari.
La frequenza del timer è sempre 1/12 della frequenza del cristallo collegato all'8051. Sebbene vari sistemi basati sull'8051 abbiano una frequenza XTAL da 10 MHz a 40 MHz, normalmente lavoriamo con la frequenza XTAL di 11.0592 MHz. Questo perché il baud rate per la comunicazione seriale dell'8051.XTAL = 11.0592 consente al sistema 8051 di comunicare con il PC senza errori.
M1 / M2
M1 | M2 | Modalità |
---|---|---|
0 | 0 | Modalità timer a 13 bit. |
0 | 1 | Modalità timer a 16 bit. |
1 | 0 | Modalità di ricarica automatica a 8 bit. |
1 | 1 | Modalità versato. |
Diverse modalità di timer
Modalità 0 (modalità timer a 13 bit)
Sia il timer 1 che il timer 0 in modalità 0 funzionano come contatori a 8 bit (con un prescaler di divisione per 32). Il registro del timer è configurato come un registro a 13 bit composto da tutti gli 8 bit di TH1 e dai 5 bit inferiori di TL1. I 3 bit superiori di TL1 sono indeterminati e devono essere ignorati. L'impostazione del flag di esecuzione (TR1) non cancella il registro. Il flag di interruzione del timer TF1 viene impostato quando il conteggio passa da tutti gli 1 a tutti gli 0. Il funzionamento della modalità 0 è lo stesso per il timer 0 come per il timer 1.
Modalità 1 (modalità timer a 16 bit)
La modalità timer "1" è un timer a 16 bit ed è una modalità comunemente utilizzata. Funziona allo stesso modo della modalità a 13 bit, tranne per il fatto che vengono utilizzati tutti i 16 bit. TLx viene incrementato da 0 a un massimo di 255. Una volta raggiunto il valore 255, TLx si reimposta a 0 e quindi THx viene incrementato di 1. Essendo un timer completo a 16 bit, il timer può contenere fino a 65536 valori distinti e tornerà a 0 dopo 65.536 cicli macchina.
Modalità 2 (ricarica automatica a 8 bit)
Entrambi i registri del timer sono configurati come contatori a 8 bit (TL1 e TL0) con ricaricamento automatico. Overflow da TL1 (TL0) imposta TF1 (TF0) e ricarica TL1 (TL0) con il contenuto di Th1 (TH0), preimpostato dal software. La ricarica lascia TH1 (TH0) invariato.
Il vantaggio della modalità di ricarica automatica è che puoi fare in modo che il timer contenga sempre un valore compreso tra 200 e 255. Se utilizzi la modalità 0 o 1, dovresti controllare il codice per vedere l'overflow e, in tal caso, riportare il timer a 200. In questo caso preziose istruzioni controllano il valore e / o si ricaricano. In modalità 2, il microcontrollore si occupa di questo. Dopo aver configurato un timer in modalità 2, non devi preoccuparti di controllare se il timer è andato in overflow, né devi preoccuparti di reimpostare il valore perché l'hardware del microcontrollore farà tutto per te. La modalità di ricaricamento automatico viene utilizzata per stabilire una velocità di trasmissione comune.
Modalità 3 (modalità timer parziale)
La modalità timer "3" è nota come split-timer mode. Quando il timer 0 è impostato in modalità 3, diventano due timer separati a 8 bit. Il timer 0 è TL0 e il timer 1 è TH0. Entrambi i timer contano da 0 a 255 e, in caso di overflow, vengono ripristinati a 0. Tutti i bit che sono del Timer 1 saranno ora legati a TH0.
Quando il Timer 0 è in modalità split, il Timer 1 reale (cioè TH1 e TL1) può essere impostato nelle modalità 0, 1 o 2, ma non può essere avviato / arrestato poiché i bit che lo fanno sono ora collegati a TH0. Il timer reale 1 verrà incrementato ad ogni ciclo macchina.
Inizializzazione di un timer
Decidi la modalità timer. Considera un timer a 16 bit che funziona continuamente ed è indipendente da qualsiasi pin esterno.
Inizializza TMOD SFR. Usa i 4 bit più bassi di TMOD e considera il Timer 0. Mantieni i due bit, GATE 0 e C / T 0, come 0, poiché vogliamo che il timer sia indipendente dai pin esterni. Poiché la modalità a 16 bit è la modalità timer 1, cancellare T0M1 e impostare T0M0. In effetti, l'unico bit da attivare è il bit 0 di TMOD. Ora esegui la seguente istruzione:
MOV TMOD,#01h
Ora, il timer 0 è in modalità timer a 16 bit, ma il timer non è in esecuzione. Per avviare il timer in modalità di esecuzione, impostare il bit TR0 eseguendo la seguente istruzione:
SETB TR0
Ora, il timer 0 inizierà immediatamente il conteggio, incrementato una volta ad ogni ciclo della macchina.
Leggere un timer
Un timer a 16 bit può essere letto in due modi. O leggi il valore effettivo del timer come un numero a 16 bit o rilevi quando il timer è in overflow.
Rilevamento overflow del timer
Quando un timer supera il valore più alto a 0, il microcontrollore imposta automaticamente il bit TFx nel registro TCON. Quindi, invece di controllare il valore esatto del timer, è possibile controllare il bit TFx. Se TF0 è impostato, il timer 0 è andato in overflow; se TF1 è impostato, il timer 1 è andato in overflow.