MSP430: Utilizzo del Modulo Timer_A (Parte 1)

Valutazione attuale:  / 8
ScarsoOttimo 

 

   Gli MSP430 possiedono al loro interno diversi Timer la cui flessibilità può essere apprezzata solo dopo la comprensione delle caratteristiche del modulo stesso. Naturalmente la flessibilità viene al prezzo di una maggiore complessità, ma dopo una breve panoramica si comprenderà a pieno ogni dettaglio e non sarà difficile utilizzare questi moduli. Tra le varie famiglie degli MSP430 è possibile trovare diverse tipologie di Timer, nominati Timer_A, Timer_B e Timer_D. In particolare la linea Value Line MSP430G2xx è caratterizzata dall’avere il Timer_A, che rappresenta la versione più semplice tra quelle sopra citate. Come vedremo, sebbene un Timer nasca per contare e scandire il tempo, le applicazioni reali sono particolarmente interessanti.

 

MSP430 : Il Timer_A

   In Figura 1 è riportato lo schema a blocchi del Timer_A.

Schema a blocchi del Timer_A

Figura 1: Schema a blocchi del Timer_A.

Dallo schema è possibile subito vedere che la suddivisione del modulo è in due parti, la parte relativa al contatore vero e proprio, ovvero il Timer classico, e i moduli CCR0, CCR1, CCR2, ovvero i moduli Capture e Compare. La famiglia MSP430G2xx possiede al massimo 3 moduli Capture e Compare, mentre nella famiglia MSP430F5xx è possibile trovare Timer_A anche con 5 moduli Capture e Compare. I Timer_B hanno invece fino a 7 moduli Capture e Compare. Nella descrizione che seguirà oltre a capire come funzionano i registri Capture e Compare si capirà anche perché ne sono presenti 3 o 7.

Per quanto riguarda la nomenclatura riportata nel datasheet, qualora siano presenti due Timer_A, il loro nome sarà Timer0_A e Timer1_A. In particolare il nome reale viene a dipendere anche dal numero dei moduli Capture e Compare, che seguono la lettera A. Nel caso dell’MSP430G2553 con due Timer con 3 moduli Capture e Compare si ha rispettivamente Timer0_A3 e Timer1_A3 come riportato nel relativo schema a blocchi del datasheet:

Figura 2: Moduli Interni all'MSP4302553

Figura 2: Moduli Interni all'MSP4302553.

Vediamo di analizzare in dettaglio il Timer_A; la parte superiore riportata in Figura 3 possiede la logica necessaria per la scelta del clock ovvero TACLK, ACLK, SMCLK e INCLK.

Figura 3: Contatore TAR e divisione del clock nel Timer_A

Figura 3: Contatore TAR e divisione del clock nel Timer_A.

La scelta della sorgente del clock avviene per mezzo dei bit TASSELx presenti nel registro TAxCTL (la x dipende dal numero del Timer).

Il Clock TACLK rappresenta il clock proveniente dal relativo pin esterno dell’MSP430, per cui potrebbe essere utilizzato per esempio per misurare il numero di impulsi in un determinato lasso di tempo.

La possibilità di scegliere il clock ACLK e SMCLK permette al timer di lavorare a frequenze più o meno elevate ma soprattutto di poter lavorare anche in diversi Low Power Mode. Per esempio se si volesse usare il Timer per far risvegliare il microcontrollore ogni secondo e ci si trovasse in modalità LPM3, è obbligatorio usare il clock ACLK come sorgente per il timer, infatti il clock SMCLK viene disattivato in LPM3 mentre ACLK, sia esso proveniente dall’oscillatore interno VLO o il cristallo esterno da 32KHz, viene mantenuto attivo. Da questo si capisce che se si volesse usare il Timer per risvegliare l’MSP430 da un LPM4, l’unico modo sarebbe utilizzare il clock esterno TACLK, visto che tutte le altre sorgenti sono disattivate.

