MSP430: Il modulo di distribuzione del Clock e le modalità Ultra Low Power

Valutazione attuale: 4 / 5

Nei precedenti capitoli abbiamo visto come salutare il modo e leggere i pulsanti. Sebbene tutto abbia funzionato non ci si è posti il problema di come la sequenza di operazioni potesse essere eseguita. Ogni MCU, per quanto semplice possa essere, richiede un clock al fine di permettere alla CPU di eseguire ogni qualsivoglia operazione. In questo capitolo vedremo gli accorgimenti introdotti nel modulo di distribuzione del clock degli MSP430 al fine di poter supportare le applicazioni Ultra Low Power. Nonostante molte delle nozioni relative all'architettura facciano riferimento agli MSP430, le problematiche risolte permettono di comprendere anche altri microcontrollori e relativi moduli di distribuzione del clock. Il capitolo spiegherà in maggior dettaglio il modulo Basic Clock usato nella famiglia MSP430F2xx e la Value Line, ma introdurrà anche l'Unified Clock System (UCS) usato nella famiglia MSP430F5xx, MSP430F6xx e la nuova famiglia basata su FRAM. In ultimo, verranno spiegate le modalità Low Power quale forma di armonizzazione del clock e la sua distribuzione.        
 

MSP430: Basic Clock Module

Gli MSP430 possiedono, in base alla famiglia di appartenenza, un modulo di distribuzione del Clock differente. La famiglia MSP430F2xx e la Value Line possiedono il cosiddetto Basic Clock Module, che come dice il nome stesso, rappresenta una versione semplice del modulo stesso se paragonato al modulo UCS della famiglia MSP430F5xx e MSP430F6xx.
Sebbene il clock non rappresenti altro che un segnale ad onda quadra che scandisce le varie sequenze interne della CPU, al fine dello svolgimento di una qualsivoglia operazione, in applicazioni Ultra Low Power le esigenze e compromessi da soddisfare sono piuttosto complessi e contrastanti. Da un lato si vuole un clock rapido (alta frequenza) ma dall'altro si vogliono anche avere bassi consumi (bassa frequenza del clock). Il Basic Clock Module, nella sua semplicità, cerca di soddisfare tutte le esigenze. In Figura   è riportato lo schema a blocchi del Basic Clock Module. È subito possibile notare che sono presenti più sorgenti per generare il Clock, come anche più uscite. Le uscite del modulo sono rispettivamente:

•    ACLK (Auxiliary Clock)
•    MCLK (Master Clock)
•    SMCLK (Sub System Clock)

L'ACLK viene normalmente utilizzato per applicazioni a bassa frequenza a 32KHz, il MCLK viene utilizzato per scandire le sequenze della CPU mentre l'SMCLK viene utilizzato per le periferiche a media frequenza. Normalmente ogni periferica ha comunque la flessibilità di utilizzare una qualunque delle uscite appena citate al fine di poter compiere la propria mansione. Questo, come vedremo a breve, permette ad ogni periferica di operare in diverse modalità a basso consumo.

Le tre uscite possono essere assegnate a sorgenti diverse a seconda delle esigenze, dando una maggior flessibilità nell'assegnare le risorse ed in particolare gestire i consumi. Questo viene fatto per mezzo del multiplexer presente prima dell'uscita stessa, in particolare del divisore di frequenza.

Figura 1: Schema  a blocchi del Basic Clock Module degli MSP430F2xx

Figura 1: Schema  a blocchi del Basic Clock Module degli MSP430F2xx.

