Interrupt on change + fonction
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Interrupt on change + fonction



  1. #1
    invitedb9b1ced

    Interrupt on change + fonction


    ------

    Bonjour,

    J'utilise un PIC18F14K50 sur lequel j'ai un bouton poussoir (avec pull up) connecté à RA3. Une DEL sur RC0.

    Le but est de changer l'état de la DEL lors de l'appuie sur le BP et ça via interruption.

    Mon problème est que je n'arrive pas à "extérioriser" cette fonction. En gros je configure bien mon interruption, elle est correctement détectée mais tout ça dans le main() tout en scrutant le flag.

    J'aimerais que dès que le flag apparaît alors une fonction est appelée.

    Ce code fonctionne mais il n'a aucun intérêt, autant directement copier la valeur de l'entrée sur la sortie ...

    Voici mon code (sous MPLAB avec C18):

    Code:
    #pragma config MCLRE = OFF  //MCLR disable
    
    void main (void)
    {
    	char Sens, ValeurRA3;
    	TRISC = 0xF0;	//RC0-RC3 en sorties, RC4-RC7 en entrées
    	
    	IOCAbits.IOCA3 = 1;	//interrupt on change sur RA3
    	
    	INTCONbits.RABIF = 0;	//flag interrupt on change sur portA-B
    	
    	while (1)
    	{
    		if (INTCONbits.RABIF == 1)	// si flag de l'interruption à 1
    		{
    			if (Sens == 0)
    			{
    				PORTCbits.RC0 = 1;
    				Sens = 1;
    			}//if
    			else
    			{
    				PORTCbits.RC0 = 0;
    				Sens = 0;
    			}//else		
    			
    			ValeurRA3 = PORTAbits.RA3;	//lecture de l'entrée puis màz du flag
    			INTCONbits.RABIF = 0;
    		}	//if	
    	}	//while	
    	
    }	//main

    -----

  2. #2
    herrmattoon

    Re : Interrupt on change + fonction

    Salut,
    tu peux déclarer une variable qui est mise à 1 dans l'interruption lorsque le bouton est pressé. Dans le main, tu fais un contrôle de cette variable. Si elle est à un, tu appelles la fonction voulue après avoir remis le flag à zéro.
    Ca n'a pas beaucoup de sens de le faire ainsi si tu ne dois contrôler que ce flag, mais l'utilité de faire ainsi prend du sens dans l'implémentation d'une machine d'états-transitions, avec la mise à jour de l'état après le contrôle des variables.
    Voilà, j'espère t'avoir un peu aidé a plus!
    P.S. PIC18F13/14k50 = caca selon moi!

  3. #3
    invitedb9b1ced

    Re : Interrupt on change + fonction

    Hello

    Non ça j'aurais pu le faire sans problème . Ça demande toujours de scruter le flag et ensuite de renvoyer vers une fonction externe au main.
    Ce que je cherche à faire c'est le principe même d'une interruption : une fois qu'elle est détectée, un morceau de code est automatiquement exécuté. Pas besoin de scruter s'il y a ou non un flag ...

  4. #4
    invitedb9b1ced

    Re : Interrupt on change + fonction

    J'ai trouvé !
    En fouillant sur le forum et en lisant le guide utilisateur de C18 : http://forums.futura-sciences.com/el...ion-mplab.html.

    Voici mon code si ça peut aider quelqu'un :

    Code:
    void high_isr(void);
    
    /*
    For PIC18 devices the high interrupt vector is found at 00000008h. The following code will branch to the high_interrupt_service_routine function to handle
    interrupts that occur at the high vector.*/
    
    #pragma code high_vector=0x08
    void interrupt_at_high_vector(void)
    {
    	_asm GOTO high_isr _endasm
    }
    #pragma code /* return to the default code section */
    
    #pragma interrupt high_isr
    void high_isr (void)
    {
    	if (PORTAbits.RA3 == 0)
    	{
    		if (Sens_highISR == 0)
    		{
    			PORTCbits.RC0 = 1;
    			Sens_highISR = 1;
    		}	//if
    		else
    		{
    			PORTCbits.RC0 = 0;
    			Sens_highISR = 0;
    		}	//else		
    	}	//if	
    	
    	INTCONbits.RABIF = 0;	//flag interrupt on change sur portA-B
    }
    
    
    void main (void)
    {
    	TRISC = 0xF0;	//RC0-RC3 en sorties, RC4-RC7 en entrées
    	
    	IOCAbits.IOCA3 = 1;	//interrupt on change sur RA3
    	INTCONbits.GIE = 1;	//enable global interrupt
    	INTCONbits.PEIE = 1;	//enable peripheral interrupt
    	INTCONbits.RABIE=1;	//enable interrupt on change
    	INTCONbits.RABIF = 0;	//flag interrupt on change sur portA-B
    	
    	while (1)
    	{
    	}	//while	
    }	//main

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Mikrobasic LCD et interrupt
    Par jpjcb66 dans le forum Électronique
    Réponses: 0
    Dernier message: 19/10/2009, 15h28
  2. Su : passwd change
    Par invite70eda27f dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 27/04/2009, 11h07
  3. Changé d'académie
    Par inviteb2d6b60e dans le forum Orientation avant le BAC
    Réponses: 0
    Dernier message: 16/03/2009, 09h48
  4. Interrupt on change
    Par Qristoff dans le forum Électronique
    Réponses: 12
    Dernier message: 01/02/2009, 18h14
  5. problème interrupt. M/A Philips 20P4292
    Par doubleyou dans le forum Dépannage
    Réponses: 0
    Dernier message: 02/09/2006, 20h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...