L’ultimo segnale di clock utilizzabile per il timer è INCLK. Tale sorgente viene a dipendere dal particolare dispositivo usato, in particolare per l’MSP430G2553 viene a coincidere con TACLK. Per maggiori informazioni è bene far riferimento al datasheet del dispositivo usato e cercare semplicemente la parola chiave INCLK.

Dopo la scelta del clock vi è un divisore di frequenza, che permette di dividere il clock selezionato per 1/2/4/8. La selezione dell’opzione voluta avviene per mezzo dei bit IDx sempre presenti nel registro TAxCTL. Per chi è abituato a programmare con i microcontrollori PIC18 questo divisore di frequenza è quello che prende il nome di pre-scaler.

Avvenuta la selezione del clock e relativo condizionamento per il raggiungimento della frequenza voluta, è presente il Timer vero e proprio, ovvero il TAR, che non fa altro che contare ogni singolo impulso di clock. Il TAR è un registro a 16 bit e può contare in vari modi selezionabili per mezzo dell’opzione Count Mode, ovvero per mezzo dei bit MCx (Mode Control), presenti sempre nel registro di configurazione principale TAxCTL riportato in Figura 4.

Figura 4: Registro TAxCTL

Figura 4: Registro TAxCTL.

È possibile vedere che sono presenti 4 diverse modalità:

In particolare in Stop Mode il contatore è disattivato. In Up mode il contatore arriva fino al valore scritto nel modulo Capture Compare CCR0, ovvero TAxCCR0 per poi iniziare nuovamente da 0x0000.

In Continuous Mode, il contatore arriva fino a 0xFFFF ovvero fino a raggiungere l’overflow e inizia poi nuovamente da 0x0000.

In Up/Down Mode il conteggio arriva fino al valore scritto in TAxCCR0 per poi decrementare fino a 0x0000 ed incrementare nuovamente fino a TaxCCR0, in maniera ciclica.

Il Timer possiede un interrupt Enable e relativo Interrupt flag che segnala l’evento dell’overflow. In particolare ogni modulo Capture e Compare Register ha anche un suo interrupt Enable e relativo Flag, che segnala altri eventi di cui vedremo i dettagli a breve.

Analizzando l’Interrupt Vector Table dell’MSP430G2553, riportato in Figura 5, è possibile vedere che i due Timer Timer0_A3 e Timer1_A3 possiedono diversi Interrupt Vector ed in particolare Timer1_A3 ha maggiore priorità del Timer0_A3. Il Flag associato all’overflow del registro TAR del Timer1_A3 (Contatore del Timer) è associato al vettore con priorità 28 ed è raggruppato con gli eventi delle interruzioni dei relativo moduli Capture e Compare CCR1 e CCR2. Il modulo CCR0 ha invece un vettore delle interruzioni dedicato con maggior priorità, ovvero di priorità 29. Questo discende dal fatto che il modulo Capture Compare 0 ha un ruolo un po' particolare visto che influenza le modalità Up Mode e Up/Down Mode.

Figura 5: Tabella dei Vettori delle Interruzioni dell'MSP430G2553

Figura 5: Tabella dei Vettori delle Interruzioni dell'MSP430G2553.

Vediamo qualche dettaglio in più per le modalità appena citate.

Modalità 00 – Stop

   Questa è la modalità base all'avvio del microcontrollore. In particolare il Timer è disabilitato e non avviene nessun conteggio. Tale impostazione è paragonabile ad un Enable del modulo stesso e deve essere impostata per disabilitare il Timer al fine di risparmiare energia.

Modalità 01 – Up Mode

   Nella modalità Up Mode il Timer, o meglio registro il registro TAR, viene incrementato per mezzo del clock selezionato. Il valore raggiunto è pari al valore contenuto in TAxCCR0 come riportato in Figura 6. Una volta raggiunto tale valore il conteggio riprende da zero, per cui il numero di conteggi effettuati è pari al valore TACCR0+1.

Da questo si capisce che il modulo Capture e Compare CCP0 ha un ruolo particolare nel caso della modalità Up Mode.

Figura 6: Dettagli sull´andamento del conteggio del Timer_A

