[Programmation] Interrupt qui ne se déclenche pas
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Interrupt qui ne se déclenche pas



  1. #1
    ktber

    Question Interrupt qui ne se déclenche pas


    ------

    Bonjour,
    J'ai récemment fait un petit projet à base d'un ATtiny 85 qui allume des LEDs après avoir été réveillé de son sleep mode à la suite d'un interrupt (PCINT4).
    Le pin PB4 (qui correspond au PCINT4) n'est relié à rien il est flottant et l'appui sur un bouton le relie à la masse.
    Le problème est que avec le modèle de bouton que j'utilise (un petit bouton tactile monté en surface (SMD)), le microcontrôleur ne sort pas de son sleep mode car l'interrupt n'est pas déclenché.
    Cela fonctionne très bien en revanche avec d'autres boutons.
    Je précise que le bouton n'est pas défectueux, il fonctionne bien comme prévu et le pin PB4 es bien relié à la masse quand le bouton est pressé. C'est le changement d'état à l'appui du bouton qui n'est pas détecté par le microcontrôleur.

    Est-ce un problème de debouncing?
    Merci de votre aide !

    (Voici mon code (en C, compilé avec Atmel Studio) pour la fonction du sleep mode comprenant l'interrupt : )

    Code:
    int main()
    {
    	
    	DDRB = 0b00001111;                      // PB0/PB1/PB2/PB3 as output, PB4/PB5 as input
    	PORTB |= (1<<PB4);                      // internal pullup on PB4
    		
    	while (1)
    	{
    		sleep();
                    /*Allume des LEDs*/
    		PORTB |= (1<<PB4);
    	}
    }
    
    void sleep()
    {
    
    	GIMSK |= (1<<PCIE);                     // Enable Pin Change Interrupts
    	PCMSK |= (1<<PCINT4);                   // Use PB4 as interrupt pin
    	
    	ADCSRA &=~(1<<ADEN);                    // Disable ADC
    	ACSR |= (1<<ACD);                       // Disable Analog comparator
    	
    	set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // Power down mode
    
    	sleep_enable();                         // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
    	sei();                                  // Enable interrupts
    	sleep_cpu();                            // sleep
    
    	cli();                                  // Disable interrupts
    	PCMSK &= ~(1<<PCINT4);                  // Turn off PB4 as interrupt pin
    	sleep_disable();                        // Clear SE bit
    
    	sei();                                  // Enable interrupts
    }

    -----

  2. #2
    antek

    Re : Interrupt qui ne se déclenche pas

    Vaut mieux pas laisser une pin en l'air.
    Un BP qui ne fonctionne pas ? As-tu mesuré sa résistance ?

  3. #3
    ktber

    Re : Interrupt qui ne se déclenche pas

    Le pin en l'air n'est pas idéal en effet mais mon circuit est déjà fait, c'est plus compliqué de le changer maintenant surtout que ca marche très bien avec un autre bouton (plus gros). Le BP fonctionne bien pourtant, ouvert quand on n'appuie pas dessus et 0,2 ohm de résistance quand il est fermé. Si c'est une question de debouncing, l'interrup peut-il être perturbé à ce point la par le rebond du bouton? Au point de ne pas de déclencher?
    Dernière modification par ktber ; 30/10/2016 à 12h30.

  4. #4
    DAUDET78

    Re : Interrupt qui ne se déclenche pas

    Met une résistance de PullUP de 10K sur ton bouton !
    J'aime pas le Grec

  5. A voir en vidéo sur Futura
  6. #5
    mag1

    Re : Interrupt qui ne se déclenche pas

    Bonjour,

    Y a pas moyen d'activer une pullup interne sur ces µC ?

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  7. #6
    ktber

    Re : Interrupt qui ne se déclenche pas

    Y a pas moyen d'activer une pullup interne sur ces µC ?
    Déja fait. :
    Code:
    DDRB = 0b00001111;
    PORTB |= (1<<PB4);
    Met une résistance de PullUP de 10K sur ton bouton !
    C'est ce que j'ai fait. Le bouton réagit une fois sur dix maintenant, mais cela ne marche toujours pas comme il faut.

  8. #7
    DAUDET78

    Re : Interrupt qui ne se déclenche pas

    Faut mettre un circuit antirebond ... hard ou soft !

    Version hard :
    Nom : Anti-rebond Hard.JPG
Affichages : 119
Taille : 26,2 Ko
    J'aime pas le Grec

  9. #8
    ktber

    Re : Interrupt qui ne se déclenche pas

    Merci pour votre schéma mais comme je l'ai dit plus haut mon circuit imprimé est déjà fabriqué donc je ne peux plus vraiment le changer.
    La solution serait alors un antirebond en software (adapté aux interrupts). Ceci dit, un interrupt est censé détecter un changement d'état sur le pin, c'est étrange que, même avec du rebond, il ne détecte rien du tout.
    Quelqu'un à t'il une solution ? Ou un morceau de code pour l'antirebond sur l'interrupt?
    Merci

  10. #9
    DAUDET78

    Re : Interrupt qui ne se déclenche pas

    Citation Envoyé par ktber Voir le message
    comme je l'ai dit plus haut mon circuit imprimé est déjà fabriqué donc je ne peux plus vraiment le changer.
    Fait mon montage en volant ! On sera sûr, si ça marche, que c'est un problème de rebond .
    J'aime pas le Grec

  11. #10
    Calou80

    Re : Interrupt qui ne se déclenche pas

    Tu pourrais poster un schéma? Car j'ai l'impression que utilise PB4 en entrée pour ton interrupt ET en sortie pour ta Led, d'après ton code.

  12. #11
    Seb.26

    Re : Interrupt qui ne se déclenche pas

    Ton code est bizarre :
    Code:
    PORTB |= (1<<PB4);                      // internal pullup on PB4
    ...
    ...
    /*Allume des LEDs*/
    PORTB |= (1<<PB4);
    ça sent le copier-coller foireux ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #12
    ktber

    Re : Interrupt qui ne se déclenche pas

    Mon schéma :
    Nom : Schéma.jpg
Affichages : 102
Taille : 73,0 Ko

    ça sent le copier-coller foireux ...
    Non, j'ai remplacé tout le code qui allume les leds par "/*Allume des LEDs*/" pour simplifier, et le "PORTB |= (1<<PB4);" dans le while(1) est juste là pour être sur que le pullup est bien actif avant de rentrer en mode sleep (même si il est aussi activé à l'allumage du µC).
    Il n'y à pas de leds sur le PB4.

  14. #13
    Seb.26

    Re : Interrupt qui ne se déclenche pas

    Citation Envoyé par ktber Voir le message
    Non, j'ai remplacé tout le code qui allume les leds par "/*Allume des LEDs*/" pour simplifier, et le "PORTB |= (1<<PB4);" dans le while(1) est juste là pour être sur que le pullup est bien actif avant de rentrer en mode sleep (même si il est aussi activé à l'allumage du µC).
    Il n'y à pas de leds sur le PB4.
    on peut pas dire que tu nous simplifies la tache ...

    Donne le code complet (ou avec juste PB3 pour tester)

    Mais du coup ça ressemble à un problème de rebond ... seul Daudet étant équipé d'une boule de crystal ça va être dur de t'aider plus ...
    Dernière modification par Seb.26 ; 31/10/2016 à 13h08.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  15. #14
    Seb.26

    Re : Interrupt qui ne se déclenche pas

    Essaye aussi d'ajouter une capa de découplage sur l'alim pour voir ...

    ... et le RESET ... c'est fait comment ?

    PS: comment sais tu que l'IT ne se déclenche pas ???
    Dernière modification par Seb.26 ; 31/10/2016 à 13h14.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  16. #15
    ktber

    Re : Interrupt qui ne se déclenche pas

    Le découplage sur l'alim ne change rien (c'est une pile bouton de 3v).
    Le pin du reset est flottant (en l'air) car je m'en sert comme entrée analogique pour générer un nombre aléatoire. Ce n'est pas ça qui à l'air de poser problème en revanche car mettre un pullup dessus ne change rien. En revanche en changeant de bouton en en mettant un beaucoup plus gros ça marche. C'est donc surement un problème de rebond, oui.
    Je ne fait que supposer que linterrup ne se déclenche pas car le µC ne sort pas du mode sleep à l'appui du bouton.

  17. #16
    Seb.26

    Re : Interrupt qui ne se déclenche pas

    Citation Envoyé par ktber Voir le message
    Le découplage sur l'alim ne change rien (c'est une pile bouton de 3v).
    Le pin du reset est flottant (en l'air) car je m'en sert comme entrée analogique pour générer un nombre aléatoire. Ce n'est pas ça qui à l'air de poser problème en revanche car mettre un pullup dessus ne change rien. En revanche en changeant de bouton en en mettant un beaucoup plus gros ça marche. C'est donc surement un problème de rebond, oui.
    Je ne fait que supposer que linterrup ne se déclenche pas car le µC ne sort pas du mode sleep à l'appui du bouton.
    Tu peux nous faire une photo du bouton en question ? ... et de la carte ...

    PS: si c'est des rebonds, essaye de sécuriser ça par un bête et méchant delay (pour le moment) ... tu verras bien si c'est ça ... si tu as un oscillo, tu peux aussi faire une boucle qui duplique l'état d'entrée du BP sur une de tes sorties et voir ce que ça donne ...
    Dernière modification par Seb.26 ; 31/10/2016 à 17h11.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  18. #17
    gienas
    Modérateur

    Re : Interrupt qui ne se déclenche pas

    Bonjour ktber et tout le groupe


    Citation Envoyé par ktber Voir le message
    ... Le problème est que avec le modèle de bouton que j'utilise (un petit bouton tactile monté en surface (SMD)) ... Cela fonctionne très bien en revanche avec d'autres boutons.
    Je précise que le bouton n'est pas défectueux ...
    Hum hum.

    J'aurais tendance à supposer que ce n'est pas la qualité du contact qui est en cause, mais plutôt la "géographie" de la carte.

    Tu ne précises pas comment tu agis sur le poussoir.

    Je vois "d'ici" un "gros" doigt qui appuie sur le minuscule bouton, et qui touche aussi (le doigt) les bornes voisines, et qui transforment ce doigt un peu conducteur, en une antenne émettrice des signaux environnants.

    Je n'exclus pas d'ailleurs, que l'injection (de signal) soit même plus directe que la radio. Le doigt fait peut-être un pont entre un générateur de signaux et une entrée haute impédance.

    Ce pourrait être vérifiable en remplaçant le doigt par une tige fine et isolante pour actionner le poussoir miniature.

    J'imagine que le test avec des d'autres boutons a consisté à câbler avec des fils, un poussoir placé hors du circuit.

    Avec un peu de chance, si l'habillage du circuit prévoit un poussoir physique isolant extérieur au circuit imprimé, le problème ne se manifestera plus.

Discussions similaires

  1. interrupt
    Par hessino02 dans le forum Électronique
    Réponses: 6
    Dernier message: 15/05/2015, 14h23
  2. external interrupt pic 18f25k20
    Par invited40f9802 dans le forum Électronique
    Réponses: 0
    Dernier message: 10/10/2012, 11h32
  3. Interrupt on change + fonction
    Par amoniaque dans le forum Électronique
    Réponses: 3
    Dernier message: 09/01/2011, 19h57
  4. Mikrobasic LCD et interrupt
    Par jpjcb66 dans le forum Électronique
    Réponses: 0
    Dernier message: 19/10/2009, 15h28
  5. Interrupt on change
    Par Qristoff dans le forum Électronique
    Réponses: 12
    Dernier message: 01/02/2009, 18h14
Découvrez nos comparatifs produits sur l'informatique et les technologies.