Bonjour, j'essaye de programmer deux interruptions (timer 0+int0 (patte 1 du portB) sur un pic en C avec mplab et C18 mais sans y parvenir. voici mon code:
#include <p18f4550.h>
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>
#pragma config FOSC=HS
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config PBADEN=OFF
#pragma interrupt interrupt_portc
#pragma interrupt interrupt_porta_porte
void interrupt_portc(void);
void interrupt_porta_porte(void);
/*Tableaux correspondants aux LEDs*/
volatile int stop=0;
volatile int cpt=0;
volatile int j=11;
void interrupt_portc()
{
if (INTCONbits.TMR0IF)
{
if (cpt==0)
{
PORTD=0b00000001;
cpt++;
}else if (cpt==1)
{
PORTD=0b00000010;
cpt++;
} else if (cpt==2)
{
PORTD=0b00000100;
cpt=0;
}
stop++;
INTCONbits.TMR0IF=0;
//T0CONbits.TMR0ON=0;
TMR0L=0x00;
TMR0H=0x00;
}
}
void interrupt_porta_porte()
{
if (INTCONbits.INT0IF)
{
// j=1;
INTCONbits.INT0IF=0;
}
else if (INTCON3bits.INT1IF)
{
// j=2;
INTCON3bits.INT1IF=0;
}
else if (INTCON3bits.INT2IF)
{
// j=3;
INTCON3bits.INT2IF=0;
}
// else j=9;
}
void main (void)
{
const unsigned char taba[12]={0b11000000,0b11111001,0b1110 0100,0b11110000,0b11011001,0b1 1010010,0b11000010,0b11111000, 0b11000000,0b11010000,0b111000 01,0b11100011};//0x3F,0x06,0x1B,0x0F,0x26,0x2D, 0x3D,0x07,0x3F,0x2F,0x1E,0x1C
const unsigned char tabe[12]={0b11111111,0b11111111,0b1111 1110,0b11111110,0b11111110,0b1 1111110,0b11111110,0b11111111, 0b11111110,0b11111110,0b111111 10,0b11111111};//0x3F,0x06,0x1B,0x0F,0x26,0x2D, 0x3D,0x07,0x3F,0x2F,0x1E,0x1C
unsigned char i;
unsigned char tabaa=0,tabee=0;
/*Paramétrages des PORTS A à E, 0=Output, 1=Input*/
TRISA=0x00;
TRISB=0b00001111;
TRISC=0b00111000;
TRISD=0b00000000;
TRISE=0b11111000;
/*Initialisation des PORTS A à E*/
PORTA=0x3F;
PORTB=0x00;
PORTC=0xFF;
PORTD=0b00000001;
PORTE=0xFF;
/*init timer*/
RCONbits.IPEN=0;
// T0CONbits.TMR0ON=1; // Validation du timer0
T0CONbits.T08BIT=1;
T0CONbits.PSA =0; // Prédiviseur affecté au timer 0
T0CONbits.T0CS= 0; // Timer 0 utilise l'horloge interne
T0CONbits.T0PS2 = 1; // Prédivision de 2
T0CONbits.T0PS1 = 1;
T0CONbits.T0PS0= 1;
INTCONbits.TMR0IF=0;
//INTCON2bits.TMR0IP=0; //priorité de l'interruption du timer 0, haute
INTCONbits.TMR0IE=1; //active l'interruption sur le timer
//INTCONbits.GIE=1;
/*Interruptions Init*/
/* INTCON2bits.INTEDG0=1;
INTCON2bits.INTEDG1=1;
INTCON2bits.INTEDG2=1;
INTCON3bits.INT1IF=0;
INTCON3bits.INT2IF=0;
INTCONbits.INT0IF=0;
INTCON3bits.INT2IP=0;
INTCON3bits.INT1IP=0;
INTCON3bits.INT2IE=1;
INTCON3bits.INT1IE=1;
*/
INTCONbits.INT0IE=1;
//INTCONbits.GIE=1;
//INTCONbits.PEIE=1;
INTCONbits.GIE=1;
T0CONbits.TMR0ON=1;
while(1)
{
for(i=0;i<4;i++)
{
if (i==0)PORTC=0b11000010;
if (i==1)PORTC=0b11000001;
if (i==2)PORTC=0b10000011;
if (i==3)PORTC=0b01000011;
if (stop>50)
{ stop=0;
j++;
PORTA=taba[j];
PORTE=tabe[j];
}
if(j>10) j=0;
//else
//{
// PORTA=taba[11];
// PORTE=tabe[11];
//}
//if(stop>=8) stop=0;
Delay1KTCYx(1);
}
}
}
le problème est le suivant: si je met que le code de l'interruption timer, tout fonctionne correctement. si je met que le code de l'interruption sur int0 pas de problème tout fonctionne correctement. mais si je met le code des deux interruptions ensemble, l'interruption sur le timer fonctionne mais dès que j'ai l'interruption sur le portB patte 1 (int0) le pic plante. Une idée????
Peut être cela vient des init registres qui ne seraient pas dans le bonne ordre ou mal initialiser???? (J'ai déjà essayer pas mal de solution)
-----