Tra le possibili sorgenti di clock vi sono il VLO (Very Low Oscillator) e il DCO (Digital Controlled Oscillator) entrambe interne al microcontrollore. Queste permettono di evitare l'utilizzo di un quarzo esterno e ridurre la lista della spesa (BOM, Bill of Material). L'oscillatore VLO ha un valore fisso di frequenza, nominale è di 12KHz ma il minimo e massimo varia tra 4KHz e 20KHz, dunque con una possibilità piuttosto ampia di errore. Questo oscillatore è bene usarlo in quelle applicazioni in cui una base dei tempi stabile non è strettamente necessaria. Sebbene questo oscillatore sia apparentemente di bassa qualità ha un vantaggio notevole ed è quello di essere a basso consumo. Nel datasheet del MSP430F2231 è per esempio riportato che nella modalità LPM3 in cui si mantiene l'oscillatore VLO attivo, è possibile avere dei consumi nominali di 500nA (la famiglia MSP430 nominata Wolverine abbassa  ulteriormente questi consumi).
Sono proprio queste basse correnti operative che rendono instabile il VLO, infatti basta avere correnti di leakage di poche decine di nA che la frequenza cambia. Normalmente le correnti di leackage aumentano con la temperatura, per cui non ci si deve sorprendere che il VLO varia la propria frequenza al variare della temperatura, con una tolleranza di 0.5 %/ºC (grazie ad alcuni collegamenti interni tra ACLK e il capture input del Timer è anche possibile calibrare il VLO facendo uso del DCO, o meglio sapere la sua frequenza).
Qualora sia richiesta una frequenza più elevata è possibile utilizzare il DCO interno, che permette frequenze operative fino a 16MHz (a seconda della famiglia MSP430 utilizzata, questo valore può variare, per cui far sempre riferimento al datasheet dell'MSP430 utilizzato).  
Il DCO, diversamente dal VLO, oltre che a raggiungere frequenze più alte ha la caratteristica di poter variare la propria frequenza in maniera dinamica. Questo permette di adattare l'oscillatore in base alle esigenze dell'applicazione. Un'altra caratteristica importante del DCO è quella di entrare in funzione in circa 1.5us se il microcontrollore è posto in LPM3 o LPM4. Questo è particolarmente importante in applicazioni Ultra Low Power poiché significa che il controllore può rimanere in Low Power Mode, svegliarsi molto rapidamente, eseguire le operazioni necessarie, per poi tornare in Low Power Mode altrettanto rapidamente.  
In ultimo, ma non meno importante, l'oscillatore DCO viene calibrato in fase di produzione e test dell'MSP430. I valori di calibrazione sono salvati in flash (Info Memory A). I valori disponibili possono variare da modello a modello e possono essere trovati all'interno del datasheet del microcontrollore utilizzato. Altro modo per vedere le frequenze calibrate è all'interno del file header incluso nel progetto stesso (basta cercare la parola chiave CAL).  Un valore calibrato del modulo DCO ha normalmente una tolleranza nel caso peggiore fino al 3% (intero intervallo di tensione e temperatura operativa).
Per impostare la frequenza calibrata di 1MHz si procede per esempio nel seguente modo:

BCSCTL1= CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;


dove CALBC1_1MHZ e CALDCO_1MHZ sono definite nell'header file (altri valori potrebbero essere presenti) e BCSCTL1, DCOCTL rappresentano i registri di controllo del DCO.
In particolare i 4 bit RSELx del registro BCSCTL1 permettono si selezionare l'intervallo di frequenza principale mentre i 3 bit DCOx del registro DCOCTL permettono di suddividere ulteriormente l'intervallo principale con un passo circa del 10%.  I valori delle frequenze ottenibili dal DCO sono tabellati nel datasheet del dispositivo utilizzato.

Qualora queste caratteristiche non siano sufficienti è possibile utilizzare un quarzo esterno. A seconda del modello dell'MSP430 è possibile avere uno o due buffer interni per quarzi esterni. La Value Line possiede attualmente solamente XT1 e con l'opzione LF (Low Frequency), ovvero per quarzi esterni da 32KHz (massima frequenza 50KHz). La famiglia MSP430F2xx ha in generale XT1 con opzione sia a bassa frequenza che ad alta frequenza, potendo supportare cristalli con frequenze operative di 16MHz (alcuni MSP430 possiedono frequenze operative maggiori).   
L'utilizzo di un quarzo esterno, permette di raggiungere frequenze di clock molto stabili sia nel tempo che al variare della temperatura e tensione, ciononostante questo lo si ottiene pagando il prezzo di componenti esterni e un aumento della corrente di sistema. In ultimo è bene anche ricordare il fatto che utilizzare dei cristalli esterni richiede in generale un maggior tempo al fine di permettere la stabilizzazione della frequenza. Per esempio un cristallo da 32KHz può richiedere centinaia di ms prima di poter essere operativo. In LPM3, come vedremo a breve, il buffer di XT1 non viene disattivato e un risveglio da questa modalità è molto rapido, ma un  risveglio da una modalità LPM4 richiederebbe molto più tempo (XT1 viene infatti  disattivato).
L'utilizzo di un cristallo esterno richiede un'opportuna capacità di carico al fine di poter permettere una corretta oscillazione dello stesso. Gli MSP430 possiedono al loro interno  alcune capacità che possono essere abilitate al fine di poter evitare l'utilizzo di ulteriori condensatori esterni (valori disponibili: 1pf, 6pf, 10pf, 12pf). Quando si abilitano queste capacità bisogna tener presente che gli stessi pin del microcontrollore rappresentano delle capacità di carico in parallelo, dunque che si devono sommare al totale (2 pF per pin). Quindi se si seleziona la capacità da 12pF la capacità totale sarà di 14pF. Qualora la capacità di carico richiesta da un determinato quarzo sia maggiore di quella selezionabile internamente, è necessario aggiungere la differenza  esternamente.   
Sebbene la massima frequenza operativa sia di 16MHz bisogna fare attenzione alla tensione di alimentazione al fine di poter lavorare alla massima frequenza. Infatti in applicazioni Ultra Low Power si tende ad abbassare le tensioni operative al fine di ridurre i consumi, ma queste potrebbero non essere compatibili con la frequenza di clock a cui si vuole operare. In Figura    è riportato un dettaglio dei limiti appena citati per la famiglia MSP430F2xx.

Figura 2: Massima frequenza di clock e minima tensione operativa

Figura 2: Massima frequenza di clock e minima tensione operativa.

Si noti in particolare che è presente un limite operativo per la tensione anche per quanto riguarda la programmazione, ovvero, qualora la propria applicazione voglia scrivere dei dati in Flash,  è necessario che operi ad una tensione minima si 2.2V. Questi limiti che affliggono molti microcontrollori basati su memoria flash non sono presenti nella famiglia MSP430 Wolverine, basata su FRAM (Ferro-Electric RAM).
Le impostazioni del modulo Basic Clock avvengono per mezzo dei registri DCOCTL, BCSCTL1BCSCTL2BCSCTL3, IE1, IFG. Questi registri permettono rispettivamente di selezionare la Frequenza del DCO, abilitare XT1, XT2, selezionare la sorgente per ogni uscita e dividere quest'ultima per abbassare la sua frequenza finale. Si noti che non  è possibile per mezzo di questi registri disabilitare le varie uscite del clock, vedremo i dettagli di questa apparente mancanza quando si tratteranno le modalità Low Power. I registri IE1 e IFG permettono di abilitare le interruzioni e gestire relativo flag nel caso in cui siano rilevati problemi di oscillazione nel clock XT1 (LF o HF) e XT2 (se presente).
 

MSP430: Unified Clock System

Sebbene gli MSP430F2xx siano la famiglia di riferimento di questo testo è bene tenere a mente anche le altre famiglie, visto che i nuovi MSP430 con FRAM sono basati sull'architettura MSP430F5xx.  L'architettura del modulo Basic Clock, sebbene semplice ed essenziale, permette di raggiungere un buon compromesso tra semplicità e flessibilità.  L'architettura Unified Clock System (UCS) cerca di completare la precedente architettura fornendo la totale flessibilità all'utente. In particolare ogni uscita del clock ACLK, MCLK e SMCLK può essere impostata su una qualunque sorgente di clock ed avere una divisione della stessa. Per tale ragione, come visibile in Figura , il tutto rimane molto simmetrico.
Il modulo UCS introduce l'oscillatore REFO calibrato a 32KHz in fabbrica ed utilizzabile con il Real Time Clock Calendar (RTC) interno agli MSP430. Anche l'oscillatore MODOSC è nuovo ed è possibile utilizzarlo come sorgente per vari moduli, tra cui l'ADC. In particolare viene utilizzato anche dal Flash controller durante la fase di scrittura della memoria flash, permettendo di semplificare tale fase e garantire che i prerequisiti del clock siano sempre rispettati (nella famiglia MSP430F2xx è necessario garantire che in fase di scrittura il clock utilizzato dal modulo flash controller sia entro un determinato intervallo).
La parte relativa al DCO è più complessa, dal momento che viene utilizzata l'architettura degli MSP430F4xx ovvero DCO più il modulo FLL (Frequency Lock Loop). Il modulo FLL permette di controllare il modulo DCO garantendone la sua stabilità in frequenza rispetto a variazioni della temperatura e tensione, ammesso che la sorgente di riferimento del FLL sia stabile. Tra le sorgenti di riferimento del modulo FLL è possibile scegliere sia un cristallo esterno che il modulo REFO.  
Una novità introdotta dal modulo UCS è il clock on demand, ovvero il clock su richiesta. Come vedremo a breve, in base alla modalità Low Power selezionata, si disattivano una alla volta  le varie sorgenti di clock. Nella famiglia MSP430F2xx si traduce nel fatto che ogni volta che bisogna utilizzare un modulo e una determinata sorgente di clock, è necessario garantire che quest'ultima sia sempre attiva e non si disattivi a causa di un determinato stato Low Power. Questa attenzione da parte del programmatore, sebbene sia un buon criterio di programmazione, viene garantita dal modulo UCS, il quale grazie ai segnali ACLK_REQ, MCLK_REQ, MCLK_REQ e MODOSC_REQ permette di tenere attivo un clock o riattivare un clock disattivato da uno stato Low Power, ogni qual volta lo richieda una periferica.

Figura 3: Schema a blocchi del modulo Unified Clock System

Figura 3: Schema a blocchi del modulo Unified Clock System.

Una volta terminata l'esigenza del clock, quest'ultimo viene disattivato in accordo con lo stato Low Power (i segnali di Clock Request non sovrascrivono infatti lo Status Register). Se da un lato questo rappresenti un aiuto al fine di garantire che le periferiche non si trovino mai senza clock quando ne hanno necessità, bisogna tenerlo a mente qualora si vedano consumi apparentemente eccessivi in un determinato stato Low Power. Se infatti il microcontrollore è nello stato LPM3 ma l'ADC è impostato ad usare il MCLK a 16MHz, durante la fase di sampling dell'ADC, anche se si è in LPM3, viene attivato il MCLK. Questo aumenta i consumi che si è soliti vedere in LPM3 ma garantisce il corretto funzionamento dell'ADC. La funzione di clock on demand, qualora non sia richiesta e si voglia avere il controllo delle periferiche e clock senza alcun aiuto dell'hardware, può essere disattivata. L'architettura degli MSP430F5xx introduce nuove caratteristiche anche nel Power Managment Module (PMM) che abbinate al modulo UCS permettono una notevole flessibilità delle varie modalità Low Power (le modalità LPM x.5 non sono presenti nell'architettura MSP430F2xx).
Per maggiori dettagli sul modulo UCS e i fail modes, si rimanda alla User Guide della famiglia MSP430F5xx e MSP430F6xx.
 

