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

interruptions I2C sur PIC 18f



  1. #1
    GY22

    interruptions I2C sur PIC 18f


    ------

    Bonjour à tous,

    Je rencontre un problème avec les interruptions du PIC 18F25k22 pour la liaison i2C. Mon problème est que mon programme n'entre jamais dans les routines d'interruptions.

    Code:
    #include <p18f25k22.h>  
    #include <delays.h>    
    #include <i2c.h>  
    
    #pragma config STVREN   = ON
    #pragma config LVP      = OFF
    	
            #pragma config XINST    = OFF       // Extended Instruction Set
            #pragma config CP0      = OFF
            #pragma config CP1      = OFF
        	#pragma config CP2      = OFF
    	    #pragma config CP3      = OFF
            #pragma config CPB      = OFF
    	    #pragma config CPD      = OFF
            #pragma config WRT0     = OFF
            #pragma config WRT1     = OFF
    	    #pragma config WRT2     = OFF
    	    #pragma config WRT3     = OFF
            #pragma config WRTB     = ON       // Boot Block Write Protection
            #pragma config WRTC     = OFF
    	    #pragma config WRTD     = OFF
    
    void high_isr(void);
    void low_isr(void);
    
    #define nbreg		12 //nombres de registre pour l'i2c 1< nbreg < 255
    #define Slave_Address 	0x40
    
    volatile unsigned char buf;
    volatile unsigned char registre[nbreg];
    
    
    #pragma code high_vector=0x08
    	void high_int(void)
    	{
    		_asm goto high_isr _endasm
    			
    	}
    #pragma code
    
    
    #pragma code low_vector=0x18
    	void interrupt_at_low_vector(void)
    	{
    	    _asm goto low_isr _endasm
    	}
    #pragma code
    
    
    
    void init(void)
    {	int i;
    
    
    	PORTA = 0x00; //init port A
    	TRISA = 0x01;  //porta 1 en entrée
    	
    	PORTB = 0x00;  //init port b
    	TRISB = 0x06; //rb1 et rb2 en entree pour i2c
    
    	PORTC = 0x00; 
    	TRISC = 0x18;
    	
    	ADCON1 = 6;
    	OSCCON = 0x40; // Fosc = 2MHz 0x40=> 0x70    pour Fosc = 16MHz => 0x70
    
    	RCONbits.IPEN = 0;
    
    	INTCONbits.PEIE = 1;		//validation int via péripheriques (dans reg INTCON)
    	INTCONbits.GIE = 1;	//validation toutes int (dans reg INTCON)
    
    
    	PIR2 = 0;			//Reset Flag IT
    	PIR1 = 0;			//Reset Flag IT
    	IPR1 = 0;			
    	IPR2 = 0;
    	PIE1 = 0;			//On devalide toute les interruptions sur PIE1
    	PIE2 = 0; 			//desactivation des autres ITs
    
    
    	SSP1ADD=Slave_Address<<1; //adresse du pic sur le bus i2c
    
    	SSP1CON1 = 0b00110110;  // bit 0-3 mode 7bits esclave 		
    						// bit 4 valide horloge 
    	SSP1CON2 = 0x00;
    	SSP1CON2bits.SEN = 1;
    	SSP1STAT = 0b0000000; 		//	raz registre status des ports serie
    	
    
    	PIE1bits.SSP1IE = 1;			// validation interruption via port serie (dans registre PIE1)
    	PIR1bits.SSP1IF = 0;		//raz bit interruption i2c
    		
    	for(i=0;i<nbreg;i++) registre[i]=0;
    
    
    }
    
    #pragma interruptlow high_isr
    void high_isr(void)
    {	
    	PORTB =0x08;
    }
    #pragma code
    
    
    
    #pragma interruptlow low_isr
    void low_isr(void)
    {
    	PORTB =0x08;
    }
    #pragma code
    
    
    
    
    void main (void)
     {
    	unsigned char val1;
    	unsigned char val2;
    	unsigned char reg;
    	unsigned char addr;
    	int test;
    
    	registre[5] = 0xEB;
    	registre[3] = 0x0F;
    	registre[4] = 0x70;
    
    	val1 = 0x06;
    	val2 = 0x0A;
    	reg = 0x06;
    	addr = 0x00;
    	test = 0;
    
    
    	init();
    	
     	PORTB =0x01;
    		while(1)
    		{		
    	    }       
    	                    
     }
    Cela fait un petit moment que je bloque, j'espère qu'un œil nouveau pourra voir mon/mes erreur(s).

    -----

  2. #2
    RISC

    Re : interruptions I2C sur PIC 18f

    Salut,

    2 problèmes aux niveau des interruptions...

    1/ tu oublies de nettoyer le flag d'interruption dans chacune de tes interruptions

    2/ Mode "Legacy"
    Tu as initialisé : RCONbits.IPEN = 0;
    donc tu es en mode "mono-interruption"..Une des interruptions que tu as codé ne sera jamais utilisée...
    Si tu veux pouvoir utiliser les priorités dans les interruptions, il faut changer la valeur de IPEN : RCONbits.IPEN = 1;
    Ensuite il faut bien sûr affecter une priorité à chaque interruption (low ou high)

    Je te recommande de lire les cours sur les PIC18 + C18 ici : http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    et aussi de t'inspirer des exemples de code pour PIC18 : http://www.microchip.om/codeexamples

    a+
    Ma marotte ? les microcontrôleurs ;=)

  3. #3
    GY22

    Re : interruptions I2C sur PIC 18f

    Merci de votre réponse, en effet je me suis rendu compte que le bit IPEN n'avait pas la bonne valeur. Pour les flags j'ai tout supprimé sans réfléchir merci pour la remarque!

    Ça ne fonctionne toujours pas, je vais jeter un œil à vos liens en espérant trouver ma faute.

Sur le même thème :

Discussions similaires

  1. interruption I2C pic 18F
    Par jum0034 dans le forum Électronique
    Réponses: 11
    Dernier message: 05/04/2012, 15h46
  2. Configuration de registre sur pic 18f
    Par mortaurat dans le forum Électronique
    Réponses: 2
    Dernier message: 21/02/2010, 20h03
  3. gestion interruptions sur pic
    Par alainav1 dans le forum Électronique
    Réponses: 4
    Dernier message: 27/12/2008, 16h38
  4. telecommande RC5 sur pic 18F
    Par jum0034 dans le forum Électronique
    Réponses: 9
    Dernier message: 15/10/2008, 18h47
  5. PIC : Du retard sur les interruptions I2C
    Par Julien1138 dans le forum Électronique
    Réponses: 3
    Dernier message: 20/04/2008, 21h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.