Capsense sur PSOC CYC20234

From Eric

(Difference between revisions)
Jump to: navigation, search
m
m
 
(5 intermediate revisions not shown)
Line 1: Line 1:
=Objectif=
=Objectif=
-
Expérimenter la technologie Capsense de Cypress ; expérimenter les PSOC.
+
Expérimenter les PSOC de Cypress ; expérimenter la technologie Capsense.
=Principes=
=Principes=
-
J'utilise un PSOC CY8C20234 acheté directement chez Cypress pour un prix dérisoire, frais de port compris. C'est un composant CMS (SOP16) ; il faut donc acheter un adaptateur.
+
J'utilise un PSOC CY8C20234 acheté directement chez Cypress pour un prix très faible ($1.9), frais de port compris. C'est un composant CMS (SOP16) ; il faut donc acheter un adaptateur qui coûte pratiquement le prix du chip...
=Réalisation=
=Réalisation=
-
La réalisation est très simple : une carte comprenant le PSOC et un circuit imprimé "maison" pour le clavier. Le fichier "Eagle" est ici.
+
La réalisation est très simple : une carte comprenant le PSOC et un circuit imprimé "maison" pour le clavier. Les fichiers "Eagle" sont [https://skydrive.live.com/#cid=0528791E823E13E0&id=528791E823E13E0!37674 ici].
-
Voila la photo de la carte principale :
+
Voila la photo de la carte principale et du "clavier" :
 +
[[File:psoc_capsense_board.jpg|300px|thumb|none]]
-
Voila la photo du clavier.
+
==Configuration du PSOC==
-
==Programmation du PSOC==
+
Un PSOC est un composant comportant un coeur de microcontroleur (un 8 bits pour les séries PSOC-1 et PSOC-3) et plusieurs blocs configurables. Cypress fournit un environnement de développement gratuit très agréable : PSoC Designer.
-
Un PSOC est un composant comportant un coeur de microcontroleur (un 8 bit pour la série 1) et plusieurs blocs configurables. Cypress fournit un environnement de développement gratuit très agréable : PSoC Designer.
+
Voila une vue d'ensemble de l'IHM :
-
Cet environnement comporte donc deux parties :  
+
[[File:psoc_capsense_ihm.jpg|300px|thumb|none]]
-
* une partie destinée à la programmation du microcontroleur, en C ;
+
-
* une partie destinée à la configuration des blocs analogique.  
+
-
Dans notre cas (CY8C20234), il existe 4 blocs dont un est le bloc "Capsense".
+
Cet environnement comporte deux parties :
 +
* une partie destinée à la programmation du microcontroleur en C ;
 +
* une partie destinée à la configuration des "blocs".  
-
La configuration des blocs se fait à l'aide de "Wizards" qui facilitent la tâche. En outre, l'environnement donne accès directement à la documentation ("datasheet") du bloc.  
+
Dans notre cas (CY8C20234), le composant comporte 4 blocs dont un bloc "Capsense".
 +
 
 +
[[File:psoc_capsense_blocs.jpg|300px|thumb|none]]
 +
 
 +
La configuration des broches d'entrées/sorties se fait à partir de l'IHM. C'est aussi ici que l'on peut, au besoin, affecter des noms symboliques aux broches.
 +
 
 +
Voici la vue de la configuration des broches :
 +
 
 +
[[File:psoc_pin_overview.jpg|300px|thumb|none]]
 +
 
 +
Voici le menu de configuration des broches :
 +
 
 +
[[File:psoc_pin_config.jpg|300px|thumb|none]]
 +
 
 +
La sélection des blocs se fait en "glissant-déposant" une fonction sur le bloc. Leur configuration se fait à l'aide de "Wizards" (ou directement). En outre, l'environnement donne accès directement à la documentation ("datasheet") du bloc.  
Dans le cas du bloc Capsense (plus précisément, le bloc CSA_EMC), la configuration consiste à définir le nombre de touches ou de "sliders" et à les associer aux broches du composant. On ne peut pas faire beaucoup plus simple.
Dans le cas du bloc Capsense (plus précisément, le bloc CSA_EMC), la configuration consiste à définir le nombre de touches ou de "sliders" et à les associer aux broches du composant. On ne peut pas faire beaucoup plus simple.
-
La configuration "fine" du bloc nécessite cependant la lecture attentive de la documentation car les paramètres sont assez nombreux et, s'agissant d'électronique analogique", assez "pointus".
+
[[File:psoc_capsense_wizard.jpg|300px|thumb|none]]
-
Une fois la bloc configuré, l'environnement génère automatiquement le code nécessaire à l'accès à la fonction Capsense à partir du code C. L'API est décrite dans la "datasheet" du bloc CSA_EMC ; elle comprend aussi des exemples de code.
+
La configuration "fine" du bloc nécessite cependant la lecture attentive de la documentation car les paramètres sont assez nombreux et, s'agissant d'électronique analogique, assez "pointus".
-
=== Le code C ===
+
Voici les options de configuration du bloc Capsense :
-
Un extrait du code C est donné ci-après. A noter :
+
[[File:psoc_config_capsense.jpg|300px|thumb|none]]
-
* Les fonction CSA_EMC "Start", "SetDefaultFingerThreshold",  etc. sont préfixées par le nom du bloc Capsense donné dans Psoc Designer.
+
-
De même la variable "LED1_Data_ADDR" est composée du nom de la broche ("LED1") donné sous Psoc Designer suivi de "Data_ADDR"._
+
 +
Une fois le bloc configuré, l'environnement génère automatiquement le code nécessaire à l'accès à la fonction Capsense à partir du code C. En gros : l'API. Celle-ci est décrite dans la "datasheet" du bloc CSA_EMC ; ce document donne aussi des exemples de code.
 +
 +
== Le code C ==
 +
 +
Un extrait du code C est donné ci-après. Il fait usage d'un deuxième bloc, le bloc timer, utilisé pour générer des "bips" lors de l'appui sur les touches. Le code complet est [https://skydrive.live.com/#cid=0528791E823E13E0&id=528791E823E13E0!37511 ici].
 +
 +
A noter que les fonction CSA_EMC "Start", "SetDefaultFingerThreshold",  etc. sont préfixées par le nom du bloc Capsense donné dans Psoc Designer. De même la variable "LED1_Data_ADDR" est composée du nom de la broche ("LED1") donné sous Psoc Designer suivi de "_Data_ADDR".
   //----------------------------------------------------------------------------
   //----------------------------------------------------------------------------
Line 45: Line 65:
   #include "PSoCAPI.h"    // PSoC API definitions for all User Modules
   #include "PSoCAPI.h"    // PSoC API definitions for all User Modules
   #include "psocgpioint.h" // Fichier généré automatiquement ; permet d'utiliser les noms de broches symboliques (<nom>_Data_ADDR
   #include "psocgpioint.h" // Fichier généré automatiquement ; permet d'utiliser les noms de broches symboliques (<nom>_Data_ADDR
 +
 
 +
  BYTE  beep_counter;
 +
 
 +
  #pragma interrupt_handler timer_ISR_Handler
 +
  void              timer_ISR_Handler( void );
 +
 
    
    
   void main(void)
   void main(void)
   {
   {
-
   
+
     
-
   M8C_EnableGInt;  //enable global interrupts for use with CSA_EMC
+
   M8C_EnableGInt;  // Activation des ITs pour le bloc CSA_EMC et le timer
    
    
-
   CSA_EMC_1_Start();     //initialize the CSA_EMC User Module
+
   CSA_EMC_1_Start();                       // Initialize the CSA_EMC User Module
-
  CSA_EMC_1_SetDefaultFingerThresholds();  //Load finger thresholds
+
    CSA_EMC_1_SetDefaultFingerThresholds();  // Load finger thresholds
-
     CSA_EMC_1_InitializeBaselines(); //Set baselines to current count
+
     CSA_EMC_1_InitializeBaselines();         // Set baselines to current count
 +
 
 +
  beep_counter = 0;
 +
        Timer13_1_EnableInt();
 +
  Timer13_1_SetPeriod(16);
 +
        Timer13_1_Start(); // On émet un petit bip de test.
    
    
   while(1)  
   while(1)  
Line 62: Line 93:
  
  
   // Test des boutons.
   // Test des boutons.
-
   if (CSA_EMC_1_bIsSensorActive(0) || (CSA_EMC_1_bIsSensorActive(2))
+
   if (CSA_EMC_1_bIsAnySensorActive ())
   {
   {
-
  LED1_Data_ADDR |= 0b00001000;
+
  LED1_Data_ADDR |= 0b00001000;
 +
  Timer13_1_SetPeriod(10);
 +
    Timer13_1_Start();
 +
  beep_counter = 5;
   }
   }
   else
   else
Line 70: Line 104:
   LED1_Data_ADDR &= ~0b00001000;
   LED1_Data_ADDR &= ~0b00001000;
   }
   }
-
 
+
 
-
   if (CSA_EMC_1_bIsSensorActive(1) || (CSA_EMC_1_bIsSensorActive(3))
+
 
-
  {
+
   if ( ! (beep_counter --) )
-
   LED1_Data_ADDR |= 0b10000000;
+
  {
 +
   Timer13_1_Stop();
   }
   }
-
  else
+
    }
-
  {
+
  }
-
  LED1_Data_ADDR &= ~0b10000000;
+
 
-
  }
+
  //------------------------------------------------------------------------
-
        }
+
  // myTimer_ISR_Handler    // The handler for the Timer ISR
 +
  //------------------------------------------------------------------------
 +
  void timer_ISR_Handler(void)
 +
  {
 +
  BUZZER_Data_ADDR ^= 0b00010000;
   }
   }
 +