MSP430: Modalità Low Power

La flessibilità che discende dal modulo UCS o Basic Clock rappresentano solo un aspetto delle esigenze Low Power. Un corretto utilizzo delle varie opzioni e supporto di periferiche intelligenti e a basso consumo, rappresentano anche un'importante aspetto da non sottovalutare.  
Abbiamo visto che le varie sorgenti del clock possono essere impostate in vari modi e selezionate in base alle esigenze. Tra le varie impostazioni non vi è però la possibilità di attivarle e disattivarle, almeno nei registri di controllo. Infatti tale possibilità è presente ma avviene “stranamente” per mezzo dello Status Register. Lo Status Register, come spiegato nell'architettura dell'MSP430, possiede infatti, oltre che ai bit standard che ci si aspetta di trovare nello Status Register (V, N, Z, C), anche i bit SCG0SCG1, OSC OFF, CPU OFF, come riportato in Figura . Questi bit intervengono appunto nel gestire le varie sorgenti del Clock ed in particolare anche la CPU.

Figura 4: Status Register utilizzato per le modalità Low Power

Figura 4: Status Register utilizzato per le modalità Low Power.

In base alla particolare combinazione di questi bit ci si trova in un particolare stato a bassa potenza. La famiglia MSP430F2xx e la Value Line hanno 5 modalità a bassa potenza nominate LPM0LPM1LPM2LPM3LPM4 come rappresentato in Figura . Tale Figura mette in evidenza la combinazione dei bit  SCG1,  SCG1, OSC OFF, CPU OFF che portano ad avere il relativo stato a bassa potenza. Per esempio in LPM0 si ha che la CPU è in stato di off come anche il MCLK, mentre SMCLK e ACLK sono attivi, ovvero :