Figura 6: Dettagli sull´andamento del conteggio del Timer_A.

Per quanto riguarda il flag delle interruzioni CCIFG, si ha che viene posto ad 1 quando il registro TAR raggiunge il valore TAxCCR0, mentre il valore TAIFG è posto ad 1 quando il registro TAR viene posto nuovamente a 0. I dettagli sono visibili in Figura 7.

Figura 7: Dettagli sull'attivazione dei bit TAIFG e CCIFG del Timer_A

Figura 7: Dettagli sull'attivazione dei bit TAIFG e CCIFG del Timer_A.

Nel caso in cui il registro TACCR0 dovesse essere variato durante il conteggio, si possono avere due casi, o il nuovo valore è maggiore/uguale al registro TAR o minore.

Nel primo caso il conteggio è azzerato, al massimo entro il ciclo successivo del clock, mentre nel secondo caso il conteggio continua normalmente fino al nuovo valore.

Tale modalità del timer può essere utilizzata per generare una base dei tempi costante. Facendo uso del clock ACLK si può mettere il microcontrollore in LPM3 e mantenere il conteggio tramite il Timer. Le interruzioni da parte del Timer possono risvegliare il microcontrollore in maniera regolare al fine di eseguire determinate attività. Come si vedrà nei prossimi capitoli, il Timer può essere utilizzato per avviare in maniera automatica la conversione da parte del modulo ADC, senza dover eseguire alcun codice all'interno dell'ISR (Interrupt Service Routine). Indirettamente, pur non avendolo specificato, il modulo CCR0 deve essere impostato per lavorare in modalità Compare, ovvero il bit CAP del registro TAxCCTLn (la x indica il numero del Timer mentre la n il numero del modulo Capture e Compare) deve essere posto a 0. Infatti in questa modalità il registro TAR che effettua il conteggio viene confrontato (Compare) con i relativi registri interni al modulo Capture e Compare abilitati in modalità Compare.

 

Modalità 02 – Continuous Mode

   In conituous mode il timer esegue un conteggio continuo fino a 0xFFFF, ovvero il valore massimo contenuto in un registro a 16 bit. Ogni volta che il conteggio arriva a 0xFFFF il registro TAR viene resettato permettendo un nuovo conteggio a partire da 0. Una rappresentazione grafica del conteggio è riportata in Figura 8.

Figura 8: Dettagli sull'andamento del conteggio del Timer_A

Figura 8: Dettagli sull'andamento del conteggio del Timer_A.

Dal momento che il modulo Capture e Compare CCP0 non è usato, l'unico flag associato a tale modalità è il flag TAIFG, come riportato in Figura 9.

Figura 9: Dettagli sull'attivazione del bit TAIFG del Timer_A

Figura 9: Dettagli sull'attivazione del bit TAIFG del Timer_A.

I vari moduli Capture e Compare CCRx possono essere abilitati in modalità compare in maniera da ottenere diverse interruzioni in tempi diversi. I moduli CCRx possono essere impostati in modalità Compare, per mezzo del bit CAP del registro TAxCCTLn, impostandolo a 0.

Abilitando il modulo Capture e Compare, in modalità Compare, anche il relativo Flag CCRIF sarà abilitato al verificarsi dell'evento di uguaglianza tra il registro (contatore) TAR e il valore del registro TAxCCRn.

 

Modalità 03 – Up-Down Mode

   Nella modalità Up-Down Mode, il registro TAR viene incrementato per mezzo del clock selezionato fino al raggiungimento del valore contenuto nel registro CCR0. Una volta raggiunto tale valore il registro TAR viene decrementato fino al raggiungimento del valore 0x0000, raggiunto il quale il registro TAR viene nuovamente incrementato ripetendo il tutto ciclicamente.

Da questo si capisce che il modulo Capture e Compare CCP0, come per la modalità Up Mode, ha un ruolo particolare. Una rappresentazione grafica del conteggio è riportata in Figura 10.

Figura 10: Dettagli sull'andamento del conteggio del Timer_A

Figura 10: Dettagli sull'andamento del conteggio del Timer_A.