Le handler d'IT est déclaré avec le pragma "interrupt_handler". Pour qu'il soit effectivement appelé, il faut l'associer au vecteur "Time interrupt" dont l'adresse est 10h. Pour ce faire, il faut modifier le fichier "boot.asm". En voici un extrait :
 +
 +
    ;---------------------------------------------------
 +
    ; Insert your custom code below this banner
 +
    ;---------------------------------------------------
 +
 +
    org  04h                      ;Low Voltage Detect (LVD) Interrupt Vector
 +
    halt                          ;Stop execution if power falls too low
 +
 +
    org  08h                      ;Analog Interrupt Vector
 +
    // call void_handler
 +
    reti
 +
 +
    org  0Ch                      ;CapSense Interrupt Vector
 +
    ljmp _CSA_EMC_1_ISR
 +
    reti
 +
 +
    org  10h                      ;Timer Interrupt Vector
 +
    ljmp _timer_ISR_Handler
 +
    reti
 +
 +
    org  14h                      ;GPIO Interrupt Vector
 +
    ljmp PSoC_GPIO_ISR
 +
    reti
 +
 +
Attention : si on regénère l'application, on perd les modifications du fichier "boot.asm". Aussi, une fois le composant configuré, l'application se génère avec le menu "Build/Build '<xxx>' Project" et non celui surligné en jaune sur la copie d'écran ci-après :
 +
 +
