PSoC Express

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.

 

Figura 1. Il PSoC Express è l’ambiente di sviluppo per la simulazione e la programmazione dei PSoC ad alto livello. Non è necessario, infatti, scrivere nessuna riga in assembly o C poiché tutto viene definito in maniera visuale. Le tre sezioni fondamentali dell’IDE sono: Design, Simulation e BOM/Schematic

Figura 1. Il PSoC Express è l’ambiente di sviluppo per la simulazione e la programmazione dei PSoC ad alto livello. Non è necessario, infatti, scrivere nessuna riga in assembly o C poiché tutto viene definito in maniera visuale. Le tre sezioni fondamentali dell’IDE sono: Design, Simulation e BOM/Schematic

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.

Figura 2. Per ogni tipologia di elemento da inserire nel progetto viene mostrata una finestra in cui è possibile scegliere lo specifico dispositivo da utilizzare. Per ogni dispositivo è fornita anche una descrizione dettagliata di funzionamento e le caratteristiche elettriche del componente

Figura 2. Per ogni tipologia di elemento da inserire nel progetto viene mostrata una finestra in cui è possibile scegliere lo specifico dispositivo da utilizzare. Per ogni dispositivo è fornita anche una descrizione dettagliata di funzionamento e le caratteristiche elettriche del componente

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.

Figura 3. La toolbar è utile per commentare, delimitare blocchi di un progetto, effettuare selezioni singole o multiple

Figura 3. La toolbar è utile per commentare, delimitare blocchi di un progetto, effettuare selezioni singole o multiple

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.
Figura 4. La funzione di trasferimento SetPointRegion serve per definire intervalli di valori di ingresso con una soglia (isteresi) per i segnali che presentano variazioni veloci o per ridurre gli effetti del rumore

Figura 4. La funzione di trasferimento SetPointRegion serve per definire intervalli di valori di ingresso con una soglia (isteresi) per i segnali che presentano variazioni veloci o per ridurre gli effetti del rumore

  • StateMachine – Permette di implementare una macchina a stati finiti (Figura 5).
Figura 5. La funzione di trasferimento StateMachine permette di creare una macchina a stati finiti. Lo stato dipende da quello precedente e dal valore dell’ingresso

Figura 5. La funzione di trasferimento StateMachine permette di creare una macchina a stati finiti. Lo stato dipende da quello precedente e dal valore dell’ingresso

  • 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).

Figura 6. Per la compilazione del progetto è necessario selezionare il componente da utilizzare e quindi la sua configurazione elettrica

Figura 6. Per la compilazione del progetto è necessario selezionare il componente da utilizzare e quindi la sua configurazione elettrica

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.

Figura 7. Terminata la fase di compilazione il software mostra il PSoC scelto con l’indicazione dei pin utilizzati per il progetto.

Figura 7. Terminata la fase di compilazione il software mostra il PSoC scelto con l’indicazione dei pin utilizzati per il progetto.

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).

Figura 8. Il PSoC Programmer serve per programmare il dispositivo quando sono terminate la fasi di progettazione e simulazione del firmware. Per lanciarlo è sufficiente premere il tasto Program dall’interfaccia principale

Figura 8. Il PSoC Programmer serve per programmare il dispositivo quando sono terminate la fasi di progettazione e simulazione del firmware. Per lanciarlo è sufficiente premere il tasto Program dall’interfaccia principale

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

  1. Premere il  tasto  New  per  accertarsi  che  sul desktop non siano presenti elementi.
  2. Trascinare l’icona del driver di input sul desktop. Si aprirà la finestra dei driver di input.
  3. Nella sezione Voltage Input selezionare “DC 0.000 to 5.000V” cliccando una volta con il mouse.
  4. 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.
  5. A questo punto trascinare l’icona  dei driver di uscita, così come è stato fatto per quelli di ingresso.
  6. 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.
  7. 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.

  1. Selezionare  “PriorityEncoder”   e  premere  il tasto OK.
  2. 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.
    Figura 9. PriorityEncoder è una delle funzioni di trasferimento che si posso definire con PSoC Express. La finestra Expression Assistant semplifica la definizione delle espressioni, perché contiene un elenco delle variabili e costanti che si possono utilizzare

    Figura 9. PriorityEncoder è una delle funzioni di trasferimento che si posso definire con PSoC Express. La finestra Expression Assistant semplifica la definizione delle espressioni, perché contiene un elenco delle variabili e costanti che si possono utilizzare

     

  3. 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”
  4. Allo steso modo aggiungere le istruzioni:a. If Voltage<3000 Then IndicatorLED_BLINKING
    b. If 1 Then IndicatorLED_ON
  5. 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).
    Figura 10. La definizione di una funzione di trasferimento è indicata da un segmento rosso che congiunge gli elementi di ingresso con l’uscita

    Figura 10. La definizione di una funzione di trasferimento è indicata da un segmento rosso che congiunge gli elementi di ingresso con l’uscita

     

  6. 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:

  1. Fare click sul tab Simulation. Apparirà uno slider vicino al driver di input e una box vicino a quello di output.
  2. Portando lo slider a 1V il widget del led dovrebbe indicare 0 (Off).
  3. Portando lo slider a 2V il widget del led dovrebbe indicare 2 (Blinking).
  4. 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:

  1. 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.
  2. Se si utilizza una scheda di prototipazione, ovviamente, la scelta ricadrà sul chip presente su di essa. Generalmente è utilizzato il modello CY8C27443.
  3. Selezionare 5.0V come tensione di alimentazione.
  4. Selezionare 64Hz come frequenza di campionamento.
  5. Spuntare l’opzione “Assign pins automatically”.
  6. 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.
  7. 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):

  1. Selezionare il tasto Program e si aprirà il PSoC Programmer.
  2. Inserire il chip nel programmatore e collegare il connettore “Target ISSP”.
  3. 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.

 

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *