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

Probleme interruptions C18 (encore)



  1. #1
    VIIV

    Probleme interruptions C18 (encore)


    ------

    Salut,
    Quelqu'un saurait pourquoi le PIC (18F4525) refuse de rentrer dans la procédure des interruptions?
    Merci

    Code:
    // Prototypes, declaration des variables, include etc...
    
    #pragma code interrupt_at_low_vector = 0x18
    
    void interrupt_at_low_vector(void)
    {
    	_asm goto Interruptions _endasm
    }
    
    #pragma code
    
    
    #pragma interruptlow Interruptions
    
    void Interruptions(void)
    {
    	printf("Entree dans les interruptions\r\n");
    
    	if(INTCONbits.RBIF == 1)
            {
    			nb_interruption_IOC++;
    			valeur_portb = PORTB;				
    			INTCONbits.RBIF = 0;				
    	}
    		
            else if(INTCONbits.INT0IF == 1)			
    	{
    		LisAdresseShort(0x30);	
    			
    		if(paquets_en_attente < 5)
    		{
    				RecoisBuffer(paquets_en_attente);
    		}
                    INTCONbits.INT0IF=0;			
    	}		
    }
    
    
    
    
    void main(void)
    {
            // Bla bla bla....
    }

    -----

  2. Publicité
  3. 📣 Nouveau projet éditorial de Futura
    🔥🧠 Le Mag Futura est lancé, découvrez notre 1er magazine papier

    Une belle revue de plus de 200 pages et 4 dossiers scientifiques pour tout comprendre à la science qui fera le futur. Nous avons besoin de vous 🙏 pour nous aider à le lancer...

    👉 Je découvre le projet

    Quatre questions à explorer en 2022 :
    → Quels mystères nous cache encore la Lune 🌙 ?
    → Pourra-t-on bientôt tout guérir grâce aux gènes 👩‍⚕️?
    → Comment nourrir le monde sans le détruire 🌍 ?
    → L’intelligence artificielle peut-elle devenir vraiment intelligente 🤖 ?
  4. #2
    sdec25

    Re : Probleme interruptions C18 (encore)

    Salut,
    Est-ce que tu as activé les interruptions basse priorité ?
    Essaie un main comme ça :
    Code:
    void main(void) {
    INTCONbits.GIE = 1;
    INTCONbits.GIEL = 1;
    xxxIP = 0;
    xxxIE = 1;
    xxxIF = 1;
    }

  5. #3
    VIIV

    Re : Probleme interruptions C18 (encore)

    Voici mon main:

    Code:
    	LATA = 0x00;
    	ADCON1 = 0x07;             				// Desactive l'ADC
    	CMCON  = 0x07;							// Desactive les comparateur	
    	TRISA = 0x00; 							// Configure le PORTA
        PORTA = 0x00;							// Met le PORTA a 0			
    
    	LATB = 0x00;
    	TRISB = 0b00110001;                   	// Configure le PORTB                      
    	PORTB = 0x00;
    
    	LATC = 0x00;
    	TRISC = 0x00;                     		// Configure le PORTC
    	PORTC = 0x00;
    
    	EnablePullups();
    
    	OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,15);
    	OpenSPI(SPI_FOSC_4,MODE_00,SMPEND);		// Configure SPI mode 0,0	 
    	
    	valeur_portb = PORTB;					// Lis le portb 
    	INTCONbits.RBIF = 0;					// Efface le flag de IOC
    
    	printf("\r1. USART initialiser\r\n");
    	printf("2. Etat de l'interruption RBIF: %b\r\n",INTCONbits.RBIF);
    
    	INTCON2bits.RBIP = 0;					// IOC basse priorite
    
    	OpenPORTB(PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON);
    sdec25 j'ai essayé comme tu as dis mais ça marche toujours pas.

  6. #4
    sdec25

    Re : Probleme interruptions C18 (encore)

    Comment sais-tu que l'interruption n'est pas déclenché ?
    Teste au simulateur pour en être sûr.
    Est-ce que ça fonctionne avec les interruptions haute priorité ?
    Tu peux poster ton code qui déclenche une interruption manuellement ?

  7. A voir en vidéo sur Futura
  8. #5
    RISC

    Re : Probleme interruptions C18 (encore)

    salut,
    Citation Envoyé par sdec25 Voir le message
    Salut,
    Est-ce que tu as activé les interruptions basse priorité ?
    Essaie un main comme ça :
    Code:
    void main(void) {
    INTCONbits.GIE = 1;
    INTCONbits.GIEL = 1;
    xxxIP = 0;
    xxxIE = 1;
    xxxIF = 1;
    }
    Attention...plusieurs problèmes...
    a/ le choix du mode d'interruptions (legacy ou priority)
    RCONbits.IPEN=0; (legacy = 1 seul vecteur)
    ou
    RCONbits.IPEN=1; (priority = 2 vecteurs)

    b1/ si mode legacy alors :
    xxxIF = 0; s'assurer que le flag est à 0
    xxxIE = 1; maintenant on peut autoriser l'interrupption choisie
    INTCONbits.PEIE = 1; nécessaire uniquement pour les INT périph
    INTCONbits.GIE = 1;

    b2/ si mode priority alors
    xxxIF = x ; choisir la priorité ( x=0 ou 1)
    xxxIF = 0; s'assurer que le flag est à 0
    xxxIE = 1; maintenant on peut autoriser l'interrupption choisie
    INTCONbits.GIEH = 1; autorisation INT haute priorité
    INTCONbits.GIEL = 1; autorisation INT haute priorité

    a+

  9. #6
    VIIV

    Re : Probleme interruptions C18 (encore)

    Code:
    #include <p18f4525.h>
    #include <portb.h>
    #include <stdio.h>
    #include <usart.h>
    
    
    static unsigned char valeur_portb,nb_interruptions_IOC;
    void Interruptions(void);
    
    
    #pragma code interrupt_at_low_vector = 0x18
    
    void interrupt_at_low_vector(void)
    {
    	_asm goto Interruptions _endasm;
    }
    
    #pragma code
    
    
    #pragma interruptlow Interruptions
    
    	void Interruptions(void)
    	{
    		printf("Entree dans les interruptions\r\n");
    
    		if(INTCONbits.RBIF == 1)
    		{
    			printf("%d\r\n",nb_interruptions_IOC);
    			nb_interruptions_IOC++;				
    			valeur_portb = PORTB;			
    			INTCONbits.RBIF = 0;				
    		}
    	}
    
    
    void main(void)
    {
    	OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,15);
    
    
    	nb_interruptions_IOC = 0;
    
    	LATA = 0x00;
    	ADCON1 = 0x07;             				// Desactive l'ADC
    	CMCON  = 0x07;							// Desactive les comparateur	
    	TRISA = 0x00; 							// Configure le PORTA
        PORTA = 0x00;							// Met le PORTA a 0			
    
    	LATB = 0x00;
    	TRISB = 0b00110001;                   	// Configure le PORTB                      
    	PORTB = 0x00;
    
    	LATC = 0x00;
    	TRISC = 0x00;                     		// Configure le PORTC
    	PORTC = 0x00;
    
    	EnablePullups();						// Allume les pullups
    
    	RCONbits.IPEN=0;						// Interreuptions sans priorites
    	valeur_portb = PORTB;					// Lis le portb afin de effacer le flag de IOC
    	INTCONbits.RBIF = 0;					// Efface le flag de IOC
    	INTCONbits.RBIE = 1;					// Autorise les interruptions IOC
    	INTCONbits.PEIE = 1;					// Atorise les interruptions peripheriques
    	INTCONbits.GIE = 1;						// Allume les interruptions
    
    	printf("Interruptions initialises\r\n");	
    
    	while(1)
    	{
    	}
    }
    Donc ce code tout simple devrait fonctionner quand je met un 0 sur RB4 ou RB5, non?
    Pourtant ce n'est pas le cas. Apart le message que les int. sont init. rien ne s'affiche (En haute priorité ça marche pas non +)

  10. Publicité
  11. #7
    RISC

    Re : Probleme interruptions C18 (encore)

    Salut,

    Comment as-tu initialisé les bits de configuration ?
    Je ne les trouve pas dans programme ?
    Avec quel outil débogues-tu ?

    As-tu essayé quelque chose de plus simple pour être sur que tu lis correctement les broches (sans interruption, ni printf).

    Je te recommande ensuite de mettre un point d'arrêt à l'entrée de l'interruption.
    Le reste me semble correct cela devrait fonctionner
    (je n'ai pas vu le corps de ta fonction enable_pullups() qui est très importante...)

    D'autres petites choses à corriger :
    1/
    LATB = 0x00;
    TRISB = 0b00110001;
    // PORTB = 0x00; inutile...il vaut mieux TOUJOURS utiliser LATB en sortie plutôt que PORTB

    2/ toute variable globale modifiée dans une interruption doit avoir le qualificateur volatile :
    volatile unsigned char valeur_portb,nb_interruptions_ IOC;

    a+

  12. #8
    VIIV

    Re : Probleme interruptions C18 (encore)

    Ça y est j'ai réussi a faire fonctionner l'interruption haute priorité!
    J'ai utilisé la fonction OpenPORTB() et ensuite j'ai rajouté INTCONbits.PEIE = 1 et INTCONbits.GIE = 1.

    Tu as raison pour la variable, je me suis mélangé les pinceaux entre static et volatile....

    En tout cas merci les gars

  13. #9
    RISC

    Re : Probleme interruptions C18 (encore)

    salut,

    la persévérance finit par payer ;=)
    Concernant les priorités, il vaut mieux utiliser les noms de bits GIEH et GIEL ( voir post "5 en b2/ )même s'ils prennent la place de GIE et PEIE, car cela rend le programme + compréhensible et en ligne avec la datasheet...

    a+

Discussions similaires

  1. Problème de compilation avec MPLab et C18
    Par Amineyc dans le forum Électronique
    Réponses: 8
    Dernier message: 23/05/2013, 12h50
  2. Problème Librairie XLCD - compilateur C18
    Par jorg1n dans le forum Électronique
    Réponses: 27
    Dernier message: 08/06/2009, 08h00
  3. Pour en finir avec mon problème LCD/C18
    Par hoffmann dans le forum Électronique
    Réponses: 15
    Dernier message: 09/11/2008, 21h41
  4. Problème compilation MPLAB C18
    Par VIIV dans le forum Électronique
    Réponses: 12
    Dernier message: 25/09/2008, 00h00
  5. Encore un problème sinus-cosinus (encore)...
    Par julien_4230 dans le forum Mathématiques du supérieur
    Réponses: 11
    Dernier message: 04/10/2006, 15h55
Découvrez nos comparatifs produits sur l'informatique et les technologies.