[[File:psoc_build.jpg|300px|thumb|none]]
=Conclusion=
=Conclusion=

Latest revision as of 11:00, 13 December 2012

Contents

Objectif

Expérimenter les PSOC de Cypress ; expérimenter la technologie Capsense.

Principes

J'utilise un PSOC CY8C20234 acheté directement chez Cypress pour un prix très faible ($1.9), frais de port compris. C'est un composant CMS (SOP16) ; il faut donc acheter un adaptateur qui coûte pratiquement le prix du chip...

Réalisation

La réalisation est très simple : une carte comprenant le PSOC et un circuit imprimé "maison" pour le clavier. Les fichiers "Eagle" sont ici.

Voila la photo de la carte principale et du "clavier" :

Psoc capsense board.jpg


Configuration du PSOC

Un PSOC est un composant comportant un coeur de microcontroleur (un 8 bits pour les séries PSOC-1 et PSOC-3) et plusieurs blocs configurables. Cypress fournit un environnement de développement gratuit très agréable : PSoC Designer.

Voila une vue d'ensemble de l'IHM :

Psoc capsense ihm.jpg

Cet environnement comporte deux parties :

  • une partie destinée à la programmation du microcontroleur en C ;
  • une partie destinée à la configuration des "blocs".

Dans notre cas (CY8C20234), le composant comporte 4 blocs dont un bloc "Capsense".

Psoc capsense blocs.jpg

La configuration des broches d'entrées/sorties se fait à partir de l'IHM. C'est aussi ici que l'on peut, au besoin, affecter des noms symboliques aux broches.

Voici la vue de la configuration des broches :

Psoc pin overview.jpg

Voici le menu de configuration des broches :

Psoc pin config.jpg

La sélection des blocs se fait en "glissant-déposant" une fonction sur le bloc. Leur configuration se fait à l'aide de "Wizards" (ou directement). En outre, l'environnement donne accès directement à la documentation ("datasheet") du bloc.

