126
ESERCITAZIONI CON I MICROCONTROLLORI TI-MSP430

Guida MSP430

Embed Size (px)

DESCRIPTION

Esercitazioni con i microcontrollori TI MSP-430

Citation preview

  • ESERCITAZIONI CON I MICROCONTROLLORI

    TI-MSP430

  • 2

  • 3

    INDICE

    CAP.1 INTRODUZIONE AI MICROCONTROLLORI.....5

    Struttura di un Microcontrollore. Scelta del modello. Architettura dei C. Core. Periferiche. Programmare i microcontrollori. Linguaggio C. Istruzioni e modi di indirizzamento.

    CAP. 2 MICROCONTROLLORI TI-MSP430.....11

    Famiglie MSP430. Architettura e periferiche ultra low power. Architettura della CPU. Organizzazione della Memoria. MSP430: Circuiteria di Reset. Moduli e periferiche. Distribuzione del clock. Basic clock module.

    Oscillatori del clock. Oscillatori al quarzo. Unified clock system. Modalit low-power. Risveglio del microcontrollore. Le interruzioni. Interrupt handling procedure.

    CAP. 3 HARDWARE E SOFTWARE DI SVILUPPO27

    Software di sviluppo. Hardware di sviluppo. LaunchPad Kit. Code Composer Studio (CCS). Software per iniziare. Ambiente di Sviluppo Eclipse. Installare CCS. Avvio di CCS. Creare un Progetto con CCS. Compilare un Programma con CCS. Aprire un Progetto con CCS. Creare un File .HEX con CCS.

    CAP. 4 ELEMENTI DI PROGRAMMAZIONE.33

    Utilizzo ed impostazione delle porte I/O. Registri associati alle Porte di I/O. Controllo dei Bit associati alle Porte. Esempio: Accendere i LED. Analisi del Programma. Esempio: Uso dei Pulsanti. Filtro Anti-Spikes. Controllo di attuatori tramite le porte GPIO. Impostazione del clock. DCO. Timer. Timer_A della value line. Modalit di funzionamento del timer. Modalit Compare. Modalit Capture. Timer Output. Clock accurati. Oscillatori al quarzo. Auto-calibrazione del DCO. Impostazione delle modalit low power. Impostazione dei registri per modalit LPM. Esempio di utilizzo del clock e low power mode. Le interruzioni. Codifica degli interrupt. Applicazioni. Esempio 1: GPIO interrupt. Esempio 2: Timer_A. Esempio 3: Pulse Width Modulation. Esempio 4: Risveglio da pressione del tasto. Misura della Corrente. Esempio 5: Lampeggio di un LED per mezzo del Timer_A ed interruzioni. Esempio 6: Lampeggio di un LED per mezzo delle uscite del modulo Capture e Compare. Esempio 7: Lampeggio di un LED e controllo dellilluminazione con PWM. Esempio 8: Misura della Frequenza di un segnale digitale.

    CAP. 5 PERIFERICHE ANALOGICHE E DIGITALI...65

    Comparatori. Configurazione dei registri. Esempio 1: Confronto con tensione di riferimento. Esempio 2: Capacitance meter. Display LCD. Visualizzare un valore intero. Creazione di una libreria. Convertitori analogico digitali. Configurazione dei Registri. Memoria Flash. Tecnologie flash. Information memory. Programmare la flash memory. Flash memory controller

    CAP. 6 COMUNICAZIONE SERIALE75

    Introduzione. Comunicazione seriale asincrona. UART Protocollo di comunicazione. Accuratezza del Clock. UART Transmitter. UART Receiver. UART Transceiver. Modalit USCI/UART. Sistemi di comunicazione sincroni. Serial peripheral interface (SPI). Architettura della SPI. Modalit USI/SPI. Configurare i registri USI. SPI EEPROM 25XX080. Comandi dellMSP430. Inter-integrated Circuit Bus (I2C). Introduzione. IC in azione. Modalit USCI/IC. Modalit USI/I2C. EEPROM Microchip 24xx08.

  • 4

    APP. 1 RICHIAMI SUI SISTEMI DIGITALI99

    Codifica binaria. Altre codifiche. Rappresentazione numerica in virgola fissa. Rappresentazione numerica in virgola mobile. Logica combinatoria. Operazioni logiche. Algebra booleana. Elementi di memoria. Latch. Flip-Flop. Registri. Shift register. Memorie. Memorie elettroniche. Memorie di massa embedded

    APP. 2 LINGUAGGIO C..109

    Variabili, identificatori, tipi. Tipi di dati. Printf e scanf. La struttura di un programma C. Operatori. Operatori bitwise. Il controllo di flusso. Cicli. Array e puntatori. Le funzioni. Istruzione sizeof. Stringhe. I/O da files. Allocazione dinamica. Le strutture. La compilazione. Libreria matematica.

  • Introduzione ai Microcontrollori 1

    5

    CAP. 1

    INTRODUZIONE AI MICROCONTROLLORI I microcontrollori (C) si differenziano dai microprocessori perch hanno molte pi funzioni integrate sullo stesso chip, qualit che ne consente un uso esteso a molte applicazioni, sebbene una potenza di calcolo inferiore. In questo capitolo vengono forniti alcuni elementi sulla loro struttura e programmazione in linguaggio C, la cui conoscenza risulta pertanto un indispensabile presupposto. Dopo aver presentato gli aspetti generali dei C, si descriver una piattaforma di sviluppo particolare, lMSP430 Launchpad della Texas Instrument, adatta a chi si accosta per la prima volta al mondo dei C. STRUTTURA DI UN MICROCONTROLLORE SCELTA DEL MODELLO Il modello di C deve soddisfare le specifiche in termini di potenza computazionale. Deve essere in grado di gestire i segnali di input/output, processare i dati nel tempo stabilito, ed avere abbastanza memoria per contenere il programma e i dati. Il data processing pu essere realizzato via hw o sw, secondo un opportuno compromesso. Se si usano periferiche semplici, necessaria maggiore potenza computazionale dal core del C, mentre con periferiche pi sofisticate si possono eseguire operazioni che richiedono molto tempo, consentendo di usare un core meno potente. In genere si consiglia di scegliere un C di potenza superiore a quella strettamente necessaria, per consentire un aggiornamento dellapplicazione senza dover cambiare il dispositivo. I tool di sviluppo del software includono tutto quanto necessario per scrivere il programma, in linguaggio assembly o di alto livello (es. Basic, C, ecc), tradurlo in linguaggio macchina, e caricarlo sulla program memory dellapplicazione. Questi tool sono in grado di testare sia lhw che il sw attraverso un computer connesso ad uno strumento esterno, come un emulatore, analizzatore, programmatore PROM ecc., a seconda della fase di sviluppo. ARCHITETTURA DEI C Esiste una vasta gamma di C sul mercato, a seconda della potenza di calcolo, organizzazione interna, numero di input e output, tipo di periferiche. Comunque un C sempre un sistema completo su un unico chip, che include un core connesso a della memoria, e circondato da periferiche, secondo lo schema della figura.

    Architettura Von Neumann Architettura Harvard

  • Introduzione ai Microcontrollori 1

    6

    I vecchi C hanno unarchitettura di tipo Von Neumann, in cui un unico spazio di memoria viene utilizzato sia per la memoria programma che per la memoria dati (Figura sinistra). Questa architettura si contrappone allarchitettura di molti altri C, quali i PIC della Microchip, progettati con architettura Harvard, ovvero in cui memoria Programma e dati risiedono in due diverse sezioni accessibili rispettivamente da un bus dedicato (Figura destra). Per le istruzioni del programma esiste un bus specifico (dati e indirizzi) che connette core, memoria di programma, ROM o EEPROM, e un altro bus per i dati, che connette la memoria e le periferiche. Nei C presente sia la program memory, che pu essere scritta solo dal programmatore, che la memoria dati, che volatile e riscrivibile. Ci sono inoltre registri ausiliari come il PC, gli stack register ecc. Nei C, a differenza dei Processori, sono presenti dispositivi interni come memorie, timer, ADC, porte di I/O ecc., che non si trovano nei P, sebbene questi ultimi abbiano maggiori capacit di calcolo. Le periferiche qui mostrate sono solo le pi comuni che si possono trovare in un C, ma altre possono essere incluse per servizi particolari o protocolli di comunicazione, come, ad esempio, interfacce seriali, decoder RF, interfacce LCD.

    C package Il package di un C pu essere di tipo DIL (dual in-line), ovvero pin allineati su due linee parallele, che devono essere infilati nei buchi di una scheda e saldati dalla parte opposta, oppure di tipo SMD (surface-mounted device), ovvero pin di tipo piatto saldati su piazzole sulla stessa faccia della scheda. Per C con pi di 44 pin ci sono anche le tecniche di packaging PLCC (plastic lead chip-carrier) e QFP (quad flat-pack), un quadrato con pin sui lati. Per diminuire il numero di pin, molti pin possono essere configurati sia come input che output. Central Processing Unit (CPU) La CPU composta dal core, pi blocchi ausiliari come il generatore di clock, i circuiti di reset, ecc. Deve essere circondata da dispositivi come la memoria e le interfacce di input/output, integrate in un unico chip. I dati da processare, sebbene siano sotto forma di bit, possono rappresentare le pi svariate informazioni, come lo stato di uno switch, la tensione ad un terminale, una stringa di testo, ecc. Questi bit sono raggruppati in pacchetti, che vengono processati in parallelo. Oggi un C elabora almeno 8 bit in parallelo, ma ce ne sono da 16, 32 e 64 bit. La CPU controlla quasi tutti i componenti del sistema, eccetto gli interrupt o il direct memory access (DMA) dove intervengono alcune periferiche. Memoria Memorizza sia il programma, che dice alla CPU cosa fare, sia i dati, che sono memorizzati temporaneamente come risultati intermedi del calcolo, sia lo stato globale del sistema. Questo tipo di memoria volatile (RAM), e deve essere affiancata da una memoria permanente (EEPROM, FLASH),

  • Introduzione ai Microcontrollori 1

    7

    quando il dispositivo spento. Lindirizzamento delle due memorie pu essere gestito dallo stesso bus dati, o da un bus dedicato. Input/Output Le periferiche di I/O sono il punto di contatto del processore con il mondo esterno, che generalmente analogico, per cui i dati devono essere convertiti in forma digitale, e poi di nuovo in forma analogica dopo lelaborazione. Pertanto il throughput del sistema non dipende solo dalla potenza della CPU, ma anche dallefficienza delle periferiche. Interrupt Controller Gli interrupt sono il mezzo pi comune per alterare il normale flusso di programma, quando accade un evento inaspettato. Le richieste di interrupt possono essere gestite secondo una coda, eventualmente secondo delle priorit, o anche la modifica delle priorit. Bus Il bus e la serie di connessioni che connettono tutti i componenti del sistema e permettono ai dati di muoversi, nonch la distribuzione degli indirizzi e dei segnali di controllo. Clock generator Fornisce un flusso di segnali di clock calibrati, ad una frequenza precisa, che gestisce tutti i movimenti di dati nel bus, e i calcoli nella CPU. ricavato dalla divisione della frequenza di oscillazione (fornita da un oscillatore locale interno, o esterno al quarzo), che programmabile, per ottenere il compromesso migliore tra velocit e consumo di potenza, usando i bit contenuti nel Miscellaneous Register (MR). Reset generator Questo circuito si accorge quando il sistema viene acceso, e lo resetta in uno stato pre-definito, da cui parte lesecuzione del programma. CORE Le principali componenti del core sono: Unit Logico Aritmetica (ALU) Le principali operazioni dellALU sono Addizione e Sottrazione con riporto, Incremento e Decremento, Scorrimento (shift) a sinistra e destra a livello di bit, anche circolare, Operazioni logiche OR, AND, EX-OR, Complemento logico. Alcune eseguono ulteriori operazioni come Moltiplicazione, Divisione, ecc. Program counter (PC) un registro, cui connessa lALU, che contiene lindirizzo della successiva istruzione da eseguire. Viene inizializzato dal Reset generator, in modo da contenere lindirizzo della prima istruzione da eseguire. Instruction decoder Questo circuito prende listruzione dalla Program memory e la traduce nel suo significato, determinando le azioni del core. Le istruzioni sono delle seguenti categorie: istruzioni di data processing, che forniscono il tipo di operazione e lindirizzo degli operandi; istruzioni che modificano il flusso di programma, come jump e call. Stack pointer (SP) un registro che indirizza uno stack, ovvero un area di memoria in cui i dati inseriti in un certo ordine, possono essere recuperati in ordine opposto (memoria LIFO, Last In First Out). Serve a gestire interruzioni temporanee del flusso di programma, o attraverso due istruzioni, CALL, che memorizza lindirizzo della successiva istruzione, prima di saltare in un altro punto, e RETurn, che recupera questo indirizzo dallo stack, e salta allistruzione corrispondente, o attraverso un interrupt, in cui eventi (dati) esterni possono interrompere il flusso del programma, che poi verr recuperato. PERIFERICHE Le periferiche sono i punti dove il core in contatto con il mondo reale, rappresentato da segnali elettrici. Le pi comuni periferiche sono:

  • Introduzione ai Microcontrollori 1

    8

    Porte Input/Output parallele Servono per portare dati binary dentro e fuori il core. Una volta inizializzate, esse appaiono al core come una locazione di memoria, che pu essere letta o scritta. Essi consistono di porte o latch che consentono la comunicazione nei tempi che decide il programma. Alcuni costruttori forniscono pin di I/O configurabili. Questi pin possono essere configurati come Input o Output di altre periferiche, come Timers, interfacce da Seriale a Parallela, o input di un circuito di interrupt o di un ADC. Talvolta per necessario leggere lI/O bit per bit, piuttosto che interi byte. Inoltre alcuni segnali esterni di altre periferiche (timer, UART ecc.) usano alcuni bit delle porte parallele. In genere ogni bit pu essere configurato come input (con o senza resistenza di pull-up), o un output (open-drain o push-pull). Sono anche disponibili alcuni pin con driver per alte correnti. possibile selezionare lopzione attraverso registri associati a ciascuna porta. Sono memory-mapped e si chiamano Option Register (OR) e Data Direction Register (DDR). Alcuni pin configurati come input possono anche essere connessi ai circuiti esterni di interrupt, se il corrispondente bit dellOR settato. Ci permette che una richiesta di interrupt sia triggerata quando lo stato del pin diventa basso, si alza o si abbassa, a seconda di come configurato nel MR. Timer Programmabile un blocco complesso, basato su un contatore, che pu essere usato per contare impulsi, misurarne la durata o la frequenza, produrre impulsi di uscita precisamente sincronizzati, e molte altre applicazioni grazie alla sua flessibilit e precisione. Per esempio quando si misura un parametro fisico (temperatura, livello, pressione), invece di utilizzare un sensore che fornisce una tensione analogica, pi facile e accurato usarne uno che produce un segnale squadrato, con una frequenza che dipende dal valore del parametro, che pu essere calcolato con il timer. Questi segnali sono pi insensibili alle interferenze ed al rumore. Serial Peripheral Interface (SPI) basata su un registro a scorrimento (shift register), che pu operare una conversione da seriale a parallela e viceversa. Pu essere usata per interfacciare memorie esterne ad accesso seriale, che forniscono una memorizzazione non volatile a basso costo. Watchdog Timer un timer supplementare che pu essere usato per proteggere il sistema contro guasti dovuti al programma stesso (per esempio quando uneventualit non era stata prevista), o un guasto momentaneo dellalimentazione, o uninterferenza elettromagnetica. In entrambi i casi il programma va in crash ed il sistema non pi stabile. Questo pu avere gravi conseguenze in applicazioni come i sistemi automotive o quelli di sicurezza. Questo timer settato per una certa durata allaccensione. Il programma lo deve resettare periodicamente al suo valore iniziale, altrimenti il timer va in overflow, e questo evento procura un reset dellhardware che rimette il sistema nello stato iniziale di accensione. Non una protezione totale, poich alcune parti del programma possono andare in crash mentre la parte che deve resettare il clock sta ancora operando. Il WT controllato da un registro che include due bit di controllo e sei bit di time-setting. PROGRAMMARE I MICROCONTROLLORI Il progettista di un applicazione deve avere cura di selezionare correttamente i pin di input e output, poich alcuni pin devono essere connessi a speciali periferiche come ADC, Timer, ecc. il programma che configura i pin in modo che abbiano il corretto comportamento elettrico, e che elabora i dati per produrre unappropriata risposta ai segnali di ingresso. Poich la scheda progettata per avere meno elaborazione elettronica possibile, tutta lelaborazione compiuta dal software. Programmare il processore pertanto lattivit del progettista, che dovr scegliere gli strumenti adatti, perch il tempo di sviluppo del programma e del suo test possono variare molto a seconda della piattaforma e del linguaggio usato. Il linguaggio compreso dalla CPU il linguaggio macchina ovvero una sequenza di numeri binari. Il linguaggio Assembly leggermente pi evoluto nel senso che le istruzioni sono formate da insiemi di caratteri, ma c ancora una corrispondenza biunivoca tra istruzione Assembly e istruzione linguaggio macchina. I linguaggi pi evoluti (Fortran, Pascal, C,C++) sono compilati: cio ogni istruzione tradotta in

  • Introduzione ai Microcontrollori 1

    9

    una sequenza di istruzioni in linguaggio macchina. Un programma scritto in ANSI C portabile su qualsiasi computer dotato di compilatore C, non dipende cio dallarchitettura. Il linguaggio Assembly il linguaggio nativo di ogni C, necessita molta attenzione e molte linee di codice. Oggi si usano quasi esclusivamente linguaggi ad alto livello, ma, in quasi tutte le applicazioni, ci sono parti di codice che richiedono Assembly: nei linguaggi ad alto livello, alcune parti di inizializzazione del programma, come lorganizzazione della

    memoria (indirizzi della ROM, della RAM, e dei vettori di reset e interrupt), sono fornite in linguaggio Assembly, che deve essere adattato allapplicazione;

    alcune ISR che richiedono unelaborazione molto veloce; alcune funzioni ripetitive che vengono richiamate spesso sono in tal modo ottimizzate in termini di

    velocit. In questo caso il programmatore deve leggere con attenzione sul manuale del compilatore ad alto livello la modalit di fornire gli argomenti alla funzione e leggerne le uscite.

    Sviluppo del programma Consiste di tre fasi: 1. analisi il programmatore definisce ci che deve fare il programma, i dati di ingresso e uscita, la

    memorizzazione e gli algoritmi necessari; 2. scrittura del codice la traduzione del punto 1 nel linguaggio scelto, usando un text editor. Il risultato

    il codice sorgente ed alcuni file che pilotano gli strumenti di programmazione. Lassembler e il linker ne controllano la correttezza sintattica;

    3. debugging rimuove gli errori di programmazione relativi alla logica, alla coordinazione e al processamento dei dati. Gli strumenti usati sono il Simulatore e lEmulatore circuitale.

    Quando il programma perfettamente funzionante viene memorizzato in un EPROM, esterna o interna. Questo produce un prototipo che deve essere ancora testato prima di applicarlo. Assembler un programma che traduce un file di testo, che rappresenta il codice sorgente del programma, in un file binario che contiene una serie di istruzioni specifiche per il C. Loutput dellassembler essenzialmente il file object, che contiene i dati binari da processare ulteriormente, e non pu essere letto. Se lassembler riscontra degli errori produce un report di errore. Linker A meno che il codice sorgente che descrive lapplicazione sia molto piccolo, in genere conviene dividerlo in diversi file, e assemblarli separatamente, in modo che, dovendo effettuare delle modifiche, si cambia solo il file interessato, che viene ri-assemblato. Ogni file pu fare riferimento a variabili o righe di codice (label) di un altro file, per cui nel codice si usano, attributi di tipo EXTERNAL, per dichiarare che una label proviene da un altro codice sorgente, e PUBLIC per dichiarare che una label (o variabile) definita in questo file sar utilizzata da un altro file. Il Linker lo strumento che concatena uno dopo laltro tutti i file object in un unico file object, detto assoluto, e corregge gli indirizzi di memoria che si riferiscono ad oggetti la cui locazione di memoria stata definita o cambiata dalla concatenazione. Le due operazioni dellAssembler e del Linker devono essere eseguite da strumenti dello stesso produttore. Il file object risultante pu essere scaricato in un emulatore per testare il programma, o nella memoria EPROM di built-in del C, che contiene il codice dellapplicazione, usando uno strumento chiamato EPROM burner. Questo accetta file object assoluti prodotti dal Linker dello stesso sviluppatore, ma spesso anche file generati in un formato standard esadecimale, che consente di trasportare i file. Se il Linker non in grado di generarli occorre usare un convertitore di codice. Simulatori uno strumento per far girare un programma assoluto eseguibile. Come gli altri strumenti pu essere utilizzato sul computer del programmatore. Interpreta il codice macchina specifico del C, e fornisce i risultati sul display del computer, senza la necessit di utilizzare il C. Il programma pu essere eseguito istruzione per istruzione, potendo monitorare i cambiamenti dei valori memorizzati nei registri o nelle locazioni di memoria. Si possono inserire breakpoints nel programma, per interromperlo solo in quei punti in cui necessaria unanalisi pi accurata di tipo passo-passo. Una finestra mostra il codice sorgente, ed un cursore indica listruzione che viene eseguita. Altre finestre possono mostrare i contenuti dei registri e della memoria. Lutilizzatore pu anche modificare contenuti di memoria, per correggere errori di programma, e continuare lesecuzione con i valori corretti.

  • Introduzione ai Microcontrollori 1

    10

    Emulatori in-circuit Sono sofisticati strumenti hardware che si comportano come il C, e inoltre consentono allutilizzatore di avere, in ogni momento, tutte le informazioni sullo stato degli ingressi e delle uscite, e i contenuti di memoria. Lemulatore ha le stesse possibilit interattive del simulatore. La differenza che in questo caso, quando viene eseguito il programma, il C interagisce con il mondo reale, processando dati reali. La possibilit di operare un monitoraggio costante dei bus in tempo reale (real-time tracing), in termini di dati, indirizzi e segnali di controllo, consente allutilizzatore di eseguire il programma alla massima velocit, e poi dopo analizzare i dati registrati. LINGUAGGIO C oggi il linguaggio ad alto livello universalmente usato per programmare i C. Il vantaggio che ogni istruzione implica centinaia di istruzioni in linguaggio macchina, sebbene il linguaggio rimanga comunque vicino allhardware. un linguaggio strutturato, nel senso che il codice pu facilmente essere diviso in blocchi che diventano funzioni, o il corpo di istruzioni condizionali o cicliche. Inoltre garantisce una grandissima portabilit, sia da un computer allaltro, sia da un C allaltro. Ci consente, ad esempio, di sviluppare il programma su un computer, prima ancora di avere il C, farne il debug, e poi successivamente implementarlo su un C. Un difetto del linguaggio che prevede un unico spazio di memoria, che contiene il codice e i dati di I/O, sebbene nei C il codice risiede nella ROM, i dati nella RAM. Il C non in grado di specificare i rispettivi indirizzi di memoria. Inoltre il C non ha istruzioni che prevedano interrupt. Tuttavia le diverse implementazioni del linguaggio C per C prevedono soluzioni per ciascuno di questi casi, ma poich variano da unimplementazione allaltra, possono causare la non portabilit del codice. Lultimo argomento da considerare che solo utilizzando un ben strutturato e documentato linguaggio ad alto livello come il C, si possono creare applicazioni in grado di soddisfare i sempre pi stringenti requisiti di qualit, per esempio degli apparati sanitari. Compiling and debugging in C Il compilatore C lo strumento che traduce il codice sorgente in linguaggio macchina, trasformando un file testo in un file object. I diversi file object che compongono il programma, detti anche moduli, dopo essere stati compilati separatamente, vengono linkati per produrre un file object assoluto, come con lAssembler. Addirittura si possono scrivere alcuni moduli in C ed altri in Assembly e poi linkarli per produrre un file object assoluto. Un grande vantaggio nel fare il debug in C consiste nel fatto che ora possibile tracciare landamento anche di variabili di tipo complesso come strutture, array e stringhe, riducendo molto il tempo di debug. ISTRUZIONI E MODI DI INDIRIZZAMENTO Modi di indirizzamento Se lindirizzo del byte da leggere o scrivere noto nel momento in cui viene scritto il programma, viene usato il direct mode addressing, con due varianti: short per la pagina zero e long per tutta la memoria. Se lindirizzo del byte non noto quando si scrive il programma, significa che il dato ha una struttura complessa, ma poich il C elabora solo byte, necessario elaborare il dato un byte alla volta, per cui lindirizzo del byte calcolato durante lesecuzione del programma. Lindirizzo pu anche essere letto da un registro di indice (indexed addressing) o da una cella di memoria (indirect addressing). Le istruzioni che caricano costanti in un registro usano limmediate addressing, che significa che il dato viene caricato nella program memory subito dopo listruzione. Le istruzioni di salto spesso saltano ad un indirizzo che vicino allindirizzo dellistruzione. Per risparmiare memoria, se lindirizzo del salto non molto lontano (es. salto condizionato), si usa il relative addressing, contenuto in un byte, detto displacement. Lultima modalit, detta inherent addressing, significa che non necessario assegnare un indirizzo al dato contenuto nellistruzione (es. incremento). Codifica delle istruzioni Le istruzioni vengono codificate da byte memorizzati nella program memory. I byte sono 4: prefix byte (opzionale) operation code (opcode) e uno o due byte di indirizzo (opzionali).

  • Microcontrollori TI-MSP430 2

    11

    CAP. 2

    MICROCONTROLLORI TI-MSP430 Gli MSP430, nati nel 1990 da un gruppo di progettazione della TI hanno trovato spazio nelle applicazioni emergenti che richiedono bassi consumi. MSP430 sta per Mixed Signal Controller, ovvero paragonabile ad un DSP (Digital Signal Processor) ed ha unarchitettura a 16bit RISC (Reduced Instruction Set Controller) di tipo Von Neumann, in cui un unico spazio di memoria viene utilizzato sia per la memoria programma che per la memoria dati. Sotto certi aspetti larchitettura von-Neumann porta a essere meno efficienti in termini di accesso ed elaborazioni dati, vista la presenza di un solo bus. Tuttavia la semplicit di utilizzo tale che molti programmatori programmano gli MSP430 in assembly. A supporto della facilit di utilizzo, gli MSP430 hanno un set di solo 27 istruzioni. Larchitettura interna, grazie ai numerosi registri general purpose e al constant generator, permette al compilatore o ai programmatori abili di ottimizzare il codice al pari di architetture Harvard. Gli MSP430 integrano al loro interno molte periferiche analogiche, rendendoli unottima scelta per applicazioni con sensori. Tra le altre: ! ADC 10 bit (di tipo SAR) ! ADC 12 bit (di tipo SAR) ! ADC 16 bit (di tipo Sigma Delta, con ingressi single ended e differenziali) ! ADC 24 bit (di tipo Sigma Delta, con ingressi single ended e differenziali) ! Comparatori ! Amplificatore Operazionali ! Cap Touch (Sensori capacitivi) ! Scan Interface (periferica simile ai moduli per encoder) ! Transceiver RF (Modulo RX e TX per frequenze sub 1GHz) Tra le periferiche ed interfacce digitali di maggior interesse si trovano: ! Timers, Capture e Compare, PWM ! UART, I2C, SPI,USB ! Moltiplicatore 32x32 bit ! DMA (Direct Memory Access) ! Clock ortogonale ! Modulo Data Encription ! Interfaccia LCD LMSP430 nasce per applicazioni Mixed Signal, ovvero per quelle applicazioni che rappresentano il punto dincontro tra il mondo analogico e digitale. Gli MSP430 rappresentano il punto di partenza per applicazioni embedded destinate ad essere alimentati a batteria. Lessere stati pensati per applicazioni a bassi consumi permette di avere unintera famiglia dalla quale poter selezionare il C migliore, garantendo di poter ottimizzare la propria applicazione. La TI ha recentemente rilasciato una nuova famiglia di C MSP430 facente uso della memoria FRAM (Ferroelectric RAM) permettendo di abbassare ulteriormente i consumi in Active Mode (ovvero quando viene eseguito il codice) ed ampliare le applicazioni in cui poter utilizzare gli MSP430. FAMIGLIE MSP430 La famiglia MSP430 si divide in diverse sottofamiglie in particolare presente la MSP430F1xxx, MSP430F2xxx, MSP430G2xxx, MSP430C3xxx, MSP430F4xxx, MSP430F5xxx, MSP430F6xxx. Da queste famiglie principali ci sono alcune sottofamiglie specifiche per alcune applicazioni tra cui la FRAM. Diversamente da quanto si possa pensare, le sottofamiglie non sono nate in ordine crescente e ogni sottofamiglia non rappresenta esattamente un modo per rendere obsolete le altre. La prima famiglia ad

  • Microcontrollori TI-MSP430 2

    12

    essere commercializzata stata la famiglia MSP430C3xxx, caratterizzata dallavere una memoria OTP (One Time Programmable memory) e ROM programmate tramite maschere direttamente in fase di produzione del Chip. La C indica proprio il fatto che si ha a che fare con la memoria OTP o ROM. Nella stessa famiglia possibile trovare anche versioni cancellabili con i raggi ultravioletti, ovvero i famosi dispositivi con la finestrella (EPROM). Queste varianti furono pensate per favorire la fase di prototyping (la sigla di questi MSP430 PMS430E3xx, dove la prima P sta appunto per Protoyping e la E per EPROM). Sebbene i C con memoria OTP non siano presenti nelle altre versioni, la TI offre la possibilit di richiedere la versione ROM di qualunque C. Questo viene per fatto solo per grandi volumi, visto che la memoria ROM costa meno della memoria Flash. Per applicazioni che siano sensibili ai costi e in cui non sia richiesto aggiornare il Firmware, pu risultare una opzione vantaggiosa. In ambito hobbystico o in fase di sviluppo le memorie OTP, UV EPROM, rappresentano una pessima scelta, visti i tempi di sviluppo richiesti. Per tale ragione quando la memoria Flash divenne una soluzione economicamente vantaggiosa in termini di vantaggi/costi (fine anni 90), fu introdotta la famiglia MSP430F1xxx, dove la F indica appunto che si ha a che fare con una memoria Flash. Attualmente, (ottobre 2011) gli MSP430 supportano fino a 256KB di Flash, ma larchitettura della nuova famiglia extended MSP430X (indirizzamento a 20 bit piuttosto che a 16) supporta fino a 1MB di Flash. Dopo la famiglia MSP430F1xxx, stata introdotta la famiglia MSP430F2xxx pensata quale ottimizzazione della precedente famiglia. La famiglia F2xxx, sebbene non sostituisca la F1xxx, possiede diversi modelli 1:1 compatibili con la versione F1xxx ma ad un costo inferiore. Dopo la versione F2xxx stata introdotta la famiglia MS430F4xxx, che praticamente uguale alla famiglia F2xxx ma introduce il modulo LCD per pilotare direttamente i display LCD. Le famiglie F2xxx e F4xxx sono ottimizzate per applicazioni che devono operare in Sleep Mode gran parte del tempo, ovvero eseguire del codice solo per brevi tempi. La famiglia ha introdotto anche il primo modello di C con ADC Sigma-Delta a 16bit, recentemente introdotto anche nella famiglia MSP430AFE2xxx con una risoluzione a 24bit. Il convertitore Sigma-Delta, avendo ingressi sia single-ended che differenziali, si presta per una lettura diretta di sensori a ponte ovvero il cui segnale differenziale. La versione AFE, che sta per Analog Front End, oltre a possedere la versione ADC Sigma-Delta, possiede anche amplificatori operazionali a guadagno variabile, al fine di poter amplificare direttamente il segnale proveniente da un sensore (ovvero senza dover far uso di componenti esterni). In seguito stata introdotta la famiglia MSP430F5xxx e MSP430F6xxx; analogamente alle versioni F2xxx e F4xxx, la differenza tra la famiglia F5xxx e la famiglia F6xxx risiede nella presenza o meno del modulo LCD. Larchitettura F5xxx (uguale a F6xxx) stata ottimizzata per applicazioni che devono operare in Active Mode (ovvero che devono eseguire del codice) per tempi lunghi. Tale ottimizzazione stata fatta anche per la recente famiglia MSP43FR57xx, basata sullarchitettura F5xxx ma utilizzante la memoria FRAM piuttosto che la memoria Flash. Da circa un anno la Texas ha introdotto la Value Line, ovvero la famiglia MSP430G2xxx, caratterizzata dalla stessa architettura della famiglia F2xxx, basata anche essa su memoria flash, ma ottimizzata per avere costi comparabili con i C a 8 bit (la G sta per Gate). Il vantaggio della famiglia Value Line, almeno dal punto di vista hobbystico, il fatto che i vari modelli sono stati introdotti con un package DIL (Dual In Line Package) ovvero utilizzabili su normali breadboard, senza far stancare il nostro occhio o richiedere mani da chirurgo (le altre famiglie sfortunatamente non hanno il package DIL). Nel nostro percorso di studio verranno sviluppate applicazioni facendo prevalentemente uso della famiglia Value Line e del tool di sviluppo Launch Pad. Per applicazioni pi complesse si far uso delle Experimenter board. Oltre alle famiglie appena introdotte ci sono alcune varianti parzialmente descritte. Di rilievo oltre a quelle accennate la variante MSP430FW4xx ottimizzata per il Water metering (con periferica Scan Interface). La variante MSP430FE4xx con Front End analogico e ADC Sigma Delta. La variante MSP430FG4xx ottimizzata per Glucose Meter (la G della value Line). La variante MSP430C09x, caratterizzata dal poter funzionare con una sola batteria senza richiedere charge pump interni. Suo unico difetto che per poter funzionare a tensioni cosi basse la memoria flash sacrificata ed esiste solo la versione ROM. Si ricorda poi la variante CC430Fxxx, con modulo RF sub 1GHz. Il nome di questa variante discende dallaver integrato in un unico chip il C MSP430 con il transceiver CC1101 Sub 1GHz; la CC sta per ChipCon, ovvero la societ scandinava acquisita nel 2006 dalla TI.

  • Microcontrollori TI-MSP430 2

    13

    ARCHITETTURA E PERIFERICHE ULTRA LOW POWER In questa sezione si analizzer sinteticamente l'architettura degli MSP430 e le periferiche disponibili. La descrizione sincentrer prevalentemente sulla famiglia MSP430F2xx ed in particolare la Value Line. Ciononostante sintrodurranno anche le differenze e miglioramenti apportati nelle altre famiglie, in maniera da poter permettere al lettore unappropriata scelta dell'MSP430 che permette di risolvere le problematiche associate alla propria applicazione. Sebbene larchitettura delle varie famiglie MSP430 sia in pratica uguale, bene precisare che la parola architettura fa riferimento alla CPU. Le periferiche e i moduli che arricchiscono il C non sono necessariamente uguali come la CPU, per cui come visto in precedenza, sono presenti molte varianti di MSP430. Sebbene questo capitolo possa essere una valida guida all'architettura e periferiche degli MSP430, non deve essere considerata lunica fonte dinformazione, ma piuttosto un punto di partenza. Molti dettagli sui registri e le impostazioni sono volutamente tralasciati per non ripetere dettagli che saranno trattati nei capitoli dedicati alle varie periferiche. Come detto ogni famiglia MSP430 possiede una Family User Guide. La User Guide contiene la descrizione dell'architettura e introduce le varie periferiche e registri presenti nella famiglia stessa. Non tutte le periferiche introdotte in una User Guide sono effettivamente presenti in ogni C. Normalmente, per ragioni di prezzo, sono presenti diverse varianti di C che possono o meno avere determinate periferiche. Oltre alla User Guide, bisogna fare riferimento al datasheet del relativo C utilizzato. Nel datasheet sono presenti altre informazioni specifiche del dispositivo o variante della famiglia. In particolare la piedinatura, periferiche effettivamente disponibili, le caratteristiche elettriche e configurazioni dei pin associati alle periferiche. ARCHITETTURA DELLA CPU Gli MSP430 sono stati progettati Ultra Low Power sin dalla prima versione. Effettivamente, come vedremo in varie parti del corso, tutte le scelte sono guidate tenendo a mente la necessit di essere Ultra Low Power. Architettura e periferiche giocano un ruolo importante al fine di avere un sistema a basso consumo. Infatti ci che alla fine interessa non solo che la CPU consumi poco ma che lintero sistema abbia consumi contenuti. Nella prima parte del corso abbiamo brevemente introdotto larchitettura degli MSP430 accennando solamente che era di tipo RISC (Reduced Instruction Set Computer) von-Neumann a 16 bit. Maggiori dettagli possono essere visti nello schema a blocchi di un MSP430 riportato in Figura. E possibile vedere la presenza di un solo bus dindirizzo (MAB, Master Address Bus) e un Master Data Bus MDB. Entrambi sono a 16 bit ma il MDB ha alcune parti ad 8 bit per ospitare le periferiche ad 8 bit. Si noti che linterfaccia JTAG utilizzata per la programmazione e Debug del sistema ha accesso ad entrambi i bus, permettendo di effettuare Debug real Time senza interferire con l'esecuzione del programma.

    Figura 2: Schema a blocchi di un MSP430.

  • Microcontrollori TI-MSP430 2

    14

    Larchitettura di von-Neumann ha la caratteristica di avere una sola area di memoria dove risiedono sia il programma che i dati. Questo, se da un lato non rappresenta unottimizzazione da un punto di vista della manipolazione dei dati, come per larchitettura Harvard, rappresenta una soluzione ottimale per ridurre al minimo la complessit della CPU. Ridurre la complessit si traduce nellutilizzare meno circuiteria e questo permette, in generale, di ridurre i consumi. La scelta dellarchitettura von-Neumann discende anche da una ragione di semplicit concettuale che permette ai programmatori di utilizzare direttamente lAssembly senza eccessivo stress. A supporto di questa semplicit gli MSP430 possiedono solo 27 istruzioni, che permettono praticamente di essere imparate a memoria in poche ore di pratica. Sebbene i compilatori in C integrati in CCS e IAR siano ottimizzati per raggiungere un buona efficienza di compilazione, scrivere in Assembly permette in generale di raggiungere codici ottimizzati allestremo (presupponendo che il programmatore sia esperto). Ottimizzare significa spesso cercare di ottenere un codice di dimensioni ridotte o un codice che permetta di ridurre i consumi. Tuttavia, se non necessario, scrivere il codice in C consente una pi facile leggibilit del codice, e la possibilit di impostare il compilatore al fine di ottimizzare in termini di dimensioni del codice, velocit o consumi. Alcune volte le ragioni dello scrivere il codice in Assembly risiedono nel fatto che i compilatori Assembly sono gratuiti, mentre quelli per linguaggio ad alto livello sono a pagamento. Grazie ad ununica area di memoria stato inoltre possibile ottimizzare il trasferimento dati, rendendo larchitettura ortogonale, nel senso che i dati possono essere letti, scritti e trasferiti da varie parti di memoria per mezzo di una sola istruzione MOV. Le varie tipologie di indirizzamento (addressing modes) sono sette, ma si rimanda alla User Guide per maggior dettagli (scrivendo il codice in C, l'utilizzo delle varie modalit trasparente). Ogni istruzione, sebbene larchitettura degli MSP430 sia a 16 bit, pu essere utilizzata sia in operazioni a 16 bit che a 8 bit. Per la natura dellarchitettura MSP430, molti registri sono a 16 bit, ma in diverse applicazioni ritorna utile scrivere e leggere dati in formato ad 8 bit (in Assembly le istruzioni su byte sono caratterizzate dallavere un .B dopo listruzione stessa). Larchitettura MSP430, sebbene sia semplice a tal punto da permettere di essere programmata in Assembly, ottimizzata per permettere a compilatori di alto livello di realizzare codice ottimizzato. In particolare possiede 16 registri interni nominati da R0 a R15, che permettono un movimento rapido dei dati nello svolgimento di molte operazioni. I registri da R4 a R15 sono per utilizzo generico, mentre i registri R0R3 hanno una funzione speciale. R0 rappresenta il Program Counter (PC), ovvero il registro che punta all'indirizzo di memoria che contiene la prossima istruzione da eseguire. Sebbene larchitettura sia a 16 bit, la memoria in realt strutturata in byte, dunque ogni istruzione occupa due byte o meglio 2,4,6 a seconda della tipologia dell'istruzione stessa. Durante lesecuzione di un programma il PC viene automaticamente incrementato di 2, al fine di puntare listruzione successiva; in particolare il suo bit meno significativo sempre 0, ovvero allineato ad indirizzi pari. Il registro R1 rappresenta lo Stack Pointer (SP), ovvero il registro che tiene lindice sullo Stack in cui vengono memorizzati gli indirizzi di ritorno, dopo lesecuzione di una subroutine dinterrupt o semplice funzione (anche le istruzioni PUSH e POP fanno uso dello Stack). Diversamente dai PIC della Microchip, lo Stack non ha uno spazio limitato e predefinito, bens deve essere inizializzato allavvio di un programma. In Assembly questo obbligatorio, mentre in C viene fatto in automatico e posto alla fine della memoria RAM. Questo deriva dal fatto che lo SP viene decrementato ad ogni nuovo indirizzo da memorizzare nello Stack, e incrementato quando questo deve essere riscritto sul PC (non si considerano le istruzioni PUSH e POP che permettono di memorizzare nello Stack anche dei dati). Il registro R2 rappresenta lo Status Register (in figura). Questo registro di particolare importanza poich, oltre ad avere i bit classici di uno Status Register (Z, N, C), possiede anche i bit relativi alle modalit a bassa potenza, scelta che, come si vedr nel paragrafo dedicato alle modalit Ultra Low Power, permette di semplificare il passaggio da una modalit allaltra. Il registro R3 rappresenta il Constant Generator, ovvero generatore di costanti. Tale registro tanto semplice e banale quanto efficace. Ha il compito di generare le costanti 0,1,2,4,8. Se unistruzione contiene una di queste costanti, permette di ridurre la dimensione di questultima risparmiando il byte per memorizzare la stessa. Gli MSP430 sono a 16 bit, ed in particolare lAddress Bus (MAB, Master Address Bus) e il Data Bus (MDB, Master Data Bus) sono a 16 bit. Questo significa che possibile indirizzare uno spazio di memoria fino a 64KB (tra Flash e RAM). I primi MSP430 avevano una memoria Flash di pochi KB e solo in seguito si arrivati a 64KB per poi superarli. Gli MSP430 sin dallinizio sono nati senza paginazione della memoria, ovvero, diversamente dai PIC16, in cui per esempio necessario impostare il banco della memoria, gli MSP430 hanno un unico spazio di memoria, che semplifica molto la stesura dei programmi anche in Assembly. Quando la memoria degli MSP430 ha superato i 64KB indirizzabili dai 16bit, la soluzione stata

  • Microcontrollori TI-MSP430 2

    15

    quella di mantenere gli MSP430 senza paginazione della memoria; questa scelta ha richiesto notevoli modifiche alla CPU. Lestensione della memoria ha portato alla nascita dellarchitettura MSP430X (estesa) a 20 bit che permette un indirizzamento di memoria massima fino a 1MB. Tutti i registri interni (e quasi tutti i registri delle periferiche), ad eccezione dello Status Register, sono stati estesi da 16 a 20 bit, inoltre sono state introdotte nuove istruzioni al fine di poter gestire operazioni a 20 bit. I dettagli sulle nuove istruzioni disponibili si trovano allinterno della User Guide. Qualche nota merita il fatto che il PC, nel caso si verifichino delle interruzioni, viene salvato come in precedenza, ma i 4 bit in eccesso sono salvati allinterno dello Status Register, nei bit che nella vecchia architettura risultavano riservati. Questo permette di risparmiare loverhead derivante dal salvataggio dei 20 bit del PC, infatti lo Status Register viene salvato anche nell'architettura MSP430 Standard. Questa la ragione per cui lo Status Register rimasto a 16 bit, infatti in questo modo salvare il PC e lo SR non porta nessun overhead rispetto alla struttura tradizionale degli MSP430. Lo spezzettamento e ricomposizione del PC nello Stack trasparente al programmatore. Il PC nel caso di semplici chiamate di funzioni invece salvato facendo uso di 4 byte, ovvero senza utilizzare lo Status Register, che infatti non viene messo nello Stack.

    Alcune istruzioni con il formato X sono state ottimizzate al fine di ridurre l'overhead derivante dalla nuova architettura a 20 bit. Queste ottimizzazioni permettono di eseguire unapplicazione in maniera praticamente inalterata sia in CPU con architettura a 16 bit classica che con architettura a MSP430X (almeno da un punto di vista temporale). La nuova architettura talmente trasparente al programmatore che anche sul catalogo non sono riportati i dettagli sul tipo di CPU, MSP430 o MSP430X, ma vedendo la dimensione della memoria, si intuisce subito che larchitettura sicuramente MSP430X qualora la memoria Flash+RAM sia maggiore di 64KB. Per memoria inferiore a 64KB non detto, prendendo per esempio la nuova famiglia MSP430FR5739 con memoria FRAM, che, pur essendo a 16KB, possiede unarchitettura MSP430X. Infatti gli MSP430 con FRAM hanno unarchitettura ereditata dalla famiglia MSP430F5xxx. Dal lato della programmazione, utilizzare unarchitettura MSP430 o MSP430X non porta molti cambiamenti, ma effettivamente bisogna saperlo al fine di una corretta programmazione, qualora si voglia ottimizzare il codice o si voglia mantenere compatibilit tra un codice scritto (in Assembly) per MSP430 e MSP430X. In particolare i compilatori permettono di selezionare se utilizzare lo spazio di memoria ridotto o esteso. Se si fa uso del modello ridotto, compatibile sia con gli MSP430 che MSP430X, possibile fare salti di memoria in un range di 64KB, per cui bisogna fare attenzione che tutte le funzioni di gestione delle interruzioni risiedano nella parte bassa della memoria Flash, come anche puntatori o variabili di grosse dimensioni. Nel caso degli MSP430 della Value Line, utilizzati nella scheda LaunchPad, non ci sono problemi o domande da porsi visto che larchitettura di tipo MSP430 e non estesa. Lutilizzo o meno di unarchitettura MSP430X si sente di pi qualora si stia scrivendo il codice in Assembly. Infatti in questo caso necessario specificare il tipo di chiamata alle

  • Microcontrollori TI-MSP430 2

    16

    funzioni, estesa o non estesa, come anche utilizzare il formato corretto con o senza X. Qualora si faccia uso di unarchitettura MSP430X, ma si utilizzano solo istruzioni Assembly dellarchitettura MSP430, il programma pi facilmente trasferibile, in quanto compatibile, allinterno della famiglia MSP430 e MSP430X. Maggiori dettagli sullarchitettura MSP430X possono essere trovati nella User Guide della famiglia MSP430F5xx. ORGANIZZAZIONE DELLA MEMORIA Dal primo sguardo sullarchitettura abbiamo visto che gli MSP430 possiedono una sola area di memoria e un solo bus dindirizzamento, per cui larchitettura di tipo di von-Neumann. La memoria interna pur avendo un'unica area dindirizzamento suddivisa in varie parti. La divisione differente a seconda del C, ma a grandi linee possibile mostrare le principali varianti (per maggiori dettagli far sempre riferimento al datasheet del C utilizzato). Lorganizzazione pi semplice della memoria quella presente nella Value Line. In particolare lo spazio di memoria diviso in area Flash e RAM. Osservando la Tabella 1 possibile vedere lo spazio dedicato allInterrupt Vector e alla Program Memory. Tale memoria risiede nella Flash. In seguito presente la memoria nominata Information Memory, che pur essendo di tipo Flash ha qualche peculiarit. La Program Memory divisa infatti in pagine da 512 byte, mentre la Information Memory in pagine da 64 byte. Questo stato fatto per semplificare il processo di scrittura in tale area di memoria. In particolare potrebbe essere utilizzata come memoria anche una EEPROM, considerando per che per cancellare una locazione di memoria necessario cancellare una pagina intera. Le pagine dellInformation Memory sono nominate A,B,C e D. La pagina A ha la caratteristica di possedere i valori di calibrazione che sono salvati allinterno dellMSP430 (i valori presenti dipendono dal C). Di seguito presente la RAM, di dimensioni variabili a seconda della variante del C. In ultimo sono presenti i registri associati alle periferiche interne ovvero gli SFR (Special Function Registers). Maggiori dettagli sono riportati in Tabella 1.

    Tab. 1 Organizzazione della memoria negli MSP430G2xx1.

    Lorganizzazione della memoria leggermente diversa per dispositivi non della Value Line e con memoria inferiore a 64KB (in Tabella 2 riportato un esempio). Si noti in particolare la presenza della Boot Memory. Questa area di memoria di tipo ROM, ovvero scritta direttamente da TI in fase di produzione dellMSP430. Questarea possiede il boot loader anche noto come bootstrap loader. La versione standard fa uso della porta seriale per poter programmare il dispositivo senza far uso del programmatore. Varianti della famiglia MSP430F5xx e MSP430F6xx con modulo USB, possiedono il boot loader USB e larea definita Boot Memory, che di tipo Flash.

    Tab. 2 Organizzazione della memoria negli MSP430F23x0.

    Unultima organizzazione della memoria che bene tener conto quella dei dispositivi che hanno unarea di memoria maggiore di 64KB, ovvero con architettura MSP430X (alcuni dettagli sono riportati in Tabella 3).

  • Microcontrollori TI-MSP430 2

    17

    La differenza maggiore, oltre alla diversa organizzazione degli spazi, legata alle nuove dimensioni, la presenza della memoria RAM mirrored, ovvero riportata a specchio. La sua presenza serve solo per compatibilit con larchitettura MSP430 e il desiderio di non avere la memoria RAM spezzettata in vari spazi della memoria. Unarchitettura come quella degli MSP430, sebbene larea Flash e RAM sia distinta, permette facilmente di eseguire il programma sia in Flash che in RAM. Normalmente i programmi che vengono eseguiti in RAM consumano molta meno potenza. Grazie ai soli 100nA necessari per mantenere i dati in memoria RAM, trovare applicazioni in RAM, ovvero che partano dalla memoria Flash e vengano poi caricati in RAM, non inusuale qualora si faccia uso degli MSP430. In ultimo, ma non meno importante, bene ricordare che i nuovi MSP430 con FRAM rivoluzionano totalmente la filosofia di organizzazione della memoria. Infatti la memoria FRAM pu essere usata sia in veste di memoria Flash, RAM ed EEPROM, ed possibile partizionarla a piacimento come si farebbe con un hard disk. Gli MSP430FR5xx possiedono comunque memoria RAM aggiuntiva, ma il compilatore CCS, ogni qual volta venga creata una variabile, la alloca in FRAM e non in RAM.

    Tab. 3 Organizzazione della memoria negli MSP430F2x1x.

    CIRCUITERIA DI RESET Ogni C possiede una circuiteria di Reset, ovvero quella parte del sistema che permette di inizializzare il C 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 C. Gli MSP430, come praticamente tutti i C, 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 C 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:

  • Microcontrollori TI-MSP430 2

    18

    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 PC 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. 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). MODULI E PERIFERICHE Nonostante gli MSP430 siano C 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 (Pulse Width Modulation), Moltiplicatore, ADC, DMA, SPI, I2C, UART, come anche periferiche speciali DAC, ADC Sigma Delta a 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 C 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 C 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.

  • Microcontrollori TI-MSP430 2

    19

    DISTRIBUZIONE DEL CLOCK Ogni C, per quanto semplice possa essere, richiede un clock al fine di permettere alla CPU di eseguire ogni qualsivoglia operazione. Nonostante molte delle nozioni relative all'architettura facciano riferimento agli MSP430, le problematiche risolte permettono di comprendere anche altri C e relativi moduli di distribuzione del clock. Il paragrafo spiegher in maggior dettaglio il modulo Basic Clock usato nella famiglia MSP430F2xx e nella Value Line, ma introdurr anche l'Unified Clock System (UCS), usato nella famiglia MSP430F5xx, MSP430F6xx e nella nuova famiglia basata su FRAM. In ultimo, verranno spiegate le modalit Low Power, quale forma di armonizzazione del clock e la sua distribuzione. 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 (BCS). Sebbene il clock non rappresenti altro che un 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. Il suo schema a blocchi rappresentato in figura. subito possibile notare che sono presenti pi sorgenti per generare il Clock, come anche pi uscite.

    Le uscite del modulo rappresentano i 3 clock, che sono rispettivamente ACLK (Auxiliary Clock), MCLK (Master Clock), SMCLK (Sub Master Clock). La CPU utilizza MCLK, mentre le periferiche possono utilizzare a seconda delle esigenze sia ACLK che SMCLK. L'ACLK viene normalmente utilizzato per applicazioni a bassa frequenza a 32KHz, mentre l'SMCLK viene utilizzato per le periferiche a media frequenza. La caratteristica di MCLK e SMCLK di poter operare al massimo della frequenza di clock, che a seconda dei modelli pu variare da 8MHz a 25MHz. Normalmente ogni periferica ha la flessibilit di utilizzare una qualunque delle uscite appena citate, al fine di poter compiere la propria mansione. Questo permette di ottimizzare le risorse energetiche, disattivando un clock e mantenendone attivi altri, per il funzionamento delle periferiche dinteresse, permettendo ad ogni periferica di operare in diverse modalit a basso consumo.

  • Microcontrollori TI-MSP430 2

    20

    Le tre uscite del clock possono essere associate 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 per 2, 4, 8. Alte frequenze di clock si traducono in un elevato MIPS (Milioni di istruzioni per secondo), ma il modo con cui questo avviene dipende molto dallarchitettura. Gli MSP430 possiedono un ciclo istruzione pari alla frequenza di clock, quindi MIPS e Frequenza di clock coincidono. Strutture come PIC18 hanno invece il famoso numero 4 che divide il clock, ovvero sono necessari 4 cicli di clock per compiere una istruzione. Questo implica che i MIPS attuali di un PIC18 sono 4 volte inferiori alla frequenza di clock. I PIC24 e i dsPIC possiedono unaltra architettura, in particolare hanno bisogno di 2 cicli di clock per istruzione. Oltre a quanto appena visto necessario anche considerare il numero di cicli istruzioni necessari per compiere una determinata operazione. Infatti, a seconda delle operazioni da compiere, sono necessari un numero di cicli istruzioni diversi. Dettagli sul numero di cicli/istruzione sono riportati nella User Guide della famiglia utilizzata. A solo scopo di completezza, si fa notare che le fasi tipiche per eseguire un'istruzione, ovvero fase di Fetch (caricamento), Decode (decodifica) ed Execute (esecuzione), non sono identificabili qualora si abbia l'esecuzione di un'istruzione in un solo ciclo di clock. Ciononostante, sebbene il tutto avvenga via hardware, concettualmente le tre fasi esistono ancora seppur non distinguibili temporalmente. OSCILLATORI DEL CLOCK Tra le possibili sorgenti di clock vi sono il VLO (Very low power / Low frequency Oscillator) e il DCO (Digital Controlled Oscillator), entrambe interne al C. Queste permettono di evitare l'utilizzo di un quarzo esterno e ridurre la lista della spesa (Bill of Material, BOM). 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 il notevole vantaggio di essere a basso consumo, perch in generale lavorare a frequenze pi basse permette di ridurre i consumi. 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 deve sorprendere che il VLO vari la propria frequenza al variare della temperatura, con una tolleranza dello 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 misurare 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 occorre far sempre riferimento al datasheet dell'MSP430 utilizzato). Il DCO, diversamente dal VLO, oltre 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. Tra le sue caratteristiche principali vi quella di attivarsi in pochi s, particolare importante in applicazioni Ultra Low Power, dove bisogna attivarsi rapidamente ed andare in Sleep Mode altrettanto rapidamente. Il DCO inoltre collegato ad un modulatore che permette di alternare la frequenza del DCO tra due step n e n+1. Per esempio, supponendo di impostare il DCO alla frequenza di 1MHz e il passo successivo sia ipoteticamente a 1.1MHz, il modulatore permette di variare il clock da 1MHz a 1.1MHz ogni x periodi impostabili nel registro MODx. Questa variazione del clock crea un jitter voluto, che in alcuni casi potrebbe anche non essere desiderato, ma permette di limitare le radiazioni elettromagnetiche generate dal clock della CPU. Infatti, lenergia irradiata dovuta al clock interno si distribuisce su uno spettro pi ampio, riducendo il picco massimo, in altre parole semplificando eventuali certificazioni Europee (CE) o Americane (FCC). Un'altra caratteristica importante del DCO quella di entrare in funzione in circa 1.5us, se il C 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.

  • Microcontrollori TI-MSP430 2

    21

    Il DCO possiede alcuni valori calibrati a determinate frequenze, che, se caricate negli appositi registri di controllo, permettono di impostare il DCO ad un valore noto di frequenza con una tolleranza di pochi centesimi percentuale. Il valore di frequenza calibrato pu essere trovato allinterno dellheader file associato al C utilizzato. Gli MSP430 della serie Value Line possiedono solo il valore 1MHz quale valore calibrato. Gli MSP430 della famiglia MSP430F4xx possiedono unarchitettura pi complessa per il clock ed in particolare possiedono un FLL (Frequency Lock Loop), molto simile ad un PLL (Phase Lock Loop), ma il cui controllo avviene sulla frequenza e non sulla fase. Questo permette di semplificare larchitettura di controllo ottenendo consumi ridotti. OSCILLATORI AL QUARZO Qualora queste caratteristiche non siano sufficienti possibile utilizzare un quarzo esterno (crystal oscillator). A seconda del modello dell'MSP430 possibile avere uno o due buffer interni per quarzi esterni, XT1 e XT2. La Value Line possiede attualmente solamente XT1 e con l'opzione LF (Low Frequency, LFXT1). La frequenza dipende dalle applicazioni, ma spesso conveniente usare una frequenza binaria 215=32768 Hz (0x8000), spesso indicata come 32 kHz (massima frequenza 50KHz). La famiglia MSP430F2xx ha in generale XT1 con opzione sia a bassa che ad alta frequenza, potendo supportare quarzi 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, pagando il prezzo di usare componenti esterni e un aumento della corrente di sistema. Utilizzare cristalli esterni richiede in generale un maggior tempo di 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 alcune capacit interne che possono essere abilitate al fine di evitare l'utilizzo di ulteriori condensatori esterni (valori disponibili: 1pf, 6pf, 10pf, 12pf), attraverso le costanti XCAP_x. Quando si abilitano queste capacit bisogna tener presente che gli stessi pin del C rappresentano delle capacit di carico in parallelo, che dunque 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.

    Massima frequenza di clock e minima tensione operativa.

  • Microcontrollori TI-MSP430 2

    22

    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 nella memoria Flash, necessario che operi ad una tensione minima di 2.2V. Questi limiti, che affliggono molti C basati su memoria Flash, non sono presenti nella famiglia MSP430 Wolverine, basata su FRAM (Ferro-Electric RAM). UNIFIED CLOCK SYSTEM Le famiglie MSP430F5xx e MSP430F6xx con memoria FRAM possiedono il modulo Unified Clock System (UCS). La caratteristica di questa architettura, pi recente, quella di essere pi flessibile, infatti ogni uscita del clock pu essere impostata su un qualunque clock interno o esterno (per tale ragione, come per gli indirizzamenti interni, si parla anche di struttura ortogonale, ovvero tutte le combinazioni sono possibili). 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 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 ci 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. 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 rappresenta 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 vedono consumi apparentemente eccessivi in un determinato stato Low Power. Se infatti il C 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 Management Module (PMM), che, abbinate al modulo UCS, permettono una notevole flessibilit delle varie modalit Low Power (le modalit LPMx.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. MODALIT LOW-POWER Un programma rappresenta una successione di istruzioni, che la CPU esegue una alla volta. In molte applicazioni le operazioni da compiere sono eseguite talmente rapidamente che la CPU pu rimanere in

  • Microcontrollori TI-MSP430 2

    23

    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 che limita la corrente assorbita dalla CPU stessa. Gli MSP430 sono stati concepiti fin dall'inizio per 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). 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 C. In particolare questo significa che possibile avere un cristallo a 32KHz o il VLO come sorgente. 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. 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 quelle in cui non si vogliono inizializzare le periferiche ad ogni risveglio. I C della Microchip scendono rispetto a queste correnti a circa 20nA, ma sacrificano i dati in RAM (a meno di non utilizzare altre modalit Low Power a maggior consumo). Per ovviare a questo problema i C 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 C 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 C Microchip con tecnologia XLP. 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 in 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. RISVEGLIO DEL MICROCONTROLLORE Il C entrato in una modalit Low Power si risveglia 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. Al verificarsi di un'interruzione, il risveglio del C 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 C torna automaticamente nello stato a bassa potenza presente prima dell'interrupt. 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. 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. 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 C in stato di sleep al fine di ridurre la corrente consumata in stato attivo (Active Mode), anche altrettanto importante che il C si risvegli rapidamente. Questo si traduce nell'avere un clock stabile in tempi rapidi, al fine di

  • Microcontrollori TI-MSP430 2

    24

    permettere un rapido utilizzo delle periferiche di sistema. Un risveglio rapido permette anche di risparmiare energia. A seconda della modalit Low Power selezionata, i tempi di risveglio possono oscillare da 1s 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). 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. CCS, 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. LE INTERRUZIONI Oltre alle istruzioni condizionali e ai loop, un programma pu avere il proprio flusso alterato a causa delle interruzioni, ovvero eventi esterni o interni al C stesso, che richiedono particolare attenzione e l'esecuzione di un programma o funzione speciale, nominata Interrupt Service Routine (ISR). L'ISR ha il compito di gestire l'interruzione, ma deve essere scritta in maniera pi breve possibile. Infatti, quando in esecuzione un ISR, vengono disattivate le interruzioni, per cui non possono essere gestiti altri eventi. Essere veloci dunque di importanza fondamentale, al fine di garantire una rapida risposta ad eventi esterni. Il segnale di Reset precedentemente spiegato rappresenta uninterruzione, infatti un programma in esecuzione, qualora venga generato un Reset, viene interrotto e inizia il programma a partire dal Reset Vector. Al fine di permettere l'esecuzione del codice relativo allISR, qualora il C sia in sleep mode, qualunque modalit Ultra Low Power viene lasciata per andare in Active Mode (AM). Sul datasheet del dispositivo MSP430 usato si trova una Interrupt Vector Table, salvata in una zona prefissata della memoria, che contiene gli Interrupt Vector corrispondenti ad ogni interrupt, ovvero gli indirizzi di memoria flash nel quale vengono memorizzati gli indirizzi di memoria in cui inizia l'ISR, al quale viene posizionato il PC al verificarsi della corrispondente interruzione. 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 C utilizzato. In generale, facendo uso dei nomi definiti all'interno degli Header File, non ci si deve preoccupare molto della posizione dei Vettori delle interruzioni a meno di non voler sapere il loro livello di priorit. In Figura riportato un dettaglio del vettore delle interruzioni dell'MSP430G2553. Si pu notare come le porte P1 e P2 abbiano due vettori diversi, ma i singoli pin fanno riferimento ad uno stesso vettore. Come si vedr pi avanti, il Timer A ha due vettori delle interruzioni, uno associato al Capture Compare Module 0, e il secondo al resto dei Capture Compare Module (in questo caso solo 1). Questo discende da alcune peculiarit del modulo CC0, i cui dettagli verranno discussi nel capitolo dedicato ai timer. Qualora l'interrupt richieda calcoli lunghi, preferibile impostare un Flag all'interno dell'ISR, ed eseguire una semplice macchina a stati all'interno del main. Sebbene le interruzioni siano disabilitate durante l'esecuzione di un ISR, questo non vuol dire che altri eventi d'interruzione siano persi, ma soltanto che non potranno essere serviti immediatamente. Infatti ad ogni sorgente d'interruzione associato un Flag d'interruzione, che viene attivato anche se le interruzioni sono disattivate. Una volta che le interruzioni sono riattivate, un Flag d'interruzione posto ad 1 fa generare una nuova interruzione. Per tale ragione

  • Microcontrollori TI-MSP430 2

    25

    importante, alla fine dell'esecuzione di un ISR, resettare il Flag delle interruzioni, al fine di evitare che vengano eseguite in maniera continua nuove interruzioni a causa di un Flag che rimane sempre ad 1. Se due interrupt sono generati o attivi in contemporanea, quello a pi alta priorit viene servito prima. Sebbene si possa pensare che due segnali difficilmente possano arrivare in contemporanea, la possibilit che due Flag delle interruzioni siano attivi in contemporanea non remota. Basti pensare al fatto che durante l'esecuzione di un ISR si possono verificare altre interruzioni in tempi diversi. All'uscita dall'ISR si verrebbero ad avere pi Flag attivi in contemporanea. Indipendentemente dal tempo di arrivo, viene servita l'interruzione a pi alta priorit.

    MSP430G2553 Interrupt Vector Table.

    Gli interrupt interni agli MSP430, come per molti C, 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, 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. 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 invece 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 un bit di abilitazione delle interruzioni e un Flag di avvenuta interruzione. Alcune periferiche, pur avendo un solo Interrupt Vector associato a pi eventi, possiedono una Tabella Secondaria delle Interruzioni, che permette di riconoscere facilmente la sorgente che ha causato l'interruzione. La presenza o meno di questa tabella deve essere verificata nel datasheet del dispositivo utilizzato. INTERRUPT HANDLING PROCEDURE Il riconoscimento di un'interruzione preventivamente abilitata, comporta le seguenti operazioni: Se linterrupt di una periferica abilitato, un segnale appropriato setta il Flag di interrupt in uno dei

    registri della periferica.

  • Microcontrollori TI-MSP430 2

    26

    Se il processore permette gli interrupt, la presenza di un Flag di interrupt da una periferica setta un Flag di interrupt del processore.

    Il processore termina l'esecuzione dell'istruzione corrente. Il processore salva nello stack (pushing onto the stack) sia il PC, che punta alla prossima istruzione, che il

    suo stato attuale, cio lo Status Register. L'interrupt con maggiore priorit viene eseguito, se pi interrupt sono stati generati in contemporanea

    (vedere lista priorit sul datasheet). L'interrupt Flag viene resettato automaticamente, se la periferica ha un unico vettore delle interruzioni,

    altrimenti va resettato via software. Lo Status Register viene resettato (cleared), cosa che disabilita ulteriori interrupt durante lesecuzione

    dellISR (disabilita GIE). Solo le interruzioni mascherabili sono disabilitate dal reset di SR, mentre quelle non mascherabili (come il Reset) sono ancora possibili. Inoltre costringe il processore a tornare nello stato attivo, se era in uno stato LPM.

    Lindirizzo dellinterrupt vector (prima istruzione dellISR) copiato nel PC. 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). Una volta eseguita lISR 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). Le operazioni compiute durante il ritorno dall'interrupt sono: Ripristino dello Status Register e del PC, recuperandoli dallo stack (popping). 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. 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.

  • Hardware e Software di sviluppo 3

    27

    CAP. 3

    HARDWARE E SOFTWARE DI SVILUPPO SOFTWARE DI SVILUPPO I C rappresentano una soluzione tecnica che richiede lo sviluppo sia di hardware che di software. In questo paragrafo descriveremo le varie soluzioni che sono disponibili al fine di sviluppare software. Gli MSP430, come gi accennato, sono stati progettati con numerosi registri interni general purpose, al fine di favorire possibili ottimizzazioni da parte del compilatore. Si capisce quindi che, sebbene il C sia facilmente programmabile anche in Assembly, ottimizzato per linguaggi ad alto livello come il C. Tra gli ambienti di sviluppo principali bene ricordare Code Composer Studio (CCS), rilasciato dalla stessa TI e IAR rilasciato dalla IAR Systems. CCS basato sullIDE Eclipse. Dalla versione 5 CCS supporta anche il sistema operativo Linux. CCS integra un completo ambiente di sviluppo e permette di programmare e fare Debug di applicazioni scritte sia in Assembly che in C. Non