Bonjour à tous,
Je développe un petit programme qui utilise uniquement l'interruption sur RB0/INT. Par contre, mes contraintes m'obligent à changer le sens de détection de l'interruption au cours de l'exécution du programme.
Mon problème est le suivant:
Je configure comme il se doit tous mes registres avec une interruption sur RB0/INt avec un front descendant ainsi que mon masque d'interruption avec GIE=1 et INTE=1.
Le problème est que si je démarre mon PIC avec un niveau 0 sur RB0 puis que j'émets sur RB0 un front montant, le PIC détecte anormalement une interruption. Mieux encore, il détecte un front descendant! Je m'en suis rendu compte par l'ajout d'une gestion de cas dans la gestion des interruptions.
Ci-après mon code. Rien de compliqué.
Avez-vous une idée, explication?
Merci,
Thomas.
Code:LIST p=16F84A ; Définition de processeur #include <p16F84A.inc> ; Définitions de variables __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* OPTIONMASK EQU b'00001111' ; Valeur registre option ; Résistance pull-up ON b7=0 ; Interrupt flanc descendant RB0 b6=0 ; Timer0 incrémenté par l'horloge interne b5=0 ; pas de Pré division au niveau du timer de 256 b3=1, B2=1, b1=1, b0=1 INTERMASK EQU b'10010000' ; Masque d'interruption ; On autorise les interuptions b7=1 ; Ecriture EEPROM non validée b6=0 ; Débordement du timer0 invalide b5=0 ; Modification de l'état de RB0 b4=1 ; Interruptions de RBIE non valide b3=0 ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C ; début de la zone variables ; Utilisé pour les interruptions w_temp :1 ; Zone de 1 byte status_temp : 1 ; zone de 1 byte ; ; Variables utilisées pour la détermination des ordres émis par l'utilisateur. CompteurTmr0A :1 ; Dixit CompteurTmr0B :1 ; Dixit ENDC ; Fin de la zone ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** ORG 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************** ; ROUTINE INTERRUPTION * ;********************************************************************** ORG 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé call intrb0 ; oui, traiter interrupt RB0 bcf INTCON,INTF ; effacer flag interupt RB0 swapf status_temp,w ; swap ancien status, résultat dans w movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status retfie ; return from interrupt ;********************************************************************** ; INTERRUPTION RB0/INT * ;********************************************************************** intrb0 bsf STATUS,RP0 ; sélectionner banque 1 btfsc OPTION_REG,INTEDG Goto lblIntrb0A bcf STATUS,RP0 ; sélectionner banque 0 bsf PORTB,2 return lblIntrb0A bcf STATUS,RP0 ; sélectionner banque 0 bcf PORTB,2 return ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 clrf EEADR ; permet de diminuer la consommation bsf STATUS,RP0 ; sélectionner banque 1 movlw OPTIONMASK ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x0c ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,6 ; tester si fin zone atteinte (>=40) goto init1 ; non, boucler btfss FSR,4 ; tester si fin zone atteinte (>=50) goto init1 ; non, boucler movlw b'00000001' ; Configuration de la sortie du portB movwf TRISB ; bcf STATUS,RP0 ; Sélectionner banque 0 movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start goto start END
-----