Interrupt con PSoC

Lo schemaLa gestione dell'interrupt in PSoC rispecchia quanto descritto nella sezione generale.

Procediamo con un facile esempio, si fa riferimento alla accensione di un LED attraverso un pulsante, prima attraverso il controllo del programma principale, poi con l'uso dell'interrupt.


Lo schema si realizza usando l'ambiente di sviluppo PSoC creator, dove è possibile definire le risorse (in questo caso un input e un output entrambi digitali) ed alcuni componenti esterni.

Il componente Bootloadable serve semplicemente per caricare il programma.

I componenti esterni, in blu nello schema, sono solo di riferimento (il LED, il pulsante, Vdd e GND) e non concorrono in alcun modo alla creazione del progetto.
le risorse: il pin di input e di output vengono usate nella fase di Build per generare le funzioni (API) che serviranno per controllarle.

Il nome LED, l'output in questo esempio, è stato definito in fase di progettazione configurando la risorsa Digital Output Pin. La fase di Build costruisce le funzioni relative a LED, in particolare la funzione LED_Write() e LED_Read() (l'output può anche essere letto). Da notare come le funzioni prendono come prefisso il nome (LED) definito in progetto.

Il programma si riduce ad una sola riga:

LED_Write(!Pulsante_Read());

all'interno del loop principale for(;;;). Viene letto lo stato del pulsante, Pulsante_Read(), negato il valore (il pulsante è attivo basso) e il risultato è scritto sul led LED_Write().

La funzione CyDelay(1000) -commentata- introduce un ritardo si 1000 mS per simulare l'effetto di un lungo programma.

Il programma completo è il seguente:

  1. /* ========================================
  2.  *
  3.  * Copyright YOUR COMPANY, THE YEAR
  4.  * All Rights Reserved
  5.  * UNPUBLISHED, LICENSED SOFTWARE.
  6.  *
  7.  * CONFIDENTIAL AND PROPRIETARY INFORMATION
  8.  * WHICH IS THE PROPERTY OF your company.
  9.  *
  10.  * ========================================
  11. */
  12. #include <project.h>
  13.  
  14. int main()
  15. {
  16.     CyGlobalIntEnable; /* Enable global interrupts. */
  17.  
  18.     /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  19.  
  20.     for(;;)
  21.     {
  22.         /* Place your application code here. */
  23.         LED_Write(!Pulsante_Read());
  24.        
  25.         // CyDelay(1000);
  26.        
  27.     }
  28. }

Gestione via Interrupt

La stessa funzione può essere scritta con maggiore efficienza gestendo il pulsante via interrupt. Lo schema relativo è il seguente.

Componente interrupt PSoC

 

Il pulsante genera un interrupt. Nel PSoC Creator occorre configurare il pin di input per abbinarlo all'interrupt che dovrà attivarsi sia alla transizione da alto a basso (si preme il pulsante), sia alla transizione da basso ad alto (si rilascia il pulsante).

Configurazione interrupt pin ingresso

Alla nuova linea, agganciata al pin di input, va collegato il relativo componente interrupt:

Componente interrupt PSoC

La risorsa interrupt ha un nome definito nel progetto, in questo caso Pul_IRQ. Modificato il progetto, l'operazione di Build costruisce le funzioni (API) necessarie alla gestione dei suoi componenti. La gestione dello specifico interrupt la si può implementare modificando l'API generata del build, o implementandola all'interno del main.c. E' il metodo usato in questo progetto.

Occorre, poi, abilitare l'interrupt (CyGlobalIntEnable;) e inizializzare la funzione (Pul_IRQ_StartEx();). Il loop principale for(;;) resta vuoto.

