Bonjour...
Je voudrais simplement gérer correctement les interruptions sur le RB0.
J'ai donc un pic18F2520 avec un bouton poussoir qui relie RB0 à la masse lorsqu'il est appuyé. Le problème est que l'interruption est toujours exécutée (bouton appuyé ou non) , la boucle infinie du main reprend si je reste longtemps appuyé sur le bouton (je le sais car une led permet de signaler quelle boucle tourne).
J'ai réglé l'interruption sur le front descendant mais je ne comprends pas comment cela peut il réagir si l'on laisse RB0 "en l'air". Faut il forcer par le hardware RB0 à 5V puis mettre à la masse lors de l'appui?
J'ai essayé de mettre une résistance entre 5V et RB0 pour forcer le niveau 5V avant la mise à 0 mais cela ne laisse pas la boucle main fonctionner.
Quel est le principe d'utilisation générale (surtout hard) d'une interruption sur IO?
Merci pour vos éclaircicements
Voila les quelques paramètres de mon code qui sont utiles pour ce problème (les prototypes sont dans le .h , le script se build sans problèmes, j'ai probablement oublié quelques détails du script mais sans rapport avec le problème):
#pragma config OSC = HSPLL
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config LVP = OFF
#pragma config BOREN = ON
#pragma config BORV = 1
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config PBADEN = OFF
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO ISRgest _endasm
}
#pragma code // ritorna al codice C
#pragma interrupt ISRgest
void main()
{
TRISB = 0b11111111;
LATB = 0b11110000;
RCONbits.IPEN=1;
INTCON = 0;
INTCONbits.GIE = 1;
INTCONbits.INT0IE = 0; /* mise à 0 avant de le mettre à 1 */
INTCONbits.INT0IE = 1 ; //activation de l'interruption de la patte RB0
INTCON2bits.INTEDG0=0; //evennement du falling edge
INTCONbits.PEIE = 0;
INTCONbits.INT0IF = 0;
while(1)
{
led1=0;
}
}
void ISRgest(void) .
{
if(INTCONbits.INT0IF && INTCONbits.INT0IE)
{
/* sauvegarder des registres avant l'interruption */
unsigned char sauv1;
unsigned char sauv2;
sauv1 = PRODL;
sauv2 = PRODH;
//si bouton alors réaction
Led1=1;
tempo_ms(5000); //fonction d'attente
/* on restaure les registres sauvegardes avant l'interruption */
PRODL = sauv1;
PRODH = sauv2;
INTCONbits.INT0IF = 0; //réinitialisation du flag
}
}
-----