Interruption erronée sur PIC16F84A
Discussion fermée
Affichage des résultats 1 à 1 sur 1

Interruption erronée sur PIC16F84A



  1. #1
    invited00d258f

    Interruption erronée sur PIC16F84A


    ------

    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

    -----
    Dernière modification par gienas ; 12/06/2011 à 20h59. Motif: Ajouté les balises code obligatoires pour les programmes

Discussions similaires

  1. Expression erronée sur MatLab
    Par invite81d498d8 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 03/02/2010, 18h39
  2. programme sur pic16f84a
    Par invite947c2c97 dans le forum Électronique
    Réponses: 2
    Dernier message: 22/07/2009, 12h01
  3. Recommencer le programme au début après une interruption (PIC16f84A)
    Par invite4386a656 dans le forum Électronique
    Réponses: 8
    Dernier message: 17/05/2008, 13h58
  4. question sur le PIC16F84A
    Par inviteeb219439 dans le forum Électronique
    Réponses: 4
    Dernier message: 24/08/2007, 21h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...