SCG0: 0
SCG1: 0
OSC OFF: 1
CPU OFF : 1

Il diagramma di Figura  ritorna utile anche per vedere i relativi stati POR e PUC e gli eventi che possono generarli.

Figura 5: Rappresentazione grafica dei vari stati a bassa potenza per gli MSP430F2xx

Figura 5: Rappresentazione grafica dei vari stati a bassa potenza per gli MSP430F2xx.

Normalmente lo stato a bassa potenza più utilizzato è il LMP3 visto che permette di avere il clock ACLK a bassa frequenza attivo. In particolare questo significa che è possibile avere un cristallo a 32KHz o il VLO come sorgente.  Lo stato a maggior risparmio energetico è il LPM4, almeno per la famiglia MSP430F2xx. In questo stato, disattivando ogni sorgente di clock, si possono raggiungere correnti di circa 100nA mantenendo i dati in RAM. Questo è un aspetto importante in quelle applicazioni come i data logger o nelle quali non si vogliano inizializzare le periferiche ad ogni risveglio. I microcontrollori della Microchip scendono rispetto a queste correnti a circa 20nA ma sacrificando i dati in RAM (a meno di non utilizzare altre modalità Low Power a maggior consumo) .
Per ovviare a questo problema i microcontrollori Microchip con XLP possiedono la possibilità di una seconda batteria utilizzata per alimentare un numero limitato di celle RAM in cui è possibile preservare qualche dato importante prima di andare in Deep Sleep mode. Altra differenza importante tra il Deep Sleep mode e LPM4 è il fatto che gli MSP430 possiedono la circuiteria BOR sempre attiva per monitorare la tensione della batteria, mentre in Deep Sleep mode il modulo BOR non è incluso. Si capisce che a seconda delle applicazioni si potrebbe preferire un microcontrollore rispetto all'altro.   
Nella famiglia MSP430F5xx e MSP430F6xx per dare ulteriore flessibilità al progettista sono state introdotte le modalità LPMx.5 come riportato in Figura . Il .5 sta ad indicare che LDO interno (Vcore) viene disattivato per cui vengono persi i dati in RAM qualora si abiliti la modalità LPM3.5 o LPM4.5.  In particolare la modalità LPM4.5 si comporta come il Deep Sleep Mode dei microcontrollori Microchip con tecnologia XLP.

