Programmare i chip della Cypress con l’ambiente di sviluppo PSoC Express è davvero semplice ed intuitivo. Non è richiesta nessuna conoscenza di programmazione assembly o C e neppure leggere pagine e pagine di datasheet per la scelta del giusto componente. Ecco come iniziare a muovere i “primi passi” con PSoC Express.
Il PSoC è un sistema programmabile, prodotto da Cypress, dotato di un micro ad 8bit ed una serie di blocchi analogici e digitali completamente programmabili a livello funzionale. L’architettura interna di questo chip è stata ampiamente descritta nel numero 12 di Firmware. Si analizzerà, ora, uno degli ambienti di sviluppo messo a disposizione da Cypress: il PSoC Express. Il file d’installazione è prelevabile gratuitamente dal sito del produttore. Si tratta di uno strumento per la progettazione ad alto livello. Con PSoC Express si ha il controllo di tutte le periferiche onchip, della configurazione dei blocchi, della gestione degli interrupt e molto ancora, senza la necessità di scrivere una sola linea di codice assembly o C, perfino senza aver mai letto il data sheet del componente. L’ambiente di sviluppo PSoC Express contiene tre finestre principali: Design, Simulation e BOM/Schematic. Esse sono selezionabili attraverso i tre tab mostrati in Figura 1.
I menu e i comandi consentono di eseguire varie operazioni, comprese creazione di un nuovo progetto oppure apertura di uno preesistente, salvataggio, chiusura, build e programmazione del progetto stesso. Molte di queste funzioni sono accessibili a prescinde dell’area in cui si sta lavorando. Di seguito sarà data una descrizione delle diverse sezioni, delle opzioni disponibili ed infine si descriveranno gli step da seguire per la creazione di un vero progetto. Questi possono riassumersi in:
- Progettazione – Consiste nella scelta dei blocchi funzionali, nella loro configurazione ed interconnessione.
- Simulazione – Prima di programmare il chip si ha la possibilità di simulare il progetto, per evidenziare eventuali bachi nel software e ritornare quindi alla fase di progettazione.
- Programmazione – Il trasferimento vero e proprio del file hex.
PROGETTAZIONE
Per usare la modalità progettazione selezionare il tab Design. La prima operazione necessaria è quella di selezionare i vari blocchi funzionali necessari per il progetto. Per questa operazione bisogna utilizzare il tab Design, in cui è possibile selezionare e configurare elementi di ingresso, uscita, valuator e interfacce. Come è evidenziato in Figura 1 tali elementi sono selezionabili dal selettore in basso a sinistra. Per aggiungere un elemento è sufficiente scegliere la tipologia (input, output, valuator o interfaccia) e trascinarla sul desktop. A questo punto si apre una finestra in cui selezionare lo specifico elemento. Se, ad esempio, si seleziona un elemento di input, la finestra mostrata sarà quella di Figura 2.
Dopo aver selezionato l’elemento ed inserito il nome, bisogna fare click sul pulsante OK. Si nota come sul desktop sia stata aggiunta l’icona relativa al componente scelto. Tale icona può essere spostata in qualunque posto del desktop, semplicemente trascinandola. Per ogni elemento si hanno a disposizione (facendo click con il tasto destro del mouse) le seguenti funzioni:
- Properties – Apre una finestra per configurare l’elemento.
- Transfer Function – Apre una finestra per modificare la logica della funzione di trasferimento, degli ingressi o selezionare altre funzioni di trasferimento.
- Rename – Apre una dialog box per la modifica del nome dell’elemento.
- Delete – Elimina l’elemento dal desktop.
- Replace – Sostituisce l’elemento.
In tutti i casi in cui il numero di blocchi risulta elevato è possibile far uso dei comandi zoom in e zoom out. Per ingrandire l’area del desktop bisogna tenere premuto il tasto [Ctrl] e cliccare con il tasto sinistro del mouse. Per ridurre l’area del desktop tenere, invece, premuti i tasti [Ctrl] e [Shift]. Infine, per effettuare il pan nell’area del desktop tenere premuto il tasto [Alt] e spostarsi con il mouse. Molto utile risulta anche la toolbar, la quale permette di effettuare la selezione di elementi singoli o multipli, di aggiungere label e rettangoli. Quest’ultimi sono molto utili per commentare e delimitare le varie parti del progetto. La Figura 3 mostra le quattro icone disponibili.
Lo strumento selezione multipla consente, anche, di duplicare gli elementi. Per farlo, selezionare l’oggetto desiderato e premere il tasto destro del mouse; scegliere Duplicate Objects.
I blocchi funzionali
Gli elementi utilizzati per la progettazione si suddividono in:
- Driver – Si tratta di dispositivi utilizzati per acquisire segnali in ingresso al PSoC e per generare le relative uscite.
- Valuator – È un valore immagazzinato in memoria.
- Funzioni di trasferimento – Si riferisce al funzionamento di un blocco di uscita.
Esistono due tipi di driver: uscita e ingresso. Quelli di ingresso sono usati per acquisire dati da sensori, come lettura di temperatura, di tensione, da tasterini numerici e pulsanti. Quelli di uscita sono usati per un dispositivo controllato dal PSoC come ventole, segnalazioni luminose, relay. I tipi di funzioni di trasferimento previste dal PSoC Express sono:
- LoopDelay – Serve per confrontare un valore attuale con quello precedente. Per esempio, può essere usata per leggere le variazioni di temperatura e adeguare un’uscita che controlla una ventola tramite PWM.
- SetPointRegion – Associa un certo intervallo di valori di ingresso in una regione di valori. È possibile impostare una tolleranza per tali valori. Questa funzione è utile per ridurre le variazioni veloci dei segnali di ingresso (tramite l’impostazione di una isteresi). La Figura 4 mostra un esempio in cui sono definiti tre differenti intervalli.
- StateMachine – Permette di implementare una macchina a stati finiti (Figura 5).
- PriorityEncoder – Genera una singola uscita utilizzando il risultato di una serie di condizioni con priorità. Questa funzione può risultare molto utile per comandare, ad esempio, una singola ventola tramite più sensori di temperatura. Per fissarne meglio il significato si può associare il codice del Listato 1.
If x1 then y1 Else If x2 then y2 Else If x3 then y3 Else If x4 then y4
Listato 1 |
- StatusEncoder – Genera un singolo valore di uscita usando uno o più ingressi. Anche in questo caso può servire fissare le idee con il codice del Listato 2.
If x1 then y1 If x2 then y2 If x3 then y3 If x4 then y4
Listato 2 |
- TableLookup – Serve per implementare la classica tabella di look-up, in cui si crea una associazione uno a uno tra un valore di ingresso ed uno di uscita.
Quelle descritte sono le funzioni di trasferimento di default. È possibile, inoltre, crearne delle nuove mediante un processo di Authoring. Per ulteriori informazioni su questa procedura fare riferimento al sito del produttore.
SIMULAZIONE
Il passo successivo, dopo aver predisposto i blocchi, consiste nel simulare il progetto per verificare che tutto funzioni correttamente. Per usare la modalità simulazione selezionare il tab Simulation. Gli stessi strumenti di navigazione (zoom in, zoom out e pan) visti per l’area di progettazione valgono anche per quella di simulazione. Se fino a questo punto il progetto non era stato salvato, il PSoC Express richiede di farlo. Questo è indispensabile per creare una cartella in cui salvare i file di progetto, che includono anche il codice della simulazione e il file di log. Nei casi di progetti molto complessi è preferibile simularlo in maniera incrementale, mano a mano che le uscite vengono aggiunte. In corrispondenza di ogni elemento di ingresso e di uscita, compaiono degli strumenti che permettono l’interazione durante la simulazione. Essi sono indicati con il termine Widget. Variando lo stato dei widget di ingresso, quelli di uscita si aggiornano conseguentemente. Questo tipo di simulazione è detta manuale. Quando si esegue una simulazione manualmente (ossia, variando i widget di ingresso), il software crea un file di log con i valori separati da una virgola: il file è chiamato LOG.csv. Questo file contiene una colonna per ogni ingresso ed uscita. Ciascuna riga del file rappresenta una iterazione. Oltre alla simulazione manuale, è possibile editare il file LOG.csv con Excel o qualunque altro programma in grado di leggere i file CSV, poi salvarlo con un altro nome e caricarlo dall’IDE mediante il tasto Load. La simulazione può essere controllata mediante i tasti Play, Pause e Stop. Questa modalità può essere molto utile per simulare particolari segnali di ingresso. Per esempio, si può diagrammare con Excel alcuni periodi una sinusoide è poi salvarne i valori in un file csv. Le stesse prove possono essere condotte con differenti valori di frequenza.
PROGRAMMAZIONE
Terminate le fasi di progettazione e simulazione, è il momento di scegliere il dispositivo di destinazione, compilare il progetto, generare il file hex e programmare il PSoC. Per fare questo è sufficiente premere il pulsante Build e si aprirà la finestra Configuration Selection (Figura 6).
La finestra è suddivisa in tre aree principali: la lista dei dispositivi disponibili, le proprietà di configurazione e la descrizione della configurazione selezionata. Molto utile si rivela la possibilità di spuntare l’opzione Assign Pin Automatically che affida al software la scelta dei pin da utilizzare. Non selezionando questa opzione la scelta dei pin è lasciata al programmatore. Per proseguire premere il tasto Next. Terminata l’operazione di compilazione, il PSoC Express mostrerà una schermata simile a quella di Figura 7.
In questa finestra compaiono i link per visualizzare la lista componenti, il datasheet e lo schematico. I pin del PSoC possono essere evidenziati con tre differenti colori:
- Verde – Indica che il posizionamento è corretto e non bloccato.
- Arancio – Indica che il posizionamento è corretto, ma un altro driver lo blocca.
- Nero – Indica che il posizionamento è errato.
Anche se i pin sono stati assegnati automaticamente è sempre possibile procedere (dopo la compilazione) a variazioni manuali. Anzi è proprio questa la strada consiglia, che permette di ottenere la massima efficienza nel minor tempo possibile. Dopo aver terminato tutte le variazioni è possibile programmare e testare “sul campo” il firmware. Per far questo è sufficiente premere il tasto Program per lanciare il PSoC Programmer (Figura 8).
Seguire le istruzioni del compilatore utilizzato per programmare il dispositivo.
MA DOV’È IL CODICE?
Fino a questo punto non si è fatto cenno alla scrittura di nessuna riga di codice. Questa è la principale differenza che esiste tra PSoC Express e l’altro ambiente di Cypress, il PSoC Designer. Quando il software compila un progetto genera una directory contenere un insieme di file C e assembly. Ogni volta che si ripete la compilazione, i file vengono sovrascritti ad eccezione di custom.c e custom.h. Il loro scopo è quello di integrare funzioni non disponibili con gli elementi grafici di PSoC Express. Nel file custom.c sono presenti tre funzioni (di default non eseguono nessuna istruzione):
- CustomInit() – Eseguita una sola volta dopo che tutti i driver e i valuator sono stati inizializzati.
- CustomPostInputUpdate() – Chiamata in ogni ciclo di iterazione subito dopo che i valori di ingresso sono stati raccolti.
- CustomPreOutputUpdate() - Chiamata in ogni ciclo di iterazione subito prima che i valori di uscita siano stati inviati ai relativi driver.
Questo tipo di architettura consente di eseguire inizializzazioni personalizzate ed elaborare i dati in ingresso/uscita in ben precisi momenti del loop di controllo. È sufficiente aggiungere del codice nelle funzioni appena descritte e poi ricompilare il progetto. Ovviamente, fare queste modifiche richiede una conoscenza maggiore dal punto di vista della programmazione del PSoC.
UN ESEMPIO PRATICO
Si vedrà ora, attraverso un semplice esempio, come realizzare praticamente il primo progetto con PSoC Express. La complessità di questo esempio è molto bassa, ma è utile per fissare le idee sui vari step da seguire; esso costituisce un’utile base per lo sviluppo di applicazioni sempre più sofisticate.
Selezionare gli ingressi e le uscite
- Premere il tasto New per accertarsi che sul desktop non siano presenti elementi.
- Trascinare l’icona del driver di input sul desktop. Si aprirà la finestra dei driver di input.
- Nella sezione Voltage Input selezionare “DC 0.000 to 5.000V” cliccando una volta con il mouse.
- Inserire il nome del driver nell’apposito campo (per esempio Voltage) e cliccare OK. La finestra di selezione si chiuderà e sul desktop sarà comparso uno strumento simile ad un voltmetro.
- A questo punto trascinare l’icona dei driver di uscita, così come è stato fatto per quelli di ingresso.
- Dalla finestra di selezione che si aprirà, selezionare LED “Single Color On/Off with blink” ed inserire il relativo nome (per esempio IndicatorLED). Premendo il tasto OK comparirà un elemento simile ad un indicatore a led.
- Cliccando su tale elemento con il tasto destro è possibile impostarne le proprietà, selezionando la voce Properties.
Definire il comportamento
Dopo aver definito gli elementi di ingresso e uscita, il passo successivo consiste nello specificare il comportamento delle uscite a seconda delle sollecitazioni di ingresso. Cliccando con il tasto destro sull’indicatore a led e selezionando la voce “Transfer Function” è possibile scegliere una funzione di trasferimento.
- Selezionare “PriorityEncoder” e premere il tasto OK.
- Si aprirà la schermata che serve per definire il comportamento della funzione di trasferimento. La Figura 9, oltre a questa schermata, mostra anche quella del “Expression Assistant”. Quest’ultima riporta un elenco delle variabili e costanti che è possibile utilizzare nelle espressioni per creare le regole di output.
- Cliccare sul campo If ed il software richiede di inserire l’espressione. Quindi fare doppio click sulla voce Voltage del Expression Assistant e quindi aggiungere “<1500”.
a. Cliccare sul campo Then e fare doppio click sulla voce IndicatorLED_OFF e quindi premere OK. In questo modo, praticamente, è stata aggiunta la riga “If Voltage<1500 Then IndicatorLED_OFF” - Allo steso modo aggiungere le istruzioni:a. If Voltage<3000 Then IndicatorLED_BLINKING
b. If 1 Then IndicatorLED_ON - Da notare che l’ultima istruzione è stata aggiunta per contemplare tutti i casi, altrimenti ci sarebbero state situazioni indeterminate. A questo punto premere il tasto Next>>. Sul desktop comparirà una linea rossa che congiunge i due elementi; questo indica che tra loro è stata definita una funzione di trasferimento (Figura 10).
- Non resta a questo punto che salvare il progetto per passare alla successiva fase di simulazione; per fare questo premere il tasto Save e selezionare una percorso per il salvataggio dei file.
Simulare e verificare il progetto
Dalla simulazione del progetto descritto ci si aspetta che il led sia spento per valori inferiori a 1.5V, che lampeggi tra 1.5V e 3V e che sia acceso oltre i 3V. Per provare che questo funzionamento è rispettato:
- Fare click sul tab Simulation. Apparirà uno slider vicino al driver di input e una box vicino a quello di output.
- Portando lo slider a 1V il widget del led dovrebbe indicare 0 (Off).
- Portando lo slider a 2V il widget del led dovrebbe indicare 2 (Blinking).
- Portando lo slider a 4V il widget del led dovrebbe indicare 1 (On).
Se il risultato è conforme a quello che ci si aspettava allora si può passare alla fase di compilazione, altrimenti sarà necessario ritornare alla progettazione per comprendere cosa non funziona.
Compilare il progetto
Per compilare il progetto seguire le istruzioni seguenti:
- Fare click sul pulsante Build e si aprirà la finestra “PSoC Device Configuration Selection” (Figura 6). La schermata elenca solo i dispositivi che soddisfano le richieste di input/output. Inoltre, sono elencati in ordine crescente di prezzo.
- Se si utilizza una scheda di prototipazione, ovviamente, la scelta ricadrà sul chip presente su di essa. Generalmente è utilizzato il modello CY8C27443.
- Selezionare 5.0V come tensione di alimentazione.
- Selezionare 64Hz come frequenza di campionamento.
- Spuntare l’opzione “Assign pins automatically”.
- Fare click sul tasto OK. La finestra mostrata a questo punto (Figura 7) riporta il footprint del chip con l’indicazione dei pin assegnati automaticamente.
- Se le assegnazioni sono compatibili con la scheda di sviluppo premere Next. PSoC Express converte il progetto in codice eseguibile dal microcontrollore e lo memorizza in un file con estensione hex.
Programmare i PSoC
Per la programmazione del chip è sufficiente (Figura 8):
- Selezionare il tasto Program e si aprirà il PSoC Programmer.
- Inserire il chip nel programmatore e collegare il connettore “Target ISSP”.
- Premere il pulsante Program e il codice sarà caricato nel chip.
Dopo aver programmato il chip si possono ripetere le stesse prove fatte durante la simulazione e controllare che tutto sia ok.
CONCLUSIONI
Come si può facilmente comprendere da questo semplice esempio, il tempo necessario a sviluppare
il proprio progetto può essere notevolmente ridotto usando PSoC Express. Inoltre, non è stato necessario aggiungere nessuna linea di codice; questo permette anche a chi si avvicina per la prima volta alla programmazione dei
microcontrollori di poter sviluppare i loro progetti in tempi molto brevi. Passare a livelli più avanzati di programmazione è possibile sia utilizzando le tecniche descritte per la modifica del file custom.c sia passando
all’ambiente di sviluppo PSoC Designer, che richiede, però, una conoscenza maggiore di programmazione. Da non sottovalutare anche la scelta automatica del chip più adeguato che evita al progettista di perdere ore nella lettura
dei datasheet.