Per quanto riguarda il flag delle interruzioni si ha che il bit CCIFG del registro TAxCCR0 viene posto ad 1 quando il registro TAR raggiunge il valore TACCR0, mentre il valore TAIFG è posto ad 1 quando il registro TAR viene posto nuovamente a 0x0000. I dettagli sono visibili in Figura 11.

Figura 11: Dettagli sull'attivazione dei bit TAIFG e CCIFG del Timer_A

Figura 11: Dettagli sull'attivazione dei bit TAIFG e CCIFG del Timer_A.

Nel caso in cui il registro TAxCCR0 dovesse essere variato durante il conteggio, si possono avere diverse situazioni. Nel caso in cui il timer stia nella fase di decremento il tutto continua normalmente fino al raggiungimento dello 0x0000 indipendentemente dal nuovo valore che si vuole scrivere.

Qualora il timer stia nella fase d'incremento, il comportamento è uguale alla situazione della modalità 1, ovvero Up Mode.

Tale modalità del Timer può essere utilizzata per generare segnali PWM complessi come quelli necessari per pilotare un ponte H, ovvero sia necessario un Dead Time (Tempo Morto, ovvero una pausa) per evitare che i transistor posti sullo stesso ramo del ponte non risultino attivati contemporaneamente, causando un cortocircuito. Maggiori dettagli sul come creare un segnale PWM complementare sono dati in seguito.

 

Modalità Compare (Uscite del modulo Capture e Compare)

   Fino ad ora abbiamo visto che ogni timer possiede dei moduli Capture e Compare che confrontano il valore del Timer (TAR) con il valore scritto nel relativo registro CCRn. A seconda del valore del registro TAR e della modalità selezionata vengono attivati in maniera opportuna i segnali di interrupt. I relativi flag possono essere letti per verificare il verificarsi di un determinato evento o potrebbero essere utilizzati per richiamare un Interrupt Service Routine (ISR) qualora siano attivati i relativi interrupt.

Oltre a questi aspetti base e fondamentali per un Timer, i moduli Capture e Compare possiedono un modulo di uscita collegato ad un pin del microcontrollore. Il modulo di uscita può dunque pilotare direttamente il pin senza l'intervento del software. Questa funzione viene in particolare usata in applicazioni come il semplice lampeggio di un LED o per generare un segnale PWM. Dal momento che ogni Timer ha più moduli Capture Compare, si capisce che si possono generare segnali PWM complessi, o semplicemente più segnali PWM con la stessa base dei tempi.

Ogni modulo di uscita associato ad un Timer Capture Compare può essere impostato in varie modalità per mezzo dei bit OUTMODx presenti nel registro TAxCCTLn. I dettagli sui bit contenuti nel registro TAxCCTLn sono riportati in Figura 12.

Figura 12: Dettagli dei bit del registro TAxCCTLn

Figura 12: Dettagli dei bit del registro TAxCCTLn.

In particolare le modalità disponibili sono riportate in Figura 13.

Figura 13: Modalità del modulo Capture e Compare

Figura 13: Modalità del modulo Capture e Compare.

Per meglio capire come si comportano le varie modalità, ovvero come l'uscita del modulo viene impostata in funzione del valore del Timer è bene vedere due esempi. Nel caso il Timer sia in modalità Up Mode, le varie modalità di uscita controllano il relativo pin di uscita come riportato in Figura 14.

Figura 14: Andamento delle uscite in modalità Up Mode

Figura 14: Andamento delle uscite in modalità Up Mode.

Nel caso in cui si faccia uso della modalità Up Down Mode, il modulo di uscita controlla il pin come riportato in Figura 15.

Figura 15: Andamento delle uscite in modalità Up Down Mode

Figura 15: Andamento delle uscite in modalità Up Down Mode.

Prima di procedere oltre è bene cercare di comprendere i diagrammi temporali riportati sopra. La loro comprensione permette infatti di capire come sia possibile generare il segnale PWM. Si fa presente che per permettere all'uscita del modulo Capture e Compare di pilotare direttamente il pin di una porta di uscita è necessario impostare in maniera opportuna il registro PxSEL e PxSEL2 (se presente) associati alla porta d'interesse.