Figura 6: Rappresentazione grafica dei vari stati a bassa potenza per gli MSP430F5xx-MSP430F6xx

Figura 6: Rappresentazione grafica dei vari stati a bassa potenza per gli MSP430F5xx-MSP430F6xx.

Maggiori dettagli su queste modalità possono essere trovati nella User Guide della famiglia MSP430F5xx e MSP430F6xx. La nuova famiglia basata su FRAM possiede le modalità Figura  però, qualora si usi la memoria FRAM per le variabili, anche entrando in modalità LPMx.5 i dati vengono preservati. Infatti la memoria FRAM pur potendo essere utilizzata come RAM è una memoria non volatile. Anche alcune varianti degli MSP430F5xx possiedono l'opzione di una seconda alimentazione al fine di preservare un numero limitato di dati in un'area RAM speciale.     

Arrivati a questo punto ci si può chiedere come si possa risvegliare il microcontrollore entrato in una modalità Low Power. Questo è possibile per mezzo di un qualunque interrupt di una periferica, per mezzo di un segnale esterno, un Reset o un Power Cycle. Il raggiungimento di bassi consumi si basa proprio nello sfruttare questa possibilità. Per esempio se si vuole campionare un segnale analogico è possibile impostare un Timer che avvii periodicamente l'ADC, il quale a fine conversione genera un interrupt per svegliare la CPU dallo stato di Sleep.

L'utilizzo di una determinata modalità Low Power dipende dall'applicazione, infatti le risorse necessarie potrebbero non essere disponibili o meglio potrebbero essere rese disponibili in tempi troppo lunghi (troppo tardi). Come accennato, ogni modalità a basso consumo ha tempi di risveglio diversi per cui bisogna valutare se questi sono compatibili o meno con la propria applicazione. Infatti, sebbene sia importante mantenere il microcontrollore in stato di sleep al fine di ridurre la corrente consumata in stato attivo (Active Mode), è anche altrettanto importante che il microcontrollore si risvegli rapidamente. Questo si traduce nell'avere un clock stabile in tempi rapidi al fine di permettere un rapido utilizzo delle periferiche di sistema. Un risveglio rapido permette anche di risparmiare energia perché vorrebbe dire lavorare e andare a dormire presto!

