Bonjour tout le monde.
J'aimerais réaliser un filtre anti-rebond pour récupérer l'état d'un bouton poussoir sur la patte d'un PIC, savez-vous comment on procède?
Merci
-----
Bonjour tout le monde.
J'aimerais réaliser un filtre anti-rebond pour récupérer l'état d'un bouton poussoir sur la patte d'un PIC, savez-vous comment on procède?
Merci
Salut,
tu fais une petite temporisation ( quelques ms )
après la détection d'un changement d'état.
A+ ....Rémy.
je précise, c'est au niveau logiciel (en C) que je cherche à réaliser l'anti-rebond.
merci
je fais mon filtre dans une interruption et mon interruption est levée toutes les 2 ms mais j'ai toujours des problèmes, des fois ça marche des fois ça marche pas.
Peut etre que si je met ce que j'ai déjà fait ça serait mieux.
Voilà mon interruption:
void Interrupt_Hi(void)
{
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
LATBbits.LATB0 =~LATBbits.LATB0;
temp=(temp|PORTDbits.RD0);
var=0x01;
ACCU=0;
while(var<0x80) //somme des états de 8 états mémorisés
{
ACCU=ACCU+(temp&var);
var=(var<<1); //décalage à gauche des bits
}
if(ACCU<4 && BPOUSSOIR==NONAPPUYE) BPOUSSOIR=APPUYE;
else
if(ACCU>4 && BPOUSSOIR==APPUYE) BPOUSSOIR=NONAPPUYE;
temp=(temp<<1); //décalage à gauche des bits
WriteTimer0(63900);
}
}
et voici mon main:
void main()
{
char c;
TRISB = 0b00001100;
LATB = 0b11111111;
TRISD = 0b11111100;
LATD = 0b11111111;
//CONFIGURATION DE L'USART
OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX,
25 ); //(4 MHz /(16*9600))-1 en Low Speed
OpenTimer0(
(unsigned char )T0_16BIT & // Timer0 16bits, horloge int,
T0_SOURCE_INT & T0_PS_1_1 & // prescale : 1
TIMER_INT_ON // interruption par le timer0
);
WriteTimer0(0);
RCONbits.IPEN = ENABLE;
INTCONbits.GIEH = ENABLE;
//Configuration de l'USART
FOREVER // boucle infinie
{
if(BPOUSSOIR==NONAPPUYE && BPOUSSOIR!=BPOLD)
{
putcUSART('a');
BPOLD=BPOUSSOIR;
}
/*---------------------------------------------------------------------------------*/
/* Envoi un char à l'uart du pic et fait un echo sur l'uart vers le pc */
/*---------------------------------------------------------------------------------*/
if (DataRdyUSART()) // ch ck USART read buffer
{
c = getcUSART(); // lire caractère
putcUSART(c); // renvoi l'echo du caractère entré en hyperterm
while (BusyUSART()); // attendre jusqu'à ce que la transmission soit finie
}
}
}
Bonjour,
Oulalala, ca c'est du code pas tres lisible
Le but de l'interruption, c'est d'arretter la tache en cour pour en faire une autre, et tres rapidement finir l'autre.
Dans ce code, l'interruption est affreusement longue :s
Mieux veux definir un variable (ou tableau) globale, de l'incrementer dans l'interruption, et de la traiter dans le main.
Bon, après, reste le problème de l'anti rebond.
Ce qu'il faut, c'est eviter les multiples interruptions (par la je veux dire plein qui s'enchainent au lieu d'une).
Si le signal arrivant doit absolument passer par l'interruption, je serais pour un filtre extern (passif).
Mais si quelqu'un à une idée logiciel, ca m'interresse aussi
Je ne peux pas faire avec un filtre passif on m'a catégoriquement interdit de le faire parce que je dois pouvoir le reconfigurer à tout moment. Certains de mes collègues savent très bien le faire logiciellement mais moi je suis apprenti ingénieur, je débute depuis presque 2 semaines avec les PIC que j'ai jamais vu et je dois me débrouiller à trouver tout seul. Et pour le code désolé c'est la première fois que j'en met un en post je savais pas du tout ce que ça allait donner.
Une solution est de scruter le BP à l'aide d'un timer générant une interruption toutes les x ms.
On mémorise les 10 dernières mesures par exemple, et quand toutes les valeurs sont identiques, on considère que le signal est stable.
A+
Oui Jack c'est à peu près ce que j'ai fais. J'ai levé une interruption avec le timer0 toutes les 2 ms et g mémorisé les 8 derniers états grâce à un seul octet pour optimisation de la mémoire. J'ai trouvé comment on fait et ça marche nikel maintenant. Si quelqu'un veut savoir vous savez où m'écrire.
Merci tout le monde.
bonjour,
je sais que le sujet est assez ancien mais pour moi j'ai le même problème maintenant, donc je voudrais savoir svp comment vous avez procéder.
merci de bien vouloir me répondre.