Bienvenu(e)! Identification Créer un nouveau profil

Recherche avancée

PIC18F4550 et probleme d'interrupteurs

Envoyé par tiamat 
PIC18F4550 et probleme d'interrupteurs
vendredi 5 juin 2009 12:19:29
Bonjour à tous,

j'ai réalisé une carte d'interface USB (en CDC) avec mon PC. Cette carte fonctionne bien mais j'ai quelques soucis de rebond lorsque j'ai besoin de remonter l'état des interrupteurs connectés aux sorties de mon PIC.

j'ai donc deux interrupteurs et deux Leds connectés aux sorties du PIC:
Code:

#define LED1 PORTCbits.RC0
#define LED2 PORTCbits.RC1

#define BOUTON1 PORTDbits.RD0
#define INTERR1 PORTDbits.RD1

void UserInit(void)
{
ADCON1 = 0x0E ;
TRISC = 252;
TRISDbits.TRISD0 = 1;
TRISDbits.TRISD1 = 1;
BOUTON1 = 0;
INTERR1 = 0;
PORTC = 1;
prev_switch2_state = INTERR1;
LED1 = 0;
LED2 = 0;
}//end UserInit

j'ai récupéré la stack USB de Microchip pour commencer mon projet, et voici donc la partie ProcessIO() qui est exécutée en while(1):

Code:

void ProcessIO(void)
{
if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return;
CheckSensors();
ServiceRequests();

}//end ProcessIO

void ServiceRequests(void)
{

if(getsUSBUSART(input_buffer,6)){
switch(input_buffer[1]){

//LED1
case REQ_LED1:
LED1 = !LED1;
if(mUSBUSARTIsTxTrfReady()){
if(LED1 == 1)
putrsUSBUSART("LED1_ON\n"winking smiley;
else
putrsUSBUSART("LED1_OFF\n"winking smiley;
}
break;
//LED2
case REQ_LED2:
LED2 = !LED2;
if(mUSBUSARTIsTxTrfReady()){
if(LED2 == 1)
putrsUSBUSART("LED2_ON\n"winking smiley;
else
putrsUSBUSART("LED2_OFF\n"winking smiley;
}
break;

et voici la fonction CheckSensors() qui va renvoyer au PC l'état des deux interrupteurs:
Code:

//dans init
old_sw2 = INTERR1;
....
void CheckSensors(void){
//Bouton Poussoir
if(BOUTON1 == 1){
if(mUSBUSARTIsTxTrfReady()){
putrsUSBUSART("BOUTON1_PRESSED\r\n"winking smiley;
}
Delay10KTCYx(0);
Delay10KTCYx(0);
}
//Bouton ON/OFF
if(INTERR1 != old_sw2){
old_sw2 = INTERR1;
if(mUSBUSARTIsTxTrfReady() & INTERR1==0){
putrsUSBUSART("BOUTON2_ON\r\n"winking smiley;
}
else if(mUSBUSARTIsTxTrfReady() & INTERR1==1){
putrsUSBUSART("BOUTON2_OFF\r\n"winking smiley;
}
Delay10KTCYx(0);
Delay10KTCYx(0);
}

}

donc j'ai une question à ce sujet.... l'information d'état de BOUTON1 pressed m'est remontée quasiment en permanence, je dois le recevoir une bonne centaine de fois par minute, alors que je n'ai besoin de l'info qu'une fois...j'ai tenté de mettre des delay mais à priori ce n'est pas la bonne méthode...
l'information pour BOUTON2 (ON, OFF) est également erronée remonte au PC plusieurs fois comme précisé pour le BOUTON1.
Pourriez vous m'aider à traiter ce problème de rebond sur mes retours capteurs ?

par contre je recontre également quelques problèmes de stabilité avec la com, et je me demandais s'il ne vallait pas mieux réorienter mon projet vers une stack USB en HID plutot qu'en simulation de port de COM. qu'en pensez vous ?

Merci pour votre aide.
Tiamat.

Re: PIC18F4550 et probleme d'interrupteurs
samedi 6 juin 2009 08:49:22
Salut,

Je ne pense pas que ce soit un problème de répond, c'est surtout que tu lui dit d'envoyer l'information le bouton est à 1
if(BOUTON1 == 1){
if(mUSBUSARTIsTxTrfReady()){
putrsUSBUSART("BOUTON1_PRESSED\r\n"winking smiley;
}
Delay10KTCYx(0);
Delay10KTCYx(0);
}

Ton code fonctionnant en pooling, c'est à dire que cycliquement le pic va lire le bouton et envoyer le message, tant que ton bouton est appuyé, il enverra le message.

Tu dois déclarer une variable static qui garde l'état du bouton du cycle précédent, et non plus faire l'analyse sur l'état du bouton mais sur le changement d'état du bouton. (S'il est passé de 0 à 1). Une fois ça fait, un petit délais de quelque milliseconde suffiront pour résoudre les problèmes de rebond

Bon travail,

Benjamin
Re: PIC18F4550 et probleme d'interrupteurs
samedi 6 juin 2009 21:49:57
Salut Benjamin,

merci de ta réponse.
J'ai un peu avancé sur le sujet et en effet j'avais oublié de prendre en compte l'état précédent du capteur, j'ai donc fait le nécessaire et rajouté une tempo pour le rebond mais il s'avère que j'ai toujours beaucoup trop de captures de valeurs...

par contre j'ai remarqué que j'avais des valeurs remontées sur le PC qui sont incohérentes, et j'ai tenté de mettre en place une routine qui capture l'état des interrupteurs pendant n cycles et ne va informer le PC d'un réel changement d'état que si mon interrupteur n'a pas changé d'état pendant ces n cycles...
ma routine marche bien mais rien n'y fait j'avais toujours autant d'incohérence (mais avec moins de remontées de données étant donné que j'ai un traitement plus important...)

j'ai donc revu mon schéma elec que j'ai repris de celui que tu présentes sur ton site et je t'en remercie encore ! ;-)
Et on m'a indiqué qu'il y avait une erreur sur les sorties RD0 et RD1, celle qui ont les interrupteurs, il semblerait que les résistances sont de trop et que mes problèmes de capture de données sont normales avec un montage comme ceci. Les interrupteurs doivent être mis entre la sortie du PIC et la masse directement...

que penses tu de cette info ? est ce que tu as pu récupérer des données grace à ton schéma sans problèmes ? n'as tu pas eu d'incohérences ?


Merci de ton aide !
++
Tiamat.
Re: PIC18F4550 et probleme d'interrupteurs
samedi 6 juin 2009 22:54:08
Re,

ne tiens pas compte de mon précédent post ! j'ai fait une erreur dans mon schéma... la résistance ne dois pas être en série de l'inter et de la masse mais liée au +5 alors que l'inter est lui connecté à la masse..

l'erreur est bien de moi, pas de ton schéma qui est correct !...

Encore désolé. ;-)
Seuls les utilisateurs enregistrés peuvent poster des messages dans ce forum.

Cliquez ici pour vous connecter