PERIFERICHE DI TIMING
Periferiche di timing I sistemi digitali sono caratterizzati dalla presenza di un elaboratore, il processore, attorno a cui si distribuiscono altri dispositivi quali memorie e periferiche. Le periferiche rappresentano una serie di componenti collegati al processore che adempiono a compiti precisi e specifici in modo ottimale. Fra le periferiche di maggior interesse spiccano quelle di “timing”, che possono presentarsi sia come dispositivi “stand alone” (“off-the-shelf”), sia come dispositivi embedded, integrate su silicio assieme al processore (”on-chip”). Fra le periferiche di timing si analizzeranno: - timers - contatori - altri timer (interval timers, cascaded counters, timer con prescaler, watchdog timers).
Timers Sono dispositivi che misurano lo scorrere del tempo o intervalli di tempo. Possono essere utilizzati per generare eventi ad intervalli di tempo specifici o per determinare l’intervallo di tempo che intercorre fra due eventi esterni, contando gli impulsi di un segnale di clock, avente periodo noto, in ingresso. Esempio di timer elementare realizzato da un contatore a 16 bit di tipo ‘up’. Il contatore quindi viene incrementato ad ogni impulso di clock (Clk). Cnt rappresenta il numero di impulsi di Clk contati dall’ultimo reset. Top indica il raggiungimento del massimo valore del contatore (va a 1 quando il contatore viene resettato). I parametri caratteristici di un timer sono: – il range, cioè il massimo intervallo di tempo che il timer è in grado di misurare; – la risoluzione, cioè il minimo intervallo che può misurare.
Counters Si tratta di dispositivi che contano il numero di impulsi che si presentano in ingresso. A differenza dei timer non contano impulsi di clock ma eventi esterni. Contatore asincrono binario (uscita in forma binaria) a 4 bit (conta fino a ‘1111’). Realizzato utilizzando 4 stadi di flip-flop JK connessi in cascata. Gli ingressi J e K sono forzati a ‘1’: i flip-flop possano commutare lo stato ogni volta che un evento (impulso) si verifica. Asincrono, poiché i suoi flip-flop non ricevono l’impulso di temporizzazione simultaneamente (limitazione in velocità). Contatore sincrono binario a 4 bit. Tale struttura permette la temporizzazione contemporanea dei 4 flip-flop. Per questa regione prende il nome di contatore sincrono.
Timer/Counter Timer e contatori circuitalmente sono sinonimi. E’ possibile concepire quindi un circuito che possa fungere da timer o da contatore, aggiungendo ad un contatore a 16 bit un registro ad 1 bit ed un multiplexer . Clk è un impulso di clock. Cnt_in è un impulso esterno. Mode seleziona tramite il multiplexer l’input del contatore. Tramite il registro Mode tale dispositivo può essere programmato dall’utente. Clk_counter=Clk: il dispositivo funziona da timer, e conta gli impulsi di clock; Clk_counter=Cnt_in: il dispositivo funziona da contatore, e conta gli impulsi su Cnt_in.
Intel 8253 - 1 L’Intel 8253 è un dispositivo programmabile “stand-alone”, progettato per essere utilizzato come periferica di timing per microcomputer Intel. Utilizza la tecnologia nMOS. Package DIP a 24 pin. Consta di tre contatori/timer indipendenti da 16 bit di tipo ‘down’, ciascuno con una frequenza di conteggio superiore a 2Mhz. Sei modalità timer programmabili. Data bus buffer: contiene la logica per il trasferimento dei dati con il processore (bus a 8 bit) e con i registri interni (attraverso il bus interno). Read/Write logic: gestisce la lettura e scrittura dei registri di conteggio (A1 e A0 indicano quale dei 3 contatori leggere o scrivere). Control word register: contiene la parola di controllo (bit [D7…D0]) che il microprocessore invia al dispositivo per la sua programmazione.
Intel 8253 - 2 I bit [D7-D0] definiscono la parola di controllo con cui il processore programma l’8253. I bit D7 e D6 definiscono quale dei 4 contatori selezionare e programmare. I bit D5 e D4 indicano se, nel contatore selezionato, viene letto o caricato il byte più o meno significativo o entrambi. I bit D3, D2 e D1 settano la modalità di funzionamento dei contatori. Mode 0: il contatore viene programmato ad un valore iniziale da cui inizia a contare fino a 0: quindi il relativo pin OUT va a 1 fino a nuovo conteggio o parola di controllo. Mode 1: come mode 1, ma il conteggio inizia al fronte di salita del segnale GATE. Durante il conteggio il segnale GATE è ignorato. Mode 2: dopo l’attivazione del conteggio, OUT resta alto finché il contatore non raggiunge 1, e quindi va a 0 per un solo impulso di clock. Mode 3: come mode 2, ma OUT è alto per metà del periodo e bassa per l’altra metà. Mode 4: all’attivazione del conteggio OUT resta alto finché il contatore non raggiunge 0, quindi OUT va a 0 per un solo periodo di clock dopo di che ritorna alto. Mode 5: come mode 4, ma il conteggio inizia quando GATE viene triggerato. Il bit D0 definisce se il conteggio è binario o decimale.
Microcontrollore ADuC836 - 1 Esempio di periferiche di timing “on chip”: microcontrollore ADuC836 di Analog Devices. Basato su un core 8052 (Intel). Tre timer/contatori a 16 bit. Un watch-dog timer. Un wake-up/RTC timer. Ogni timer/contatore è costituito da 2 registri ad 8 bit (THx e TLx, x=0,1,2) e può operare in quattro differenti modi (codificati da 2 “timer mode select” bit). In funzionamento timer, TLx viene incrementato ad ogni ciclo macchina. In funzionamento counter, vengono campionati i pin T0, T1, T2 (in base al timer).
Microcontrollore ADuC836 - 2 Modi del Timer 0: sono codificati dai bit 0 e 1 del registro TMOD. Mode 00: TH0 timer/counter ad 8 bit, TL0 prescaler (divisore del clock) a 5 bit. T0: input per il timer in modalità Counter. INT0: utilizzato per attivare il Timer. C/T: (bit 2 di TMOD) seleziona se counter o timer. TR0: attiva il timer/counter (control). GATE=0: si attiva il conteggio settando TR0. GATE=1: si attiva il conteggio se TR0=1 e P3.2=1. TF0: bit 5 di TCON, viene settato dall’hardware quando si ha overflow, quindi genera un interrupt. Mode 01: funzionamento e schema analoghi al mode 00, con la differenza che il timer/counter è a 16 bit (TH0 e TL0 in cascata entrambi a 8 bit). Mode 10: TL0 è un timer/counter ad 8 bit con reload. Il valore di reload è programmato in TH0 e caricato in TL0 ad ogni overflow. L’overflow di TL0 setta TF0 (interrupt). TH0 viene settato via software ed il suo contenuto non viene modificato dall’overflow.
Microcontrollore ADuC836 - 3 Mode 11: TL0 è un timer/counter ad 8 bit pilotato da TR0, TH0 è un timer ad 8 bit pilotato dai bit di controllo del Timer 1, quindi da TR1. Con Timer 0 in mode 3 si hanno 3 timer/contatori: timer TH0, timer/counter TL0 e il timer/contatore del Timer 1, che può funzionare a sua volta in mode 0, 1, 2. Modi del Timer 1: coincidono con quelli del Timer 0. Sono codificati dai bit 4 e 5 del registro TMOD. In mode 3, timer 1 mantiene il valore del registro, ma è disabilitato. Gli altri bit di Timer 1 servono per pilotare Timer 0. Modi del Timer 2: Timer/counter a 16 bit con “autoreload”: un segnale esterno può attivare il reload. Timer/Counter a 16 bit con Capture: un segnale esterno provvede a trasferire il valore del counter in due registri ad 8 bit. Baud Rate generator per UART: può essere configurato per temporizzare i segnali di Rx e/o Tx della UART.
Altri timers - 1 Interval timer: misura un intervallo di tempo. Si azzera e genera il segnale Top quando il timer raggiunge un valore assegnato. Se il valore del contatore è uguale a Terminal count, si resetta il timer generando un segnale su Top. Comparatore a 16 bit e registro programmabile (Terminal count) a 16 bit. Realizzazione alternativa: si utilizza un NOR a 16 bit (rileva tutti 0 sui 16 bit) in luogo del comparatore, e un contatore down. Number of clock cycles=Desired time interval/Clock period. Cascaded counters: connettendo in cascata più contatori si ottiene un modulo con capacità di conteggio maggiore. La struttura risulta quindi nel complesso seriale, quindi asincrona.
Altri timers - 2 Timer con prescaler: il prescaler è un circuito divisore di clock configurabile, in grado quindi di abbassarne opportunamente la frequenza. Si utilizza quando si vuole campionare un segnale di clock ad una frequenza estremamente alta (più alta di quella che il timer può sopportare). Genera un impulso di clock ogni n impulsi ricevuti dal clock d’ingresso (“divide-by-n”). Il valore del registro Mode determina il valore della divisione: - Mode=0, Freq_out=Freq_in; - Mode=1, Freq_out=½Freq_in; - Mode=2, Freq_out=¼Freq_in; - Mode=3, Freq_out=1/8Freq_in. Esempio: il timer è a 16 bit, la frequenza di clock è di 100MHz (10ns), quindi il timer ha risoluzione di 10ns e range di 655.35μs. Se si attiva il prescaler con Mode=3 il timer ha risoluzione di 80ns, il range è 65535*80ns=5.24ms.
Altri timers - Watchdog timer - 1 Watchdog timer: nella sua forma più semplice è un contatore. Quando tale contatore va in overflow, allora il watchdog porta alto il segnale di RESET del sistema e quindi il controllore si resetta. In condizioni di funzionamento normale, il codice che il controllore elabora azzera periodicamente il contatore del watchdog, quindi quest’ultimo non va in overflow (“watchdog hit”). Quando il controllore entra in un loop infinito, o commette errori nell’elaborazione di sequenze di istruzioni, il controllore fallisce la hit: quindi il watchdog va in overflow resettando di conseguenza il controllore. Il controllore grazie al reset può quindi tornare a funzionare correttamente, elaborando il codice.
Altri timers - Watchdog timer - 2 Un watchdog timer può essere implementato utilizzando elementi discreti. Timer LMC555, che fa da oscillatore. Contatore 74HC161. Il blocco “Edge Detector” è utile affinché la linea di reset del watchdog sia sensibile solo alle transizioni. Soluzione costosa e che richiede molto spazio “on-board”.
Altri timers - Watchdog timer - 3 Una implementazione più integrata è il “dedicated supervisor chip”: composto da - blocco monitoraggio della potenza; - blocco di generazione del reset; - blocco watchdog; - batteria di ripristino per lo spegnimento e SRAM. Un esempio di tale chip è l’ ADM691 di Analog Devices. Due periodi di timeout, uno lungo e l’altro corto (la differenza fra i due periodi è di un fattore pari a 3). L’iniziale timeout lungo sul watchdog garantisce al controllore o processore di teminare le necessarie inizializzazioni (variabili, stack, frame) e far partire le applicazioni. Quando il codice è ormai in esecuzione, azzererà periodicamente (hit), in condizioni di funzionamento corretto, il contatore prima di un suo overflow. Quando ciò avviene il watchdog si accorge che il codice sta girando correttamente e quindi passa ad un periodo di timeout corto. In generale i watchdog timer sono utilizzati nei sistemi embedded per garantire affidabilità riguardo errori software e hardware.