Capsense sur PSOC CYC20234
From Eric
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" :
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 :
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".
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 :
Voici le menu de configuration des broches :
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.
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 :
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 :