In questa seconda parte del corso dedicato all'Architettura degli MSP430 e relative periferiche Ultra Low Power, si descrivono in maggior dettaglio la circuiteria di Reset, le Interruzioni, gli Stati Ultra Low Power e le porte d'Ingresso ed Uscita. Un ultimo passo prima di salutare il mondo e dare sfogo alla propria fantasia.
MSP430: Circuiteria di Reset
Ogni microcontrollore possiede una circuiteria di Reset, ovvero quella parte del sistema che permette di inizializzare il microcontrollore al fine di avviarlo con uno stato noto. Sebbene l'azione da compiere sia relativamente semplice, il segnale di Reset viene generato da una circuiteria più o meno complessa a seconda dei microcontrollori. Gli MSP430, come praticamente tutti i microcontrollori, sono caratterizzati dall'avere un pin esterno per la circuiteria di Reset, nominato RST/NMI. La sua funzione è duplice, all'avvio è impostato come pin di RESET ma potrebbe essere utilizzato anche per ricevere un segnale associato internamente ad una interruzione non mascherabile (si veda il paragrafo sulle interruzioni per maggiori dettagli). Il pin di Reset deve avere un resistore di pull-up di 47Kohm e un condensatore verso massa di 10nF (massimo di 2.2nF nel caso si faccia uso di programmazione on-board, come per esempio nel caso di schede di sviluppo).
Oltre al segnale di Reset, due segnali interni di particolare importanza, legati al Reset stesso, sono il segnale POR (Power On Reset) e il PUC (Power Up Clear).
Il segnale POR viene generato ogni qual volta
• Il microcontrollore viene alimentato.
• La linea di Reset RST viene portata a livello logico bassa.
• Il modulo SVS (Supply Voltage Supervisor) rileva un problema di alimentazione e PORON = 1.
Il segnale PUC viene generato quando:
• Viene generato un POR.
• Il Watchdog ha un overflow.
• La password associata al Watchdog non è corretta.
• Si accede ad un indirizzo vietato della Flash (oltre il confine della memoria disponibile)
• Se un'istruzione viene caricata da un indirizzo della memoria compreso da 0h a 01FFh.
Quando viene eseguito il Reset viene eseguito un POR che causa le seguenti inizializzazioni:
• Il pin RST è configurato come Reset.
• I pin I/O sono configurati come ingressi (a meno di periferiche speciali).
• Lo Status Register SR viene resettato.
• Il Watchdog viene avviato.
• Il Program Counter viene caricato con il Reset Vector 0FFFEh
Dopo l'indirizzo associato al Reset Vector sono presenti altri vettori delle interruzioni, per cui, nel Reset Vector, qualora si stia scrivendo in Assembly, bisogna scrivere un salto all'origine del programma principale. Tra le altre operazioni da compiere dopo il Reset vi è quella di inizializzare lo Stack Pointer in cima alla RAM e disabilitare il Watchdog qualora non sia richiesto. Dopo queste istruzioni base si deve avviare la procedura di inizializzazione delle periferiche richieste nella particolare applicazione che si sta sviluppando.
Nota:
Il valore con cui viene inizializzato un registro dopo un evento di Reset è riportato nella User Guide ed è contenuto tra parentesi tonde sotto la spiegazione del registro stesso. Spesso il valore è pari a 0, dunque si trova il valore (0).
MSP430: Le Interruzioni
Un programma rappresenta una successione di istruzioni che procede in maniera sequenziale. La presenza di loop e salti condizionali spezzano la linearità del programma e permettono di svolgere in maniera ciclica delle operazioni. Se non fossero presenti i loop o salti condizionali e il programma fosse solo lineare, ogni programma verrebbe eseguito in brevissimo tempo e non si avrebbero molti benefici nel far eseguire un programma ad un microcontrollore. Oltre alle istruzioni condizionali e loop un programma può avere il proprio flusso alterato a causa delle interruzioni, ovvero eventi esterni o interni al microcontrollore stesso, che richiedono particolare attenzione e l'esecuzione di un programma o funzione speciale, nominata Interrupt Service Routine (ISR). Il segnale di Reset precedentemente spiegato rappresenta una interruzione, infatti un programma in esecuzione, qualora venga generato un Reset, viene interrotto e inizia il programma a partire dal Reset Vector. Gli MSP430 possiedono i vari Interrupt Vector, ovvero indirizzi al quale viene posizionato il Program Counter al verificarsi di una determinata interruzione, in una zona prefissata della memoria e nominata Interrupt Vector Table (Tabella dei vettori delle Interruzioni). Il vettore delle interruzioni non è altro che un indirizzo di memoria flash nel quale viene memorizzato l'indirizzo di memoria in cui inizia l'Interrupt Sevice Routine. Quando si scrive in C non bisogna tenere conto di questi dettagli ma scrivendo in Assembly è necessario scrivere all'interno dell'Interrupt Vector Table l'indirizzo d'inizio dell'ISR.
La caratteristica dell'architettura degli MSP430 è quella di avere delle priorità fisse, in particolare la priorità è associata all'indirizzo stesso in cui è posizionato il vettore delle interruzioni. I vettori delle Interruzioni sono posizionati a partire dall'indirizzo 0FFC0h fino a 0FFFEh. Maggiore è il valore dell'indirizzo maggiore è la priorità associata all'interruzione stessa. Si noti in particolare che il valore a più alta priorità è all'indirizzo 0FFFEh che è associato al Reset della CPU stessa. Maggiori dettagli sugli interrupt e il vettore associato ad ogni Interruzione, possono essere trovati all'interno del datasheet del microcontrollore utilizzato. In generale, facendo uso dei nomi definiti all'interno degli Header File non ci dovrà preoccupare molto della posizione dei Vettori delle interruzioni a meno di non voler sapere il loro livello di priorità .
Gli interrupt interni agli MSP430, come per molti microcontrollori, sono suddivisi in Interruzioni mascherabili e Interruzioni non mascherabili. Le Interruzioni non mascherabili sono quelle che non vengono attivate per mezzo del bit GIE (General Interrupt Enable) presente nello Status Register ma hanno un bit di abilitazione dedicato. Le Interruzioni non mascherabili sono associate agli eventi di Reset, violazione di accesso Flash e problemi associati all'oscillatore. Le Interruzioni mascherabili, diversamente da quelle non mascherabili, oltre a possedere un bit di abilitazione possono tutte essere mascherate per mezzo del bit GIE. Questo significa che se si attivano per esempio le interruzioni associate ad un Timer ma il bit GIE non è abilitato, sebbene il flag associato alle interruzioni del Timer verrà abilitato, non verrà attivata nessuna interruzione (ogni interruzione possiede un Flag che segnala l'avvenuta interruzione di una periferica). Qualora l'evento che ha generato l'interruzione ha un vettore delle interruzioni dedicato, il flag associato all'interruzione, viene azzerato automaticamente all'avvio della funzione di gestione dell'interruzione. Qualora un vettore delle interruzioni sia associato a più sorgenti di interruzioni il flag deve essere azzerato nel programma stesso (via Software). Un esempio di vettore associato a più sorgenti d'interruzione è quello della PORT1. Infatti ogni pin ha come visto un bit di abilitazione delle interruzioni e un Flag di avvenuta interruzione.
Quando viene generato un interrupt sono necessari 5 cicli di Clock nella CPUX e 6 cicli di clock nella CPU standard prima che venga eseguita la ISR (il tempo tra il riconoscimento di un Interrupt e l'inizio dell'esecuzione delle istruzioni nell'ISR è detto tempo di latenza). Il riconoscimento di un'interruzione preventivamente abilitata, comporta le seguenti operazioni:
• L'esecuzione dell'istruzione corrente viene completata.
• Il Program Counter (che punta alla prossima istruzione) viene salvato nello Stack.
• Lo Status Register viene salvato nello Stack.
• L'Interrupt con maggiore priorità viene eseguito (se più interrupt sono stati generati in contemporanea)
• L'Interrupt Flag viene resettato se la sorgente ha un unico vettore delle interruzioni. Vettori con sorgenti multiple non ripuliscono i Flag.
• Lo Status Register viene resettato causando la CPU a tornare allo stato attivo (se era in sleep mode) e disabilitare GIE.
• Il contenuto del vettore delle interruzioni, viene caricato nel Program Counter, ovvero viene considerato come indirizzo d'inizio dell'ISR.
Una volta eseguita la routine di gestione dell'Interruzione è possibile tornare alla normale esecuzione del programma. Il ritorno viene avviato per mezzo dell'istruzione RETI (Return from Interrupt) necessaria solo se si programma in Assembly (in C viene introdotta automaticamente in fase di compilazione). Nella CPU standard sono necessari 5 Cicli di Clock per permettere il ripristino della situazione prima dell'Interrupt, mentre nella CPUX sono necessari 3 cicli di clock. Le operazioni compiute durante il ritorno dall'Interrupt sono:
• Ripristino dello Status Register (SR).
• Ripristino del Program Counter (PC).
Una volta ripristinato lo Status Register la CPU torna nell'eventuale stato a basso consumo che era impostato prima dell'Interrupt, indipendentemente dallo stato utilizzato durante la gestione dell'interruzione. Si ricorda comunque che lo Status Register memorizzato nello Stack potrebbe essere cambiato a piacimento e alterare dunque lo stato di ritorno della CPU.
Come appena visto, qualora l'Interrupt sia generato da un pin sulla Porta P1, è necessario controllare il Flag dei singoli pin al fine di determinare la sorgente esatta. Questa operazione consiste generalmente nel verificare bit per bit il registro P1IFG che ha appunto i Flag relativi alle interruzioni della porta. Gli MSP430 di ultima generazione, per limitare il numero di istruzioni eseguite, ovvero energia persa al solo scopo di capire quale pin ha generato l'interruzione, possiedono una seconda Tabella delle Interruzioni nominata P1IV che in realtà rappresenta un offset che si può sommare al Program Counter già posizionato sul vettore d'interruzione associato alla porta P1. L'offset rispecchia praticamente il valore del bit che ha generato l'interruzione e permette inoltre di resettare il Flag delle interruzioni associato al bit stesso. Tale tecnica viene usata anche per altre periferiche in cui ad un solo vettore delle interruzioni fanno capo più sorgenti d'interruzione. Maggiori dettagli possono essere trovati nella User Guide dell'MSP430 utilizzato. La spiegazione che ho appena dato probabilmente non è esauriente ma un esempio è prematuro. L'importante è sapere che in alcuni casi, oltre alla possibilità di usare l'istruzione if per controllare i flag d'interruzione, si può usare anche l'offset speciale dedicato alla periferica, da sommare al Program Counter.
MSP430: Low Power Mode
Come appena visto un programma rappresenta una successone di istruzioni che la CPU esegue una alla volta. In molte applicazioni le operazioni da compiere sono eseguite talmente rapidamente che la CPU può letteralmente rimanere fischiettando in attesa di altre operazioni da compiere. In questi casi, e soprattutto in applicazioni in cui il sistema è alimentato a batteria, si preferisce mandare la CPU in stato di sleep, ovvero in uno stato per limitare la corrente assorbita dalla CPU stessa. Gli MSP430 sono stati pensati sin dall'inizio con in mente applicazioni a batteria per cui sono ottimizzati per varie situazioni a basso consumo. Le varie modalità sono rispettivamente nominate LPM0, LPM1, LPM2, LPM3, LPM4 (alcuni MSP430 possiedono anche le modalità LPM3.5 e LPM4.5). Il passaggio da una modalità ad un'altra viene effettuato variando i bit CPUOFF, OSCOFF, SCG0, SCG1 presenti all'interno dello Status Register. In Figura 7 sono riportati i dettagli delle varie modalità (in base alla famiglia MSP430 il diagramma può differire). All'interno di ogni cerchio associato ad una modalità a bassa potenza è descritto lo stato dei vari Clock disponibili e se la CPU risulta attiva o meno.
Figura 7: Rappresentazione delle varie modalità a basso consumo e relative impostazioni.
Lo stato a bassa potenza più utilizzato è probabilmente il LPM3 visto che la CPU è disattiva ma è presente ACLK clock a bassa frequenza che può fornire il clock ad un Timer e permettere un risveglio periodico del Microcontrollore. Si ricorda che un sistema digitale consuma meno al diminuire della frequenza di clock. In applicazioni che devono durare 15-20 anni e prelevare l'energia da una semplice batteria a bottone non si può pensare di eseguire in maniera continua applicazioni con clock dell'ordine dei MHz!
Al verificarsi di un'interruzione, il risveglio del Microcontrollore è legato al fatto che durante la fase di riconoscimento di un Interrupt lo Status Register viene azzerato, il che equivale allo stato attivo. Lo Status Register con le informazioni dello stato a bassa potenza viene però salvato nello Stack, per cui al ritorno dall'ISR lo Status Register viene ripristinato e il microcontrollore torna automaticamente nello stato a bassa potenza presente prima dell'Interruzione. Durante l'ISR, si può anche cambiare il valore dello Status Register nello Stack al fine di alterare lo stato di bassa potenza al ritorno dall'ISR. Normalmente il passaggio e attivazione dei vari stati a bassa potenza viene fatto utilizzando funzioni dedicate senza doversi ricordare il valore dei bit associati ad ogni Low Power Mode.
Al fine di ridurre i consumi non basta solamente scegliere un Low Power Mode adeguato ma bisogna anche prendere le precauzioni giuste. In particolare tutti i pin non utilizzati devono avere uno stato logico fisso (essere posti come uscite o come ingressi con resistori di pull-up o pull-down). Altre precauzioni devono essere prese anche a livello software. Code Composer Studio, a partire dalla versione 5.2 possiede il plug-in ULP (Ultra Low Power Advisor) che permette di controllare il programma durante la fase di compilazione. Il plug-in controlla il programma in base a delle regole di buona programmazione e suggerisce i cambiamenti necessari al programma al fine da ridurre al minimo i consumi.
MSP430: Moduli e periferiche
Nonostante gli MSP430 siano microcontrollori ricchi di periferiche, per ragioni di prezzo, ovvero per permettere al progettista di ottimizzare i costi del proprio sistema, non tutti gli MSP430 hanno tutte le periferiche descritte nella User Guide. In particolare come visto in precedenza, alcune periferiche sono presenti solo in alcune famiglie MSP430, ma anche all'interno di una stessa famiglia sono presenti differenze. Nella famiglia MSP430F2xx è possibile trovare diverse periferiche base quali Timer, PWM, Moltiplicatore, ADC, DMA, SPI, I2C, UART come anche periferiche speciali DAC, ADC Sigma Delta da 16 bit, amplificatori operazionali, comparatori, sensore di temperatura, predisposizione per pulsanti capacitivi. Nelle famiglie più grosse è possibile trovare anche altre periferiche come USB, modulo per criptare i dati, transceiver radio e altro ancora.
La caratteristica di ogni modulo, i principali dei quali saranno trattati in capitoli dedicati, è quella di essere progettato per supportare applicazioni a bassa potenza. Oltre ad avere un semplice Enable per attivare e disattivare il modulo stesso (ovvero eliminare i consumi del modulo) sono presenti altre opzioni quali quella di permettere al modulo di essere coordinato da altri moduli o essere attivato disattivato in corrispondenza di segnali provenienti da Timer o altre periferiche. La caratteristica dei moduli interni agli MSP430 è quella di essere uguali anche tra le varie famiglie. In particolare un Timer_A è uguale in tutte le famiglie indipendentemente che sia integrato in un MSP430F2xx o in un MSP430F5xx. Questo permette di semplificare molto la portabilità di un codice da un microcontrollore ad un altro. Versioni diverse di Timer sono presenti quale normale evoluzione legata al miglioramento delle periferiche stesse. Versioni diverse del Timer, come anche di altri moduli, sono caratterizzate da una nuova lettera. In particolare sono presenti per esempio il Timer_B, Timer_C e Timer_D. Normalmente sebbene molti degli aspetti concettuali di ogni periferica rimangano invariati, una nuova lettera sul nome del modulo porta sempre dei miglioramenti e caratteristiche in più che rendono spesso il codice scritto per un modulo incompatibile con un altro a meno di aggiungere le impostazioni delle funzioni aggiuntive. Quando possibile le funzioni aggiuntive hanno valori di Default tali da permettere il funzionamento di un modulo come il proprio predecessore. In alcuni casi, nuove versioni di un modulo possono causare il cambio del nome di un determinato bit, pur mantenendo la stessa funzione. Per tale ragione è sempre necessario far riferimento alla User Guide qualora ci si accinga ad utilizzare un nuovo modulo o nuova versione di un modulo precedentemente utilizzato. Le User Guide possiedono all'inizio del capitolo dedicato a un modulo un pratico schema a blocchi che permette facilmente un confronto tra due moduli di versione diversa. Oltre allo schema a blocchi sono spesso riassunte anche le differenze del modulo con la versione precedente. Lo schema a blocchi include anche il nome dei bit interni ai vari registri SFR dedicati alla configurazione della periferica. Come si vedrà con i primi esempi di programma, il nome dei bit interni ai registri SFR sono definiti all'interno del file header associato al microcontrollore utilizzato.
Il nome è uguale al datasheet ma il file header contiene anche altri parametri che permettono di semplificare impostazioni associati a multiplexer interni, ovvero qualora siano presenti più bit associati ad una impostazione.
MSP430: Porte d´ingresso e uscita I/O
Sebbene le porte d’ingresso e uscita non facciano realmente parte dell’architettura di un microcontrollore, la loro importanza e continuo utilizzo la integrano con quest’ultima. Per tale ragione ho deciso di descrivere tale periferica in questo capitolo.
Gli MSP430 come anche molti altri microcontrollori, raggruppa gli I/O in porte di dimensione massima di 8 bit, ovvero un byte. Il nome delle porte è Px.y dove x rappresenta il numero della porta (parte da 1) mentre y il bit di interesse nel range 0-7 (fanno eccezione i pin che possono essere associati all'interfaccia JTAG, la cui nomenclatura è PJ.y ). Le porte di I/O hanno la caratteristica principale di poter essere configurate per singolo pin sia come ingresso sia come uscita (per mezzo del registro PxDIR), ma questa è la caratteristica principale per ogni microcontrollore. La loro funzione è inoltre spesso “multiplexata” con altre funzioni associate ad altre periferiche, per cui i vari bit devono essere propriamente impostati per un corretto funzionamento (vedremo a breve come). Nota importante da ricordare relativamente al registro PxDIR è che un bit impostato a 0, imposta il pin relativo come ingresso, mentre un pin impostato ad 1 lo imposta come uscita. Questa caratteristica porterà sicuramente qualche errore qualora siate abituati a programmare con i PIC, poiché in questi ultimi è utilizzato un approccio complementare (1= Input, 0= Output). Per limitare i disagi, durante la programmazione è bene usare le costanti definite all’interno dell'header file incluso durante la programmazione (vedremo presto degli esempi). Gli MSP430 hanno la caratteristica di avere un registro di ingresso e di uscita dedicato, nominati rispettivamente PxIN e PxOUT. Ogni pin degli MSP430 possiede un resistore di pull-up o pull-down che possono essere individualmente attivati per mezzo del registro PxREN. Oltre a queste funzioni la porta P1 e P2 possiedono un interrupt sui singoli pin che possono essere abilitati per mezzo del registro P1IE e P2IE (i nuovi MSP430 possiedono Interrupt anche su altre porte, per cui bisogna fare sempre riferimento al datasheet del microcontrollore utilizzato). Oltre alla possibilità di attivare le interruzioni è possibile anche scegliere il fronte sul quale deve avvenire l’interruzione stessa, questo viene fatto per mezzo del registro P1IES e P2IES. Il pin/bit che hanno generato l’interruzione sono memorizzati rispettivamente all’interno del registro P1IFG, P2IFG.
Sebbene abbia appena descritto tutte le funzioni base, associate alle porte d’ingresso e di uscita, è bene vedere qualche altro dettaglio trascurato e schematizzare il tutto in maniera da rendere le informazioni di più facile lettura.
PxDIR
Ogni bit del microcontrollore può essere impostato indifferentemente sia come ingresso che come uscita. Tale impostazione avviene per mezzo del registro PxDIR. Lo stato dei bit è il seguente:
Bit 1: Imposta il pin come uscita.
Bit 0: Imposta il pin come ingresso.
Faccio osservare un’altra volta che per chi viene dal mondo dei microcontrollori Microchip, lo stato dei bit è invertito. Questo vi porterà ad alcuni errori iniziali e rompicapi. Consiglio dunque di ricontrollare le impostazioni sulla direzione qualora abbiate un ingresso o uscita che non si comporta come vi aspettate.
PxIN
Ogni porta degli MSP430 possiede un registro d’ingresso, PxIN la cui lettura permette di conoscere lo stato della porta stessa. Lo stato dei bit è il seguente:
Bit 1: significa che il relativo pin è collegato a Vcc o livello logico compatibile con il livello alto.
Bit 0: significa che il relativo pin è collegato a GND o livello logico compatibile con livello basso.
Si noti che il registro PxIN è di sola lettura. Sebbene sia possibile scrivere in tale registro, durante la fase di scrittura si ha in generale un aumento della corrente consumata dal microcontrollore stesso. Inoltre la scrittura in tale registro non porta alla variazione delle uscite.
PxOUT
Oltre al registro per la lettura ogni porta possiede un registro per la scrittura dei dati, ovvero PxOUT. Lo stato dei bit è il seguente:
Bit 1: porre a livello alto un bit significa avere l’uscita collegata a Vcc.
Bit 0: porre a livello basso un bit significa avere l’uscita collegata a GND.
PxREN
Ogni pin della famiglia MSP430F2xx e successiva, ha la possibilità di avere un resistore di pull-up o pull-down qualora sia impostato come ingresso. Il resistore può essere abilitato per mezzo del registro PxREN. Lo stato dei bit è il seguente:
Bit 1: porre a livello alto un bit significa avere il resistore abilitato.
Bit 0: porre a livello basso un bit significa avere il resistore disabilitato.
Da questo si evince che per mezzo del registro PxREN viene solo abilitato il resistore senza però scegliere se sarà di tipo pull-up o pull-down. La scelta della tipologia avviene per mezzo della porta PxOUT. In particolare per quei bit che sono impostati come ingressi il valore PxOUT determina se il resistore sarà di pull-up o pull-down. Se il corrispondente bit del pin impostato come ingresso ha il valore PxOUT a livello alto, si ha un resistore di pull-up mentre se il valore di PxOUT è a livello basso si avrà un resistore di pull-down.
Qualora si abilitino i resistori di pull-up o pull-down bisogna fare attenzione a quando si scrive sulla porta PxOUT e non alterare il valore dei bit associati ai resistori. Se non si pone questa attenzione si rischia di alterare la tipologia del resistore ed eventualmente vedere il nostro pulsante ingresso non funzionare più.
P1IE, P2IE
La famiglia MSP430F2xx possiede sulla porta P1 e P2 delle linee d'interrupt che possono essere abilitate individualmente (alcune varianti della famiglia MSP430F5xx e MSP430FR5xx possiedono interrupt anche sulle altre porte). Lo stato dei bit è il seguente:
Bit 1: porre a livello alto un bit significa abilitare l’interruzione del pin.
Bit 0: porre a livello basso un bit significa disabilitare l’interruzione del pin.
P1IES, P2IES
Ogni interruzione oltre a poter essere abilitata ha la possibilità di avere selezionato il fronte sul quale deve essere abilitata. In particolare sia il fronte di salita che discesa possono essere selezionati. Lo stato dei bit è il seguente:
Bit 1: l’interrupt viene abilitato nella transizione da livello alto a livello basso.
Bit 0: l’interrupt viene abilitato nella transizione da livello basso a livello alto.
P1IFG, P2IFG
Una volta che l'Interrupt viene generato, il Program Counter viene caricato con il valore contenuto nell’Interrupt Vector associato alla porta che ha generato l'Interrupt. Le sorgenti per ogni porta sono differenti, visto che ogni bit può concorrere alla generazione dell'Interrupt. Per questa ragione il valore del bit che ha generato l’interruzione è memorizzato all’interno del registro P1IFG e P2IFG, ovvero il registro degli interrupt Flag. Il bit che viene letto deve essere azzerato manualmente visto che la sorgente delle interruzioni è multipla. Per Interrupt che non hanno sorgenti multiple, il Flag viene automaticamente azzerato. Lo stato dei bit è il seguente:
Bit 1: l'Interrupt è stato generato dal pin.
Bit 0: l'Interrupt non è stato generato dal pin.
PxSEL, PxSEL2
Quasi ogni pin oltre a poter essere gestito individualmente come semplice ingresso e uscita è spesso condiviso con altre funzioni speciali. Per esempio la porta seriale, SPI, I2C uscite PWM e via dicendo. Per selezionare quale funzione debba esser attiva è necessario impostare correttamente il registro PxSEL e PxSEL2 associati alla porta d’interesse. In Tabella 5 è riportato un esempio prelevato dal datasheet dell’MSP430F2553. Si osservi per esempio che il pin P1.0 può essere usato sia come standard I/O che per il clock del timer TA0, avere in uscita il clock ACLK oltre ad altre funzioni. Per selezionare le varie scelte è necessario impostare propriamente il bit P1DIR.1 e P1SEL.1 e P1SEL2.1 come riportato alla destra della Tabella.
Tabella 5: Esempio di informazioni relative all'impostazione della porta P1 dell'MSP430G2553.
Ricordo in ultimo che queste impostazioni sono relative all’MSP430 utilizzato per cui non si trovano nella User Guide ma nel datasheet del dispositivo utilizzato, in particolare nella sezione Application Information, nella quale si descrivono i vari pin.
Pin Oscillation
La famiglia MSP430F2xx possiede in alcune sue varianti l’opzione pin Oscillation (in particolare nella Value Line). Questa funzione permette di implementare facilmente sistemi con Cap Touch (capacitivi). La caratteristica dei pin che possiedono tale funzione è quella di offrire tutta la circuiteria necessaria per far oscillare un pin al cui ingresso è collegata una capacità, in generale formata semplicemente da una piazzola sul PCB di dimensioni opportune. In Figura 8 è riportato un dettaglio del modulo interno associato alla funzione Pin Oscillation. Si noti che il pin possiede la circuiteria di feedback positivo per far oscillare il sistema ma possiede anche il collegamento al Timer interno all'MSP430, utilizzato per il conteggio delle oscillazioni.
Figura 8: Circuiteria associata ai pin con opzione Pin Oscillation.
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] : User Guide MSP430x2xx
[3] : User Guide MSP430x5xx MSP430x6xx
[4] : Scarica Code Composer Studio
[5] : Wiki Page per il LaunchPad
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!