A seconda della modalità Low Power selezionata, i tempi di risveglio possono oscillare da 1?s  fino al ms. Si fa presente che qualora si faccia uso del quarzo esterno da 32KHz possono essere necessari centinaia di ms prima che questo oscilli in maniera stabile (questo è una proprietà fisica dei quarzi a 32KHz e dei processi di fabbricazione).
In ultimo è bene riprendere quanto detto brevemente durante la discussione dell'architettura degli MSP430, ovvero perché il controllo della modalità Low Power sono posti “stranamente” nello Status Register.  La ragione risiede nel fatto che lo Status Register, assieme al Program Counter, viene memorizzato nello Stack al verificarsi di un Interrupt. Questo significa che quando si è in Low Power mode e si verifica un Interrupt, lo Status Register prima di essere resettato (perdendo le informazioni memorizzate al suo interno) viene salvato nello Stack. Resettare lo Status Register significa avere il microcontrollore in Active Mode subito dopo un interrupt, ovvero pronto per eseguire le operazioni necessarie. Quando l'Interrupt Service Routine (ISR) termina il proprio lavoro e l'istruzione RETI (Return From Interrupt) viene eseguita dalla CPU, il Program Counter e lo Status Register sono automaticamente ripristinati, ovvero il microcontrollore ritorna in stato di Sleep in automatico senza dover compiere alcuna operazione.

Per mezzo delle seguenti funzioni è possibile cambiare le impostazioni dello Status Register senza dover usare i singoli bit.

unsigned short _bic_SR_register(unsigned short mask);
unsigned short _bic_SR_register_on_exit(unsigned short mask);
unsigned short _bis_SR_register(unsigned short mask);
unsigned short _bis_SR_register_on_exit(unsigned short mask);
unsigned short _get_SR_register(void);
unsigned short _get_SR_register_on_exit(void);

Queste funzioni accettano infatti il nome della modalità da applicare. Per esempio se si volesse abilitare LPM3 e abilitare le interruzioni si potrebbe scrivere:

_bis_SR_register(LPM3_bits + GIE);

Le funzioni che terminano con on_exit sono le funzioni che operano sullo Stack, ovvero cambiano il valore dello Status Register memorizzato nello Stack, in modo tale che al ritorno dalla ISR il Low Power Mode sia diverso da quello precedentemente impostato.
 

MSP430: Esempio di utilizzo del clock e Low Power Mode

Vediamo ora di dare un senso a quanto detto per mezzo di un semplice esempio, che seppur di poca utilità pratica mostra alcuni aspetti fondamentali sul comportamento degli MSP430 e del modulo di distribuzione del clock.


#include <msp430.h>

void main(void) {

// Stop watchdog timer
WDTCTL = WDTPW + WDTHOLD;

// Seleziona SMCLK -> DCO, MCLK->DCO
BCSCTL2 |= SELM_0;

// Seleziona ACLK -> VLO
BCSCTL3 |= LFXT1S_2;

// Imposta DCO a 1MHz (calibrato)
BCSCTL1= CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

// Trigger Oscilloscopio
P1DIR |= BIT6;
P1OUT = 0x00;

// SMCLK in uscita su PORT1 bit 4
P1DIR |= BIT4;
P1SEL |= BIT4;

// ACLK in uscita su PORT1 bit 0
P1DIR |= BIT0;
P1SEL |= BIT0;

__delay_cycles (1000);

while (1) {

P1OUT = BIT6;

_bis_SR_register (LPM3_bits);

// Operazione mai eseguita

P1OUT = 0x00;

}

}

