Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

anti rebond



  1. #1
    florian85

    anti rebond

    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

    -----


  2. Publicité
  3. #2
    remy01

    Re : anti rebond

    Salut,
    tu fais une petite temporisation ( quelques ms )
    après la détection d'un changement d'état.
    A+ ....Rémy.

  4. #3
    florian85

    Re : anti rebond

    je précise, c'est au niveau logiciel (en C) que je cherche à réaliser l'anti-rebond.
    merci

  5. #4
    florian85

    Re : anti rebond

    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.

  6. #5
    florian85

    Re : anti rebond

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

  7. A voir en vidéo sur Futura
  8. #6
    Shaiton

    Re : anti rebond

    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
    Le Geek Sportif !

  9. Publicité
  10. #7
    florian85

    Re : anti rebond

    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.

  11. #8
    Jack

    Re : anti rebond

    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+

  12. #9
    florian85

    Re : anti rebond

    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.

  13. #10
    reder113

    Re : anti rebond

    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.

Sur le même thème :

Discussions similaires

  1. systeme anti rebond
    Par kevin35 dans le forum Électronique
    Réponses: 11
    Dernier message: 12/05/2011, 16h56
  2. anti rebond
    Par mattheo25 dans le forum Électronique
    Réponses: 7
    Dernier message: 26/07/2007, 13h03
  3. anti rebond
    Par bouly94 dans le forum Électronique
    Réponses: 29
    Dernier message: 17/07/2007, 12h56
  4. Circuit anti-rebond dans pont en H
    Par Mr.FLY dans le forum Électronique
    Réponses: 15
    Dernier message: 16/03/2007, 06h57
  5. Anti rebond
    Par zanzeoo dans le forum Électronique
    Réponses: 3
    Dernier message: 07/08/2004, 10h56