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

Problème d'interruption externe sur un ATMEGA



  1. #1
    Yoruk

    Problème d'interruption externe sur un ATMEGA


    ------

    Bonsoir à tous,

    Pour un projet en cours, j'ai besoin d'incrémenter et de décrémenter un afficheur 7 segments à l'aide de 2 boutons. L'incrémentation et la décrémentation de la variable sont réalisées au moyen d'interruptions. Je n'ai codé que l'incrémentation pour le moment, mais elle ne fonctionne pas correctement.

    Le code d'abord (j'ai retiré les parties non en rapport):

    Code:
    [...]
    
    void init_IO()
    {
    
    	//sens sorties 1:output 0:input 
    	DDRA = 0b11111111;    // 7 segment
    
    	DDRC = 0b11111111;  // 7 segment
    
    
    	//declaration de l'interruption
    	DDRD = 1<<PD2;		// Set PD2 as input (Using for interupt INT0)
    	PORTD = 1<<PD2;		// Enable PD2 pull-up resistor
    
    	GICR = 1<<INT0;		// Enable INT0
    	
    	
    	//MCUCR = 1<<ISC01 | 1<<ISC00;	// Trigger INT0 on rising edge
    	MCUCR = 1<<ISC01 | 0<<ISC00;	// Trigger INT0 on falling edge ???
    
    
    	sei();				//Enable Global Interrupt
    
    	//fin code interruption
    	//cli();// coupe interruption
    }
    
    
    
    
    void MiseAJourAfficheurs()
    {
    //met à jour les sorties
    
    
    [...]
    
    
    }
    
    
    
    
    //Interrupt Service Routine for INT0
    ISR(INT0_vect)
    {
    
    	_delay_ms(500); // Software debouncing control
     
      DigitDroite=DigitDroite+1;
      DigitGauche=DigitGauche+1;
      MiseAJourAfficheurs();
    
     }
    
    
    
    
    int main(void)
    {
      
    	//setup
    
    	init_IO();
    
    
    	TotalActions=16;
    
    
    	//couché le chien
    	WDTCR  = 0b00000000;
    
    
     	DigitDroite=0;
     	DigitGauche=0;
    
    
    	while(1) { //la loop
      
    
    
    // fait défiler les chiffres  
    
     DigitDroite=DigitDroite+1;
    DigitGauche=DigitGauche+1;
    
    
    
    if (DigitDroite>=10) {DigitDroite=0;}
    if (DigitGauche>=10) {DigitGauche=0;}
    
    _delay_ms(3000);  
    
    
    
    MiseAJourAfficheurs();
    
    
    	}
    
      return 1;
    }

    Coté hard, le montage est réalisé sur un ATMEGA8535. L'entrée du bouton est donc réalisée sur PD2 (INT0). Le registre MCUCR est configuré de façon à réagir au front descendant du signal. (J'ai tenté aussi montant...)


    Problèmes : j'ai tout d'abord codé sans mettre la résistance de pullup interne, et j'ai réalisé un montage classique : 5v - résistance de 10k - PD2 - switch et masse.

    Rien ne se passe quand je ferme le switch....?

    J'ai tenté d'activer la résistance de pull-up interne (PORTD = 1<<PD2; ) . Cette fois-ci, l'interruption fonctionne (en mettant la pin à la masse), mais pas de chance, un problème (de rebond ?) fait incrémenter l'afficheur de 2 ou 3, malgré la présence de la tempo de 500 ms dans le code de l'interruption. J'ai tenté de couper les interruptions en début d'interruption, j'ai tenté de filtrer en ajoutant une capa de 100 nF en // de mon switch, mais rien à faire. Pull-up interne ou externe, aucune configuration de fonctionne correctement...

    Une idée ?

    Merci !

    -----
    La robotique, c'est fantastique !

  2. Publicité
  3. #2
    jiherve

    Re : Problème d'interruption externe sur un ATMEGA

    Bonsoir,
    si l'on place un '1' dans un registre DDRx à la position n alors le bit n en question est en sortie!!
    Lire la data sheet avant de poser une question!!!!!!
    ceci dit il faudra filtrer car un swicth cela rebondi pas mal(2ms environ)
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    Yoruk

    Re : Problème d'interruption externe sur un ATMEGA

    Arfff j'avais pourtant fait attention... J'avais checké tout les registres sauf DDRD... Pour ma défense, c'est exactement le code posté sur le site d'où j'ai tiré cet extrait de code.

    Bon je viens de ré-essayer, sans activer la résistance interne (en la mettant donc externe) avec mon switch. ça fonctionne, mais je suis quand même obligé de filtrer en hard, j'ai ajouté une céramique de 100 nF en // de mon switch (malgré la tempo dans l'interruption ?). Je l'ai récupéré sur une épave, il doit être un peu fatigué... Mais en tout cas ça fonctionne !

    Merci !
    La robotique, c'est fantastique !

  5. #4
    jiherve

    Re : Problème d'interruption externe sur un ATMEGA

    Bonjour,
    il vaut mieux filtrer par soft, si tu fais une acquisition toutes les x mS alors attends d'avoir un certain nombre de confirmation pour valider l’état de ton switch.
    JR
    l'électronique c'est pas du vaudou!

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    Yoruk

    Re : Problème d'interruption externe sur un ATMEGA

    Il faudrait donc que j'arrive à compter le nombre d’interruptions dans un laps de temps donné pour valider effectivement l'appui ?
    La robotique, c'est fantastique !

  9. #6
    jiherve

    Re : Problème d'interruption externe sur un ATMEGA

    Bonjour,
    Pas seulement, en fait connecter un switch en direct ou presque sur une entrée sensible à un front est une mauvaise idée car il y a un risque de réentrance en cas de rebond rapide.
    Il vaut mieux utiliser une interruption à qqs ms générée par un timer et lire l’état de la pin d'entrée, on filtre ensuite.
    Sur le fil [PROJET]encodeur decodeur PPM il y a un bout de code qui fait tout çà très bien, tu peux t'en inspirer.
    JR
    l'électronique c'est pas du vaudou!

  10. Publicité
  11. #7
    Yoruk

    Re : Problème d'interruption externe sur un ATMEGA

    Ahh d'accord, il vaut mieux ne pas utiliser directement d'interruption liée à la détection du front montant... Je vais jeter un œil au code dont tu me parles.
    La robotique, c'est fantastique !

  12. #8
    jiherve

    Re : Problème d'interruption externe sur un ATMEGA

    Re
    si c'est possible mais il faut nettoyer le signal avant.
    JR
    l'électronique c'est pas du vaudou!

  13. #9
    GRAR_Mohammed

    Re : Problème d'interruption externe sur un ATMEGA

    Bonjour S'il vous plait j'ai le même problème ...

    Ou je peut trouver le projet pour s'inspirer moi aussi ??

    Merci beaucoup

  14. #10
    Yoruk

    Re : Problème d'interruption externe sur un ATMEGA

    Salut,

    Le code est donné en #1... mais après, tu as différents moyens pour résoudre le problème. (Faire une interruption basée sur un timer qui lit ton entrée, ou bien faire un filtrage hard et utiliser une interruption sur front montant/descendant...). C'est en fonction de ton application !
    La robotique, c'est fantastique !

Discussions similaires

  1. Assembleur: Interruption Externe sur PIC18F4685
    Par NoBusy dans le forum Électronique
    Réponses: 5
    Dernier message: 14/08/2014, 12h57
  2. Problème avec l'interruption externe du microcontrolleur.
    Par rami74 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/04/2013, 08h22
  3. Problème avec interruption externe sur PIC24F08KA102
    Par jean.decuigniere dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/07/2012, 19h19
  4. Problème avec interruption externe sur PIC24F08KA102
    Par jean.decuigniere dans le forum Électronique
    Réponses: 7
    Dernier message: 17/07/2012, 15h35
  5. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
Découvrez nos comparatifs produits sur l'informatique et les technologies.