[Programmation] Gestion d'interruption
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Gestion d'interruption



  1. #1
    inviteafdba76f

    Gestion d'interruption


    ------

    Bonjour à la communauté,

    je suis bloqué depuis quelques heures sur un problème. En effet, je souhaite commander par microprocesseur, la vitesse d'un moteur et un temps de marche avec une LED et une couleur affecté par mode ( Ex LED rouge correspond à grande vitesse et 4 min en ON). Le choix des modes doit se faire par bouton poussoir. J'ai su gérer l'interruption mais j'ai deux soucis :

    - Lors de l'appui sur le bouton poussoir, les 4 choix (indiqué par la couleur de la led) défilent trop vite, et je tombe au hasard sur une couleur lors du relachement. Le moteur se lance, et je dois attendre le temps.

    -Le second problème découle du second, lorsqu'un mode est lancé, j'aimerai pouvoir après appui sur mon bouton changer de mode.

    Je remercie beaucoup par avance ceux qui prendront le temps de m'aider. J'espère avoir été clair. Je vous mets le morceau de code correspondant à l'interruption ci dessous: ( StatoIn==0 correspond à une détection de l'appui bouton)

    Code:
      if(StatoIn1==0){
         
            if(mode>4)mode=0;
          switch (mode){
            case 1:  
            for(d=0;d<20000;d++){ //20000 -> 1 secondes
            GPIO_WriteHigh(GPIOB,GPIO_PIN_1);
            GPIO_WriteHigh(GPIOC,GPIO_PIN_1);
          }
            GPIO_WriteLow(GPIOB,GPIO_PIN_1);
            GPIO_WriteLow(GPIOC,GPIO_PIN_1);
            break;
            case 2:
            for(d=0;d<20000;d++){ //20000 -> 1 secondes
            GPIO_WriteHigh(GPIOB,GPIO_PIN_2);
            GPIO_WriteHigh(GPIOC,GPIO_PIN_1);
                     }
            GPIO_WriteLow(GPIOB,GPIO_PIN_2);
            GPIO_WriteLow(GPIOC,GPIO_PIN_1);
            break;
            case 3:
            for(d=0;d<20000;d++){ //20000 -> 1 secondes
            GPIO_WriteHigh(GPIOB,GPIO_PIN_3);
            GPIO_WriteHigh(GPIOC,GPIO_PIN_1);
                     }
            GPIO_WriteLow(GPIOB,GPIO_PIN_3);
            GPIO_WriteLow(GPIOC,GPIO_PIN_1);
            break;
            case 4:
            for(d=0;d<20000;d++){ //20000 -> 1 secondes
            GPIO_WriteHigh(GPIOB,GPIO_PIN_1);
            GPIO_WriteHigh(GPIOB,GPIO_PIN_2);
        GPIO_WriteHigh(GPIOB,GPIO_PIN_3);
            GPIO_WriteHigh(GPIOC,GPIO_PIN_1);
                     }
            GPIO_WriteLow(GPIOB,GPIO_PIN_1);
            GPIO_WriteLow(GPIOB,GPIO_PIN_2);
            GPIO_WriteLow(GPIOB,GPIO_PIN_3);
            GPIO_WriteLow(GPIOC,GPIO_PIN_1);
            break;
             
            }//StatoIn1==1;
      }
     
    }

    -----
    Dernière modification par Antoane ; 04/06/2018 à 10h05. Motif: Ajout balises code

  2. #2
    indri

    Re : Gestion d'interruption

    Quelques suggestions: précise quel µc que tu utilise, poste tout le code (StatoIn il sort d'où?) et peut-être aussi le schéma!
    Là où va le vent...

  3. #3
    inviteafdba76f

    Re : Gestion d'interruption

    Bonjour Indri. Merci de ta réponde, tu as tout a fait raison.
    Je travaille avec un stm8s003. StatoIn1 est une variable me permettant de détecter le front descendant et donc un appui sur le bouton poussoir.
    Je souhaite faire cela :
    1 appui -> mode 1 ( led verte moteur Nvitesse etc .)
    2 appui -> mode 2
    ..
    ème appui-> on revient au mode 1

    Voici l'entiereté du code:

    Code:
    INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
    {
    	u16 d;
    	extern u16 StatoIn1;
    
    	In1=GPIO_ReadInputPin(GPIOD,GPIO_PIN_7);
      GPIO_WriteLow(GPIOB,GPIO_PIN_1);
    	
    	if (In1==0)
    	{ //Si l'entrée est à 0
    	  
    		In1_0++;
    		In1_1=0;
    		if(In1_0> Debounce)
    		{ In1_0=Debounce+1;
    			StatoIn1=0;
    			mode++;	 
    	  }
    	}
    	else {//si l'entrée est à 1		In1_1++;
    		In1_0=0;
    		In1_1++;
    		if(In1_1> Debounce)
    		{
    		 	In1_1=Debounce+1;
    			StatoIn1=1;
    			}
    		}
    			
    	if(StatoIn1==1){
    	GPIO_WriteLow(GPIOC,GPIO_PIN_1);
    	GPIO_WriteLow(GPIOB,GPIO_PIN_0);
    	
    	
    	//GPIO_WriteLow(GPIOD,GPIO_PIN_1);
    		}
    		if(StatoIn1==0){
    		GPIO_WriteLow(GPIOB,GPIO_PIN_1);
    		GPIO_WriteLow(GPIOC,GPIO_PIN_1);
    		if(mode>4)mode=0;
     	  switch (mode){
    		case 0:    
    		for(d=0;d<20000;d++){ //20000 -> 1 secondes
    		GPIO_WriteHigh(GPIOB,GPIO_PIN_1);
    		GPIO_WriteHigh(GPIOC,GPIO_PIN_1);
    	  }
    		GPIO_WriteLow(GPIOB,GPIO_PIN_1);
    		GPIO_WriteLow(GPIOC,GPIO_PIN_1);
    	  break;
    	
    		case 1: 
    		for(d=0;d<20000;d++){//20000 -> 1 secondes
    		GPIO_WriteHigh(GPIOB,GPIO_PIN_2);
    		GPIO_WriteHigh(GPIOC,GPIO_PIN_1);
    		}				
    		GPIO_WriteLow(GPIOB,GPIO_PIN_2);
    		GPIO_WriteLow(GPIOC,GPIO_PIN_1);
       	break;}	
    
    }TIM4_ClearITPendingBit(TIM4_IT_UPDATE); 
    
    }

  4. #4
    jiherve

    Re : Gestion d'interruption

    bonjour,
    comment "debounce" est il défini et évolue t'il ?
    Pour détecter un front de façon propre il faut échantillonner l'entrée à intervalles régulier (supérieur au temps de rebond) faire un petit registre à décalage et un vote majoritaire ou équivalent sur 3 valeurs consécutives ou bien disposer d'une interruption sur front qui soit propre.
    JR
    l'électronique c'est pas du vaudou!

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

    Re : Gestion d'interruption

    Bonjour, Hervé tout d'abord merci de ta réponse.
    Debounce est défini à une valeur de 10 (ms)
    Tu as raison, là je détecte un passage à 0, et non un front. Saurais tu comment l'écrire ?
    Merci beaucoup de ton aide

  7. #6
    jiherve

    Re : Gestion d'interruption

    Re
    comme écrit il faut échantillonner l'entrée plusieurs fois ,le minimum c'est deux et on fait :
    In-1 <= In; In <= état switch
    et ensuite Sn <= (In xor In-1) and (not In) si switch passe de 1 à zéro pendant une période d'échantillonnage alors Sn passe à 1 pendant une période d'échantillonnage
    ou mieux :
    In-2 <= In-1 ; In-1 <= In; In <= état switch
    suivi d'un vote majoritaire:
    Vn-1 <= Vn ; Vn <= (In and In-1)or(In and In-2)or (In-1 and In-2)
    suivi à nouveau d'un différenciateur
    Sn <= (Vn xor Vn-1) and (not Vn) là Sn passe à 1 pendant une période d'échantillonnage si Swicth est vu à zéro pendant au moins deux périodes d'échantillonnage mais pas nécessairement successives un rebond aura pu se produire entre In et In-2mais on ne le verra pas
    autre solution:
    In-2 <= In-1 ; In-1 <= In; In <= etat switch
    Vn-1 <= Vn ; Vn <= In or In-1 or In-2
    Sn <= (Vn xor Vn-1) and (not Vn) là Sn passe à 1 pendant une période d'échantillonnage si Swicth est vu à zéro pendant trois périodes d'échantillonnage successives
    L'avantage des deux dernières méthodes c'est qu'elles permettent de diminuer la période d'échantillonnage tout en assurant un antirebond efficace .
    JR
    l'électronique c'est pas du vaudou!

  8. #7
    inviteafdba76f

    Re : Gestion d'interruption

    Merci beaucoup Hervé. Je vais intégrer tout cela. Je reviens vers toi

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/06/2015, 22h41
  2. Probleme de gestion d'interruption pic18
    Par invite105cee1c dans le forum Électronique
    Réponses: 11
    Dernier message: 08/02/2015, 20h04
  3. Gestion Interruption PIC18F
    Par invite0e0d6f65 dans le forum Électronique
    Réponses: 5
    Dernier message: 22/08/2012, 16h47
  4. [PIC]- Gestion Interruption -> Module EUSUART
    Par invite3c35244f dans le forum Électronique
    Réponses: 3
    Dernier message: 03/08/2009, 15h11
  5. Gestion des interruption avec un PIC
    Par schneiderj dans le forum Électronique
    Réponses: 3
    Dernier message: 08/03/2008, 16h26
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...