Dans le cas du bloc Capsense (plus précisément, le bloc CSA_EMC), la configuration consiste à définir le nombre de touches ou de "sliders" et à les associer aux broches du composant. On ne peut pas faire beaucoup plus simple.

Psoc capsense wizard.jpg

La configuration "fine" du bloc nécessite cependant la lecture attentive de la documentation car les paramètres sont assez nombreux et, s'agissant d'électronique analogique, assez "pointus".

Voici les options de configuration du bloc Capsense :

Psoc config capsense.jpg

Une fois le bloc configuré, l'environnement génère automatiquement le code nécessaire à l'accès à la fonction Capsense à partir du code C. En gros : l'API. Celle-ci est décrite dans la "datasheet" du bloc CSA_EMC ; ce document donne aussi des exemples de code.

Le code C

Un extrait du code C est donné ci-après. Il fait usage d'un deuxième bloc, le bloc timer, utilisé pour générer des "bips" lors de l'appui sur les touches. Le code complet est ici.

A noter que les fonction CSA_EMC "Start", "SetDefaultFingerThreshold", etc. sont préfixées par le nom du bloc Capsense donné dans Psoc Designer. De même la variable "LED1_Data_ADDR" est composée du nom de la broche ("LED1") donné sous Psoc Designer suivi de "_Data_ADDR".

 //----------------------------------------------------------------------------
 // C main line
 //----------------------------------------------------------------------------
 
 #include <m8c.h>        // part specific constants and macros
 #include "PSoCAPI.h"    // PSoC API definitions for all User Modules
 #include "psocgpioint.h"	// Fichier généré automatiquement ; permet d'utiliser les noms de broches symboliques (<nom>_Data_ADDR
 
 BYTE  beep_counter;
 
 #pragma interrupt_handler timer_ISR_Handler
 void              	timer_ISR_Handler( void );
 
 
 void main(void)
 {
     
 	M8C_EnableGInt;  // Activation des ITs pour le bloc CSA_EMC et le timer
 
 	CSA_EMC_1_Start();                        // Initialize the CSA_EMC User Module
   	CSA_EMC_1_SetDefaultFingerThresholds();   // Load finger thresholds
   	CSA_EMC_1_InitializeBaselines();          // Set baselines to current count
 
 	beep_counter = 0;
       Timer13_1_EnableInt();
 	Timer13_1_SetPeriod(16);
       Timer13_1_Start(); // On émet un petit bip de test.
 
 	while(1) 
 	{
 
 		// Echantillonnage des boutons et mise à jour des "baselines"
 		CSA_EMC_1_ScanAllSensors();    
 	
 		// Test des boutons.
 		if (CSA_EMC_1_bIsAnySensorActive ())
 		{
 			LED1_Data_ADDR |= 0b00001000;
 			Timer13_1_SetPeriod(10);		
    			Timer13_1_Start();
 			beep_counter = 5;
 		}
 		else
 		{
 			LED1_Data_ADDR &= ~0b00001000;
 		}
 
 				
 		if ( ! (beep_counter --) )
 		{
 			Timer13_1_Stop();
 		}
   }
 } 
 
 //------------------------------------------------------------------------
 // myTimer_ISR_Handler    // The handler for the Timer ISR
 //------------------------------------------------------------------------
 void timer_ISR_Handler(void)
 {
 	BUZZER_Data_ADDR ^= 0b00010000;
 }

Le handler d'IT est déclaré avec le pragma "interrupt_handler". Pour qu'il soit effectivement appelé, il faut l'associer au vecteur "Time interrupt" dont l'adresse est 10h. Pour ce faire, il faut modifier le fichier "boot.asm". En voici un extrait :

   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   org   04h                      ;Low Voltage Detect (LVD) Interrupt Vector
   halt                           ;Stop execution if power falls too low
   org   08h                      ;Analog Interrupt Vector
   // call	void_handler
   reti
   org   0Ch                      ;CapSense Interrupt Vector
   ljmp	_CSA_EMC_1_ISR
   reti
   org   10h                      ;Timer Interrupt Vector
   ljmp	_timer_ISR_Handler
   reti
   org   14h                      ;GPIO Interrupt Vector
   ljmp	PSoC_GPIO_ISR
   reti

Attention : si on regénère l'application, on perd les modifications du fichier "boot.asm". Aussi, une fois le composant configuré, l'application se génère avec le menu "Build/Build '<xxx>' Project" et non celui surligné en jaune sur la copie d'écran ci-après :

Psoc build.jpg

Conclusion

Personal tools