bonjour,
j'ai réalisé une interuption sur front montant sur la patte RBO que je pense être bien configurée.
Mon problème c'est que l'interruption n'a lieu qu'une fois : au premier front montant, le pic réalise les instructions de la boucle d'interruption, puis il retourne dans la boucle principale et y reste.
voilà mon code :
#include <p18f252.h>
#include <adc.h>
#include <timers.h>
#include <delays.h>
/****************************** ***********************/
/* définitions des pins I/O */
/****************************** ***********************/
#define DEL1_TRIS TRISCbits.TRISC1
#define DEL2_TRIS TRISCbits.TRISC2
#define DEL3_TRIS TRISCbits.TRISC3
#define DEL1 PORTCbits.RC1
#define DEL2 PORTCbits.RC2
#define DEL3 PORTCbits.RC3
#define zero_de_courant_TRIS TRISBbits.TRISB0
#define zero_de_courant PORTBbits.RB0
void MyInterrupt (void);
void delai (void);
void main (void);
/******************************/
/* fonction interruption */
/******************************/
void MyInterrupt(void);
#pragma code highVector=0x008
void atInterrupthigh(void)
{
_asm GOTO MyInterrupt _endasm
}
#pragma code // retour la zone de code
/*********************/
/* Interruptions */
/*********************/
#pragma interrupt MyInterrupt
void MyInterrupt(void)
{
/* sauvegarder des registres avant l'interruption */
unsigned char sauv1;
unsigned char sauv2;
INTCONbits.INT0IF = 0;
sauv1 = PRODL;
sauv2 = PRODH;
DEL1 = 0;
DEL3 = 1;
delai();
DEL3 = 0;
/* on restaure les registres sauvegardes avant l'interruption */
PRODL = sauv1;
PRODH = sauv2;
INTCONbits.INT0IF = 0;
}
/*********************/
/* Délai */
/*********************/
void delai (void)
{
int i;
for (i = 0; i < 10000; i++)
;
}
/****************************** */
/* fonction principale */
/****************************** */
void main (void)
{
/*tout digital sauf RA0-AN0 */
ADCON1=0xE;
/* on configure les pins en I/O */
DEL1_TRIS = 0;
DEL2_TRIS = 0;
DEL3_TRIS = 0;
zero_de_courant_TRIS = 1;
/* On active toutes les interruptions */
INTCON2bits.INTEDG0 = 1; /* interruption sur front montant */
INTCONbits.INT0IE = 0; /* mise à 0 avant de le mettre à 1 */
INTCONbits.INT0IE = 1; /* autorise interruption sur RB0 */
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
/*on demarre la boucle infinie */
while (1)
{ DEL1 = 1;
delai();
delai();
}
}
Comment remédier au problème?
-----