Capsense sur PSOC CYC20234
From Eric
m |
m |
||
Line 1: | Line 1: | ||
=Objectif= | =Objectif= | ||
- | Expérimenter | + | 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 | + | 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. | + | 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 et du "clavier" : | Voila la photo de la carte principale et du "clavier" : |
Revision as of 09:49, 3 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" :
Configuration du PSOC
Un PSOC est un composant comportant un coeur de microcontroleur (un 8 bit 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 donc deux parties :
- une partie destinée à la programmation du microcontroleur, en C ;
- une partie destinée à la configuration des blocs analogique.
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 pourra 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 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.
Le code C
Un extrait du code C est donné ci-après (il fait usage d'un deuxième bloc : le bloc timer).
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 :