Ecco il codice completo, in inglese quanto generato dal Creator:

  1. /* ========================================
  2.  *
  3.  * Copyright YOUR COMPANY, THE YEAR
  4.  * All Rights Reserved
  5.  * UNPUBLISHED, LICENSED SOFTWARE.
  6.  *
  7.  * CONFIDENTIAL AND PROPRIETARY INFORMATION
  8.  * WHICH IS THE PROPERTY OF your company.
  9.  *
  10.  * ========================================
  11. */
  12. #include "project.h"
  13.  
  14. CY_ISR(Pul_IRQ_handler)
  15. {
  16. /* ISR Code here */
  17.     // Resetto l'interrupt abbinato al pulsante
  18.     Pulsante_ClearInterrupt();
  19.  
  20.     // Leggo il pulsante e accendo il led se premuto
  21.     LED_Write(!Pulsante_Read());    
  22. }
  23.  
  24.  
  25. int main()
  26. {
  27.     CyGlobalIntEnable; /* Enable global interrupts. */
  28.    
  29.     // inizializzo la gestione dell'Interrupt
  30.     Pul_IRQ_StartEx(Pul_IRQ_handler);
  31.    
  32.  
  33.     /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  34.  
  35.     for(;;)
  36.     {
  37.         /* Place your application code here. */
  38.        // Non c'è codice all'interno del loop
  39.        
  40.     }
  41. }
  42.  
  43. /* [] END OF FILE */

 

Definizione dei pin fisici di input e output e priorità interrupt

Configurazione PinIl progetto sviluppato utilizza, per le risorse, dei nomi simbolici che, a priori, non sono abbinati a nessuna risorsa fisica. Questo rende più flessibile il progetto, lasciando libero il programmatore di definire l'I/O successivamente e tanto altro senza nessuna necessità di modificare il programma.

Il progetto crea un file con estensione nomeprogetto.cydwr  (Design Wide Resource) che consente la configurazione fisica dei pin e di altre risorse. L'operazione è grafica. Cliccando sul file in questione (lato sx dell'ambiente di lavoro, tab Source) si apre la relativa grafica.

Il nome della risorsa (lato destro) la si abbina al pin fisico trascinandola sulla immagine del pin del processore (immagine centrale). Eventuali conflitti (es. abbinare l'input con il pin di alimentazione) impediscono l'operazione.

Per questo progetto sono stati utilizzati i pin P1[6] per il LED e il pin P0[7] per il pulsante, perché già presenti sul kit CY8KIT-049-42xx utilizzato per questi esempi, e quindi non necessita nessun componente esterno.

Priorità interruptIn modo analogo si possono definire il vettore di interrupt e la relativa priorità.

In questo esempio i valori di default vanno bene in quanto si stiamo utilizzando un solo interrupt.

 

 

 

Approfondimenti.

PSoCdella fama e diffusione in ambito hobbistico alla pari di Arduino. E' meno conosciuto, quindi si ritiene utlie aggiungere alcuni dettagli.

I componenti sono configurati in modo interattivo utilizzando l'interfaccia grafica (GUI) del  PSoC creator selezionandoli dal catalogo e trascinati nello schema.

I componenti

Il click destro sul componente mostra il menu contestuale. Le due voci più importanti sono Configure e Open DataSheet: la prima permette la configurazione dle componente, la seconda  apre un file PDF con la documentazione del componente.

Menu contestuale

 

Output

PSoC OutputL'immagine riassume la configurazione dell'output per questo esempio. Il none LED è importante perché diventa il prefissodi tutte le funzioni inerenti il pin. Il pin è configurato come Strong drive, ideale per pilotare il led. Lo stato iniziale sarà basso (Led Spento).

Il pin è una uscita digitale (Digital output) e non ha connessioni hardware (HW connection) perché pilotato via software.

La documentazione riporta la descrizione completa.

 

Input

PSoC inputImportanti sono il nome (Pulsante). Il drive mode, Resistive pull up, che inserisce internamente al PSoC, una resistenza verso l'alimentazione evitando l'uso di una resistenza esterna; in questo modo l'input pulsante è nello stato alto se non premuto e basso se premuto.

Il pulsante genera l'interrupt quando premuto e quando rilasciato. La relativa configurazione è nel tab input.

 

Interrupt abbinato al Pin

 

Interrupt

Il componente interrupt non richiede particolari configurazioni. Come gli altri componeti lo si selezione dal catlogo e lo si inserisce trascinandolo all'interno dello schema. Unico elemento importante è il nome. Per comodità viene cambiato in con un nome più utile per riconoscerne l'utilizzo.

Interrupt

 

 

 

Categoria: 

Tags: 

Mi piace: 

0
No votes yet