Una volta compreso come sia possibile controllare i pin di una porta è bene riprendere brevemente quanto precedentemente accennato relativamente ad un segnale PWM complesso ovvero complementare (con Dead Time).

Impostando CCR0 in maniera tale da avere la frequenza d'interesse per il segnale PWM è possibile impostare CCR1 e CCR2 per controllare due pin differenti. Impostando CCR1 in modalità di uscita 6 e CCR2 in modalità di uscita 2, è possibile ottenere i diagrammi temporali di Figura 16.

Figura 16: Esempio di PWM complementare con Dead Time

Figura 16: Esempio di PWM complementare con Dead Time.

Tali diagrammi temporali rappresentano proprio due segnali PWM complementari con un Dead Time pari a:

Dove:

Il periodo del segnale PWM è pari a :

 

Modalità Capture

   Il Timer_A degli MSP430, sebbene sia il meno complesso della sua famiglia, possiede molte funzioni e flessibilità. Oltre a poter generare una base dei tempi e controllare dei pin in uscita (Modalità Compare), il modulo Capture e Compare associato al Timer permette di lavorare anche in modalità Capture, ovvero permette di utilizzare il Timer per misurare dei tempi o velocità. La modalità Capture viene selezionata ponendo il bit CAP del registro TAxCCTLn ad 1. Il fronte sul quale attivare il trigger interno può essere impostato per mezzo dei bit CM del registro TAxCCTLn e può essere impostato rispettivamente sul fronte di salita, discesa o entrambi.

In modalità Capture, il Timer, impostato in una delle modalità precedentemente descritte, effettua il conteggio liberamente. Al verificarsi di un evento di trigger, ovvero che permette di avviare un Capture, il valore del registro TAR viene salvato nel registro TAxCCRn.

Il segnale di trigger, ovvero di Capture proviene dalle linee CCIxA o CCIxB mostrati alla sinistra della Figura 1.

Questi segnali possono avere un collegamento sia interno (per esempio essere collegati all'uscita di un altro Capture Compare Module o Timer) o collegati a un pin esterno. Il segnale di trigger può essere selezionato per mezzo dei bit CCIS del registro TAxCCTLn. Per la corrispondenza tra CCIxA e CCIxB e segnali interni/esterni bisogna far riferimento al datasheet del microcontrollore utilizzato.

Nel caso nell'MSP430G2553 i segnali di trigger per il Timer0_A3 sono riportati in Figura 17:

Figura 17: Segnali di Trigger per il Timer0_A3

Figura 17: Segnali di Trigger per il Timer0_A3.

Le prime tre colonne a sinistra rappresentano i pin associati all'ingresso del modulo Capture e Compare, ovvero i segnali di trigger del Modulo Capture. Il segnale CCI0A nominato TA0.0 è per esempio collegato alla porta P1.1 (nel package PW20) ovvero il pin numero 3 da cui la scrittura P1.1-3.

Le uscite del modulo Capture e Compare sono riportate nelle ultime tre colonne. I dettagli relativi ai pin CCIxA e CCIxB possono essere visti nel datasheet anche alla sezione in cui si descrivono i vari pin e funzioni (inizio del datasheet).

 

 

 

Timer A, Timer B e Timer D a confronto

   Come visto il Timer_A possiede molte impostazioni, questo da un lato fornisce molta flessibilità ma dall’altro è anche fonte di una maggiore complessità. Ciononostante il numero esiguo di registri permette facilmente di iniziare a utilizzare questi moduli. Gli esempi che saranno mostrati in seguito faciliteranno ulteriormente il lavoro.

Sebbene il Timer_A abbia spaventato un po’ a causa dei vari diagrammi temporali, in realtà questo Timer rappresenta la versione più semplice tra quelle disponibili nella famiglia dei microcontrollori MSP430.

L'attenzione è stata posta solo sul Timer_A perché è disponibile nella famiglia MSP430G2xx della linea Value Line. Nelle altre famiglie è possibile trovare anche il Timer_B e Timer_D. Sebbene non entrerò nel dettaglio come sopra è bene riassumere brevemente le differenze e specifiche applicazioni dove un Timer possa tornare più utile di un altro.

Timer_B

Il Timer_B può essere considerato un miglioramento del Timer_A. Oltre a quanto presente nel Timer_A nel Timer_B sono presenti le seguenti caratteristiche aggiuntive:

La seconda e terza caratteristica aggiunta nel Timer_B sono state pensate appositamente per migliorare l'aggiornamento dei registri e gestire situazioni di sicurezza in applicazioni quali il controllo di motori. Il Timer_B è possibile trovarlo con 7 moduli Capture e Compare. Il numero 7 non è casuale e va ricercato nel fatto che per generare un segnale PWM complementare sono necessari il modulo CC0 più due moduli CCR per coppia di segnali PWM. Ogni segnale completare può pilotare mezzo ponte H o un ponte completo. In applicazioni che fanno uso di motori BLDC (Brush Less DC Motor) sono necessari 3 mezzi ponte H, per cui per il controllo di un motore BLDC sono necessari appunto 7 moduli Capture Compare.

Timer_D

Il Timer_D rappresenta un’altra estensione nella famiglia dei Timer, e oltre a quanto introdotto dal Timer_B aggiunge particolari segnali di sincronizzazione. In particolare il Timer_D viene definito ad alta risoluzione perché possiede una modalità per mezzo della quale è possibile raggiungere una risoluzione maggiore di quella imposta dal clock fino ad un massimo di 8 volte. Molti microcontrollori per permettere risoluzioni temporali maggiori rispetto a quelle imposte dal clock fanno uso di un PLL (Phase Lock Loop) interno, per mezzo del quale è possibile moltiplicare la frequenza interna n volte, ottenendo una risoluzione per il timer n volte migliore.

Negli MSP430, al fine di evitare i consumi introdotti dal PLL si fa uso di delay line in cascata, in maniera da moltiplicare il numero di fronti generati dal singolo fronte del clock.

 

Il Timer_D è stato pensato, oltre che per applicazioni come il controllo dei motori, anche per applicazione Lighting, in cui un accurato segnale PWM permette un miglior controllo dei LED, soprattutto in quelle applicazioni in cui il bilanciamento del flusso luminoso R, G, B è di particolare importanza.

 

Forum

Per qualunque domanda e chiarimento potete scrivere sul primo Forum in Italia dedicato agli MSP430.

 

Bibliografia

[1] : Home page dei microcontrollori MSP430 (Texas Instruments)

[2] : LaunchPad User Guide, slau318

[3] : User Guide MSP430x2xx

[4] : User Guide MSP430x5xx MSP430x6xx

 

Capitoli del Corso MSP430

Corso

Data

 

Titolo


Parte I 16-10-2011   MSP430: Microcontrollori Ultra Low Power
       
Parte II 23-10-2011   MSP430: Strumenti per Iniziare
       
Parte III 11-12-2011   MSP430: Code Composer Studio e LaunchPad
       
Parte IV- 1 15-04-2012   MSP430: Architettura e periferiche Ultra Low Power (Parte 1)
       
Parte IV- 2 22-04-2012   MSP430: Architettura e periferiche Ultra Low Power (Parte 2)
       
Parte V
13-05-2012   MSP430: Hello World
       
Parte VI 01-07-2012   MSP430: Utilizzo ed impostazione delle Porte I/O
       
Parte VII 18-11-2012   MSP430: Il modulo di distribuzione del Clock e modalità Ultra Low Power
       
Parte VIII 10-03-2013   MSP430: Le interruzioni e le modalità Ultra Low Power
       
Parte IX-1 13-10-2013   MSP430: Utilizzo del Modulo Timer_A (Parte 1)
       
Parte IX-2 13-10-2013   MSP430: Utilizzo del Modulo Timer_A (Parte 2)
       
      ...nuovi in arrivo...tieniti informato