USB/PIC18F4550: PB rebond information

Interfaces électroniques séries, parallèles, USB etc

Modérateur : Modérateur

tiamat
NOUVEAU
NOUVEAU
Messages : 1
Inscription : 03 juin 2009 12:42

USB/PIC18F4550: PB rebond information

Message par tiamat »

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 : Tout sélectionner

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

#define BOUTON1 PORTDbits.RD0
#define INTERR1 PORTDbits.RD1
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 : 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;
et voici la fonction CheckSensors() qui va renvoyer au PC l'état des deux interrupteurs:

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);
	}

}
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.
Répondre