USB/PIC18F4550: PB rebond information
Publié : 03 juin 2009 12:58
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:
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):
et voici la fonction CheckSensors() qui va renvoyer au PC l'état des deux interrupteurs:
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.
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 : Tout sélectionner
#define LED1 PORTCbits.RC0
#define LED2 PORTCbits.RC1
#define BOUTON1 PORTDbits.RD0
#define INTERR1 PORTDbits.RD1
Code : Tout sélectionner
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");
else
putrsUSBUSART("LED1_OFF\n");
}
break;
//LED2
case REQ_LED2:
LED2 = !LED2;
if(mUSBUSARTIsTxTrfReady()){
if(LED2 == 1)
putrsUSBUSART("LED2_ON\n");
else
putrsUSBUSART("LED2_OFF\n");
}
break;
Code : Tout sélectionner
//dans init
old_sw2 = INTERR1;
....
void CheckSensors(void){
//Bouton Poussoir
if(BOUTON1 == 1){
if(mUSBUSARTIsTxTrfReady()){
putrsUSBUSART("BOUTON1_PRESSED\r\n");
}
Delay10KTCYx(0);
Delay10KTCYx(0);
}
//Bouton ON/OFF
if(INTERR1 != old_sw2){
old_sw2 = INTERR1;
if(mUSBUSARTIsTxTrfReady() & INTERR1==0){
putrsUSBUSART("BOUTON2_ON\r\n");
}
else if(mUSBUSARTIsTxTrfReady() & INTERR1==1){
putrsUSBUSART("BOUTON2_OFF\r\n");
}
Delay10KTCYx(0);
Delay10KTCYx(0);
}
}
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.