Il programma inizia come al solito con il disattivare il Watchdog, successivamente imposta MCLK, SMCLK, ACLK con diverse sorgenti, in particolare il DCO e VLO.  Il modulo DCO viene impostato ad 1MHz per mezzo del valore calibrato e memorizzato all'interno dell'Information Memory. Dopo questa inizializzazione si è impostata la Porta P1, che sebbene si possa impostare con una sola istruzione, per scopi di chiarezza si sono messi in evidenza le singole inizializzazioni. Il BIT6 è impostato come uscita ed è utilizzato per generare un trigger per l'oscilloscopio prima di andare in LPM3. Questo è fatto al solo scopo di poter effettuare la misura di Figura  facendo uso del segnale di trigger esterno dell'oscilloscopio.
Successivamente la porta P1 viene impostata per avere il SMCLCK e ACLCK in uscita rispettivamente sul pin P1.0 e P1.6. In questo esempio si è scelto di fare questo, semplicemente per fare una misura dei due clock precedentemente impostati. In generale questo può tornare utile per fornire il clock interno a periferiche esterne per mezzo del buffer rappresentato dalla porta stessa. Oltre a questa applicazione, un tale setup può essere utile in fase di debug al fine di  monitorare lo stato del microcontrollore (in un certo qual modo quello che si fa in questo esempio). Per porre in uscita il clock SMCLK si è fatto uso per la prima volta del multiplexer presente sulla porta di uscita, ovvero del registro PxSEL. Le informazioni relative al multiplexer si trovano nel datasheet alla sezione relativa alle applicazioni. Per il pin P1.4 dell'MSP430G2231 lo schema elettrico è riportato in Figura . Alla fine dello schema è riportata la Tabella relativa alle configurazioni possibili. Per avere in uscita il clock SMCLK è necessario porre ad 1 il bit 4 dei registri P1DIR e P1SEL, ovvero:

// SMCLK in uscita su PORT1 bit 4
P1DIR |= BIT4;
P1SEL |= BIT4;


In maniera analoga si è fatto per il clock ACLK.

Figura 7: Schema elettrico del pin P1.4 dell'MSP430G2231

Figura 7: Schema elettrico del pin P1.4 dell'MSP430G2231.

Una volta impostato il clock si è eseguito un ritardo di 1000 cicli di clock, ovvero di 1ms, considerando che la nostra CPU sta lavorando a 1MHz (MCLK è impostato con il DCO).

__delay_cycles (1000);

Questo ritardo serve semplicemente per rendere l'immagine dell'oscilloscopio di più facile lettura. Dopo il ritardo viene settato il pin BIT6 che permette di avviare la misura dell'oscilloscopio impostato per misurare SMCLK (DCO) sul canale CH1 (pin P1.4) mentre ACLK (VLO ) sul canale CH2 (pin P1.0). Dopo aver settato il pin si entra in LPM3 per cui l'istruzione successiva non verrà mai eseguita (non sono presenti interrupt e cambi di modalità), ovvero il LED2 posto su P1.6 rimarrà sempre acceso. Anche il while (1) ha poco senso in questo applicazione ma mostra che viene eseguito un solo ciclo.

Vediamo ora il risultato della misura riportata in Figura  (analizzatela prima di continuare).

Figura 8: Misura di laboratorio dell'SMCLK e ACLK

Figura 8: Misura di laboratorio dell'SMCLK e ACLK.

La linea gialla (CH2) rappresenta il VLO. Considerando che la base dei tempi dell'oscilloscopio è 200us e sono presenti circa due cicli di clock si ha che la frequenza si aggira intorno a 10KHz (si sono misurati 11KHz). Il rettangolo azzurro rappresenta la frequenza del DCO che essendo circa 100 volte più alta del VLO, risulta di “tinta unita” per il numero elevato di cicli di clock in 200us.
Si osservi ora che CH1 e CH2 iniziano con un livello 0 (microcontrollore non alimentato). Quando viene alimentato il microcontrollore il modulo DCO e VLO si avviano e sono impostati rispettivamente su SMCLK e ACLK per cui sono misurati dall'oscilloscopio. Dopo 1000 cicli di clock (5 divisioni da 200us) viene avviata la modalità LPM3. Come visibile in Figura , in questa modalità viene disattivato il modulo DCO, MCLCK e SMCLK per cui sul canale CH1, una volta entrati in LPM3 non vi sono più oscillazioni (il modulo DCO è spento). Diversamente il canale CH2, avendo ACLK e il VLO che rimangono attivi in LPM3, mostra ancora le oscillazioni. Osservando il LED2 si noterà che questo rimane acceso anche in LPM3 per cui quando si vogliono abbassare i consumi è necessario in generale accertarsi che tutte le porte siano impostate per spegnere ogni carico, se non necessario.

 

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

 


You don`t have permission to comment here!