PIC18f24k22 interruption
Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

PIC18f24k22 interruption



  1. #1
    tobi66

    PIC18f24k22 interruption


    ------

    Bonjour tous le monde.

    Je souhaite réaliser un petit programme qui possède 2 LED un PIC18f24k22 et 2 boutons poussoirs.

    Je souhaite ordonner à mon pic d'allumer une LED pendant 10s lorsque j'appuie sur un BP et de même avec l'autre LED et l'autre BP.

    Actuellement j'arrive à le réaliser mais si j'appuie sur le 2nd BP pendant que la 1ère LED est allumée, mon pic ne prend pas en compte l'ordre.

    On m'a orienté vers une solution, celle des interruptions. Je saisie le fonctionnement mais je ne sait absolument pas comment cela se code.

    Auriez vous des exemples ou une autre solution?

    Voici mon code actuellement :
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <p18F24k22.h>
    #include "delay.h"
    #include "delays.h"
    #include "fonction.h"
    
    
    #pragma config FOSC = XT			// XT oscillator
    #pragma config PLLCFG = OFF			// Oscillator used directly
    #pragma config FCMEN = OFF			// Fail-Safe Clock Monitor disabled
    #pragma config IESO = OFF			// Oscillator Switchover mode disabled
    #pragma config PWRTEN = ON			// Power up timer disabled
    #pragma config BOREN = OFF			// Brown-out reset disabled in hardware and software
    #pragma config WDTEN = OFF			// Watch dog timer is sleep, otherwise enabled. SWDTEN has no effect
    #pragma config MCLRE = EXTMCLR		// MCLR pin enabled, RE3 input pin disabled
    #pragma config STVREN = OFF			// Stack full/underflow will not cause Reset
    #pragma config LVP = OFF			// Single-Supply ICSP disabled
    #pragma config XINST = OFF			// Instruction set extension and Indexed Addressing 
    #pragma config DEBUG = ON			// Enabled
    
    
    void moteurPorteEntree(void)
    {
    	if(PORTAbits.RA0 == 1) // porte fermée , l'ouvrir
    	{
    		PORTBbits.RB0 = 1;
    		DelayS(10);
    	}
    	
    	PORTBbits.RB0 = 0;
    }
    
    void moteurPorteGarage(void)		// Fonction permettant d'ouvrir ou de fermer la porte du garage
    {
    	if (PORTAbits.RA1 == 1)			// porte fermée, l'ouvrir
    	{
    		PORTBbits.RB1 = 1;
    		DelayS(10);
    	}
    		
    	PORTBbits.RB1 = 0;
    }
    	
    void main(void)
    {
    	TRISA = 0b11111111;
    	TRISB = 0b11000000;
    	TRISC = 0b01111100;
    	RCON = 0b11001111;
    	T0CON = 0b11010000;
    	ADCON1 = 0x0F;
    	ANSELA = 0b00000000;
    	ANSELB = 0b00000000;
    	ANSELC = 0b00000000;
    
    
    	while(1)
    	{
    		
    		if(PORTCbits.RC2 == 1) 		// enclenchement bouton moteur porte d'entree
    	    {
    		    moteurPorteEntree();
    
    		}
    		
    		else if(PORTCbits.RC3 == 1)
    		{
    		
    			moteurPorteGarage();
    		
    		}
    	}
    }
    Merci d'avance à ceux qui prendront le temps de lire ce message.

    -----

  2. #2
    amoniaque

    Re : PIC18f24k22 interruption

    Salut,

    Est ce que tu peux partager ton schéma ?
    Si tu veux utiliser les interruptions sur une entrée, je te conseille de prendre le port A ou B. Il y a les IOC (interrupt on change) qui sont dédiées pour ce que tu veux faire.
    Dans le cas de PORTC2 et PORTC3, que tu utilises, il n'y a pas d'interruptions dédiées.

    A+

  3. #3
    tobi66

    Re : PIC18f24k22 interruption

    C'est pour appliquer ensuite à un projet un peu plus gros donc je n'ai que le schéma de l'ensemble du projet.

    J'ai vu dans la datasheet les IOC mais je n'en vois que sur le PORTB. Y en a t'il aussi sur le PORTA?

    Un prof m'a filé ce code de base pour les interruptions, mais j'ai du mal à comprendre comment m'en servir.
    Pourriez-vous m'expliquer ce code?

    Code:
    #include <p18f24k22.h>
    #include "interrupt.h"
    #include "lcd.h"
    #include "delay.h"
    #include "delays.h"
    
    
    
    void config_interrupts(void)
    {
    	RCONbits.IPEN=1;			// Enable priority levels on interrupts
    
    	//registre INTCON	
    	INTCONbits.GIEH=1;			// Global interrupt enable
    	INTCONbits.GIEL=1;			// Peripherals interrupt	 enable
    	INTCONbits.TMR0IE=0;		// disable interruption timer 0
    	INTCONbits.INT0IE =1;		// enable interruption INT0
    	INTCONbits.RBIE=0;			// disable port B <7:4> change interrupt
    	INTCONbits.TMR0IF=0;		// flag interruption timer0
    	INTCONbits.INT0IF=0;		// flag interruption RB0
    	INTCONbits.RBIF=0;			// flag port B change
    
    	INTCON2bits.INTEDG0=1;      	// interruption INT0 sur front descendant.
    
    
    //	IPR1 = 0b00000100;    // high priority
    //	PIR1 = 0b00000000;	  // Interruption lors de détection d'un front montant
    //	T1CON = 0b01001000;     // Config timer1
    //	PIE1 = 0b00000100;
    
    }
    
    
    
    #pragma code interrupt_high_vector = 0x08
    
    // extern int i;
    void interrupt_high_vector (void)
    {
      		_asm
        	goto HIGH_ISR //jump to interrupt routine
      		_endasm
    }
    
    
    #pragma code
    
    #pragma interrupt HIGH_ISR nosave=FSR0,TBLPTR, TBLPTRU, TABLAT, PCLATH,PCLATU, PROD,section(".tmpdata"),section("MATH_DATA")
    //#pragma interrupt HIGH_ISR nosave=TBLPTR, TBLPTRU, TABLAT, PCLATH,PCLATU, section(".tmpdata")
    void HIGH_ISR(void)
    {
    
      
    	INTCONbits.GIEH = 0;	
    
    	if ((INTCONbits.INT0IE)&&(INTCONbits.INT0IF))			//INT0
    	
    	{
    		
    		lcd_send_char('a'); 
    
    		INTCONbits.INT0IF=0;			// mise du flag a 0, une fois INT0 finie
    		INTCONbits.GIEH=1;              // reenable du module d interruption prioritaire
    										// a priori inutile car remis à 1 ds #pragma code
    	}
    
    }
    Merci d'avance

  4. #4
    tobi66

    Re : PIC18f24k22 interruption

    J'ai compris mon code précédent et je l'ai amélioré de la façon suivante :
    Code:
    #include <p18f24k22.h>
    #include "interrupt origine.h"
    #include "fonction.h"
    #include "delay.h"
    #include "delays.h"
    #include "Variables.h"
    
    
    
    void config_interrupts(void)
    {
    	RCONbits.IPEN=1;			// Enable priority levels on interrupts
    
    	//registre INTCON	
    	INTCONbits.GIEH=1;			// Global interrupt enable
    	INTCONbits.GIEL=1;			// Peripherals interrupt	 enable
    	INTCONbits.TMR0IE=0;		// disable interruption timer 0
    	INTCONbits.INT0IE =1;		// enable interruption INT0
    	INTCONbits.RBIE=1;			// diable port B <7:4> change interrupt
    	INTCONbits.TMR0IF=0;		// flag interruption timer0
    	INTCONbits.INT0IF=0;		// flag interruption RB0
    	INTCONbits.RBIF=0;			// flag port B change
    
    	INTCON2bits.INTEDG0=1;      	// interruption INT0 sur front descendant.
    	INTCON2bits.RBIP=1;             //high priority on port b
    
    //	IPR1 = 0b00000100;    // high priority
    //	PIR1 = 0b00000000;	  // Interruption lors de détection d'un front montant
    //	T1CON = 0b01001000;     // Config timer1
    //	PIE1 = 0b00000100;
    
    }
    
    
    
    #pragma code interrupt_high_vector = 0x08
    
    // extern int i;
    void interrupt_high_vector (void)
    {
      		_asm
        	goto HIGH_ISR //jump to interrupt routine
      		_endasm
    }
    
    
    #pragma code
    
    #pragma interrupt HIGH_ISR // nosave=FSR0,TBLPTR, TBLPTRU, TABLAT, PCLATH,PCLATU, PROD,section(".tmpdata"),section("MATH_DATA")
    //#pragma interrupt HIGH_ISR nosave=TBLPTR, TBLPTRU, TABLAT, PCLATH,PCLATU, section(".tmpdata")
    void HIGH_ISR (void)
    {
    
      
    	INTCONbits.GIEH = 0;	
    
    	if (INTCONbits.RBIF)			
    	{
    		if (PORTBbits.RB5)
    		{
    			flagPorteDuGarage = 1;
    		}
    		
    		if (PORTBbits.RB4)
    		{
    			flagPorteEntree = 1;
    		}
    
    		INTCONbits.RBIF = 0;			
    		INTCONbits.GIEH = 1;            
    	}
    }
    En déclarant mes variables globales de cette façon :
    Code:
    #ifndef VARIABLES_H_INCLUDED
    #define VARIABLES_H_INCLUDED
    
    extern int flagPorteEntree;
    extern int flagPorteDuGarage;
    extern int flagVolet;
    
    
    #endif // FONCTION_H_INCLUDED

    Et en mettant dans mon main le code suivant :
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <p18F24k22.h>
    #include "delay.h"
    #include "delays.h"
    #include "fonction.h"
    #include "interrupt origine.h"
    #include "Variables.h"
    
    
    #pragma config FOSC = XT			// XT oscillator
    #pragma config PLLCFG = OFF			// Oscillator used directly
    #pragma config FCMEN = OFF			// Fail-Safe Clock Monitor disabled
    #pragma config IESO = OFF			// Oscillator Switchover mode disabled
    #pragma config PWRTEN = ON			// Power up timer disabled
    #pragma config BOREN = OFF			// Brown-out reset disabled in hardware and software
    #pragma config WDTEN = OFF			// Watch dog timer is sleep, otherwise enabled. SWDTEN has no effect
    #pragma config MCLRE = EXTMCLR		// MCLR pin enabled, RE3 input pin disabled
    #pragma config STVREN = OFF			// Stack full/underflow will not cause Reset
    #pragma config LVP = OFF			// Single-Supply ICSP disabled
    #pragma config XINST = OFF			// Instruction set extension and Indexed Addressing 
    #pragma config DEBUG = ON			// Enabled
    
    void main(void)
    {
    	
    	initialisationTRISX();
    	config_interrupts();
    
    	while(1)
    	{
    		if(flagPorteEntree) 		// enclenchement bouton moteur porte d'entree
    	    {
    		    moteurPorteEntree();
    		    flagPorteEntree = 0;
    
    		}
    		
    		else if(flagPorteDuGarage == 1)
    		{
    			moteurPorteGarage();
    			flagPorteDuGarage = 0;
    		}
             }
    }
    En mode debbuger cela fonctionne mais sur ma carte rien ne se passe lorsque j'appuie sur mes boutons poussoirs.
    Quelqu'un sait pourquoi?

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

    Re : PIC18f24k22 interruption

    Pas de réponse?

  7. #6
    amoniaque

    Re : PIC18f24k22 interruption

    Salut,

    Tu as bien programmé ton µC en release et pas en debug ?

  8. #7
    tobi66

    Re : PIC18f24k22 interruption

    Oui, je le passais juste en debug pour voir pas à pas ce qu'il faisait mais quand je teste sur ma carte il est en realese.
    D'autres idées?
    Merci!

  9. #8
    amoniaque

    Re : PIC18f24k22 interruption

    Ton firmware se lance ?
    Tu peux faire basculer une sortie de manière régulière pour voir si le FW est bien lancé, une LED de vie en gros.

  10. #9
    tobi66

    Re : PIC18f24k22 interruption

    J'ai une LED qui s'allume pour me prouver que l'alimentation fonctionne.
    C'est de ça dont tu parlais?

  11. #10
    tobi66

    Re : PIC18f24k22 interruption

    Non mais sans faire d'interruptions, en faisant un code basic, mes LED s'allument et s'éteint, c'est la partie interruption qui doit avoir un problème mais je n'arrive pas à trouver lequel

  12. #11
    amoniaque

    Re : PIC18f24k22 interruption

    Non, une LED de vie du µC pas de l'alimentation.

    Sinon p141 de la doc : "Reading or writing PORTB will end the mismatch condition and allow the RBIF bit to be cleared.", donc je te conseille de lire PORTB avant de rabaisser le flag.

  13. #12
    tobi66

    Re : PIC18f24k22 interruption

    Je ne comprend pas ce que tu entend par lire le PORTB avant de rabaisser le flag?

    Daans ma fonction du moteur porte du garage par exemple le lis le PORTBbits.RB1. Mais rien ne se passe quand même.

    Code:
    void moteurPorteGarage(void)		// Fonction permettant d'ouvrir ou de fermer la porte du garage
    {
    	if (PORTAbits.RA1 == 1)			// porte fermée, l'ouvrir
    	{
    		PORTBbits.RB1 = 1;
    		DelayS(10);
    	}
    	
    	else							// porte ouverte, la fermer
    	{
    		do
    		{
    			PORTBbits.RB1 = 1;		// Fermeture de la porte du garage
    		
    		}while (PORTAbits.RA1 == 0);
    		
    	}
    	
    	PORTBbits.RB1 = 0;
    }
    En tout cas merci de tes conseils.

  14. #13
    amoniaque

    Re : PIC18f24k22 interruption

    C'est marqué noir sur blanc, en gros avant de rabaisser le flag des IOC, tu dois lire ou écrire sur le port B (lis tout le paragraphe 10.3.2 de la doc du PIC, ça sera plus clair ).
    En gros :
    Code:
    void HIGH_ISR (void)
    {
            u8 i;
    
    	INTCONbits.GIEH = 0;	
    
    	if ((INTCONbits.RBIF) && (INTCONbits.RBIE))
    	{
    
    		...
    
                    i = PORTB;
    
    		INTCONbits.RBIF = 0;			
    		INTCONbits.GIEH = 1;            
    	}
    }

  15. #14
    tobi66

    Re : PIC18f24k22 interruption

    D'accord, merci beaucoup!
    Juste "u8 i;" c'est pour initialiser la variable i?

  16. #15
    amoniaque

    Re : PIC18f24k22 interruption

    En effet c'est juste pour définir une variable 8 bits en local.
    Par contre je doute que "u8" soit un type reconnu, "unsigned char" sera plus convenu.

  17. #16
    tobi66

    Re : PIC18f24k22 interruption

    D'accord merci beaucoup des conseils.
    je test cela le plus rapidement possible et te tiens au courant du bon fonctionnement ou non.
    Merci!

  18. #17
    tobi66

    Re : PIC18f24k22 interruption

    D'accord merci beaucoup.
    Je test cela le plus rapidement possible et te tiens au courant du bon fonctionnement ou non.
    Merci!

  19. #18
    tobi66

    Re : PIC18f24k22 interruption

    Bon ba ceci ne marche toujours pas...
    Je suis en déprime...
    D'autres idées?

  20. #19
    amoniaque

    Re : PIC18f24k22 interruption

    Salut,

    Tu fais comment pour tester en release ? Tu appuies sur tes boutons et ça ne marche pas ?
    Ou alors tu utilises des outils plus ou moins adaptés pour savoir ce qui se passe dans ton µC ?
    Si tu peux le faire je te conseille de "sortir" ce qui se passe sur ton µC. Par exemple via l'UART, ou plus archaïquement via une simple IO.
    Déjà est ce que l'interruption est bien vue ? Est ce que tu passes dans HIGH_ISR ?
    Essais de debugger petit à petit.

    A+

  21. #20
    tobi66

    Re : PIC18f24k22 interruption

    Comment voir en mode debug si il rentre dans HIGh_ISR?
    Je viens de faire tout le programme pas à pas en mode debug et il rentre bien dans mes fonctions.

    En mode realese j'appuie effectivement sur mes boutons et rien ne se passe.
    J'essaye d'abord d'allumer les led dans le HIGH_ISR pour etre sur qu'il rentre dedans et elles s'allument.

  22. #21
    amoniaque

    Re : PIC18f24k22 interruption

    Tu peux partager tout ton code stp ?

  23. #22
    tobi66

    Re : PIC18f24k22 interruption

    Solution trouvée! Et grace à toi amoniaque!
    Je n'avais pas bien lu le paragraphe que tu m'avais indiqué dans la datasheet, et du coup je n'avais pas initialisé IOCB = 0b11111111;
    Merci de ton temps et de tes conseils!

  24. #23
    amoniaque

    Re : PIC18f24k22 interruption

    Tu avais mis quoi pour IOCB ?

    Sinon je viens de voir un possible ennui :
    Code:
    void HIGH_ISR (void)
    {
            u8 i;
    
    	INTCONbits.GIEH = 0;	
    
    	if ((INTCONbits.RBIF) && (INTCONbits.RBIE))
    	{
    
    		...			
    		INTCONbits.GIEH = 1;            
    	}
    }
    À corriger par :
    Code:
    void HIGH_ISR (void)
    {
            u8 i;
    
    	INTCONbits.GIEH = 0;	
    
    	if ((INTCONbits.RBIF) && (INTCONbits.RBIE))
    	{
    
    		...			        
    	}
    	INTCONbits.GIEH = 1;    
    }
    Car si tu ne rentres par dans le test, tes interruptions ne se produiront plus ...

  25. #24
    tobi66

    Re : PIC18f24k22 interruption

    D'accord je vais le corriger également, et pout IOCB j'avais totalement oublié de l'initialiser

  26. #25
    amoniaque

    Re : PIC18f24k22 interruption

    Citation Envoyé par tobi66 Voir le message
    pout IOCB j'avais totalement oublié de l'initialiser
    Et ça fonctionnait en debug ?
    Très étrange ... Tu as pu faire de multiples appuis ?

  27. #26
    tobi66

    Re : PIC18f24k22 interruption

    Oui j'ai pu faire de multiples appuis 3 en même temps.
    Je ne pouvais pas savoir si ça fonctionnait correctement en debug parceque je ne peux pas générer une interruption en debug...

    Maintenant j'essaye de remplacer les boutons poussoirs qui donnent les ordres au pic par une télécommande. Je vais utiliser un TSOP et une diode infrarouge pour la communication, et un pic 16F ou 18F pour la télécommande. Lequel serait le mieux? Peut-on coder en C également le fonctionnement d'une télécommande?

  28. #27
    amoniaque

    Re : PIC18f24k22 interruption

    Citation Envoyé par tobi66 Voir le message
    Maintenant j'essaye de remplacer les boutons poussoirs qui donnent les ordres au pic par une télécommande. Je vais utiliser un TSOP et une diode infrarouge pour la communication, et un pic 16F ou 18F pour la télécommande. Lequel serait le mieux? Peut-on coder en C également le fonctionnement d'une télécommande?
    Ça n'est plus vraiment le sujet de ton post.
    Je te conseille de te pencher sur ton idée de commande sans fil, chercher des solutions et si tu bloques sur un point précis viens ouvrir un nouveau post.

Discussions similaires

  1. Initialisation microcontrôleur PIC18f24k22
    Par tobi66 dans le forum Électronique
    Réponses: 15
    Dernier message: 31/03/2013, 17h54
  2. portage code assembleur pic16f883 vers pic18f24k22
    Par vincent-pimousse dans le forum Électronique
    Réponses: 4
    Dernier message: 27/06/2012, 21h03
  3. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  4. Interruption
    Par invite28559ad9 dans le forum Électronique
    Réponses: 4
    Dernier message: 06/01/2009, 21h07
  5. Interruption
    Par scls19fr dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2008, 14h05
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...