Bonsoir,
Ca concerne le 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir".
Je n'arrive pas avoir le resultat .La LED s'allume au premier click mais ne s'eteind pas( simulation sur isis).
Avec MPLAB, a l'appui sur le bouton 'fire high' l'interruption est appelée, le PORTA passe bien a 00000100 et se fige quelque soit le bouton fire clické , et pour ne pas dire de betise je joins le code original de bigonoff
et ma simulation sur ISIS
Pièce jointe 326041Code:;********************************************************************** ; Ce programme est un programme didactique destiné à monter * ; le fonctionnement des interruptions * ; * ;********************************************************************** ; * ; NOM: Interruption par bouton-poussoir sur RB0 * ; Date: 13/02/2001 * ; Version: 1.0 * ; Circuit: Platine d'essais * ; Auteur: Bigonoff * ; * ;********************************************************************** ; * ; Fichier requis: P16F84.inc * ; * ; * ; * ;********************************************************************** ; * ; Notes: Ce programme transforme un bouton-poussoir en * ; télérupteur. Un pulse allume la LED, un autre * ; l'éteint * ; * ; * ;********************************************************************** LIST p=16F84 ; Définition de processeur #include <p16F84.inc> ; Définitions de constantes __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ; '__CONFIG' précise les paramètres encodés dans le processeur au moment de ; la programmation du processeur. Les définitions sont dans le fichier include. ; Voici les valeurs et leurs définitions : ; _CP_ON Code protection ON : impossible de relire ; _CP_OFF Code protection OFF ; _PWRTE_ON Timer reset sur power on en service ; _PWRTE_OFF Timer reset hors-service ; _WDT_ON Watch-dog en service ; _WDT_OFF Watch-dog hors service ; _LP_OSC Oscillateur quartz basse vitesse ; _XT_OSC Oscillateur quartz moyenne vitesse ; _HS_OSC Oscillateur quartz grande vitesse ; _RC_OSC Oscillateur à réseau RC ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* OPTIONVAL EQU H'0000' ; Valeur registre option ; Résistance pull-up ON ; Interrupt flanc descendant RB0 INTERMASK EQU H'0090' ; Masque d'interruption ; Interruptions sur RB0 ;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE Bouton PORTB , 0 ; bouton poussoir #DEFINE LED PORTA , 2 ; LED ;********************************************************************* ; MACRO * ;********************************************************************* BANK0 macro bcf STATUS,RP0 ; passer en banque 0 endm BANK1 macro bsf STATUS,RP0 ; passer en banque1 endm ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C ; début de la zone variables w_temp :1 ; Sauvegarde de W dans interruption status_temp : 1 ; Sauvegarde de STATUS dans interrupt cmpt1 : 1 ; compteur de boucles 1 dans tempo cmpt2 : 1 ; compteur de boucles 2 dans tempo flags : 1 ; un octet pour 8 flags ; réservons b0 pour le flag tempo ; b1 : libre ; b2 : libre ; b3 : libre ; b4 : libre ; b5 : libre ; b6 : libre ; b7 : libre ENDC ; Fin de la zone #DEFINE tempoF flags , 0 ; Définition du flag tempo ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************** ; ROUTINE INTERRUPTION * ;********************************************************************** ;sauvegarder registres ;--------------------- 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 ;restaurer registres ;------------------- 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 * ;********************************************************************** ;---------------------------------------------------------------------- ; inverse le niveau de RA2 à chaque passage ; interdit toute nouvelle interruption ; valide le flag tempo ;---------------------------------------------------------------------- intrb0 movlw B'00000100' ; bit positionné = bit inversé BANK0 ; car on ne sait pas sur quelle banque ; on est dans une interruption (le ; programme principal peut avoir changé ; de banque. Ce n'est pas le cas ici, ; mais c'est une sage précaution xorwf PORTA , f ; inverser RA2 bcf INTCON , INTF ; effacer flag INT/RB0 bcf INTCON , INTE ; interdire autre inter. RB0 bsf tempoF ; positionner flag tempo return ; fin d'interruption RB0/INT ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 BANK1 ; passer banque1 clrf EEADR ; permet de diminuer la consommation movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x0c ; initialisation pointeur movwf FSR ; pointeur d'adressage indirect 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 ; configuer PORTS ; --------------- bcf LED ; RA2 en sortie (TRISA) BANK0 ; passer banque0 movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control goto start ; sauter programme principal ;********************************************************************* ; SOUS-ROUTINE DE TEMPORISATION * ;********************************************************************* ;--------------------------------------------------------------------- ; Cette sous-routine introduit un retard ; Elle ne reçoit aucun paramètre et n'en retourne aucun ;--------------------------------------------------------------------- tempo clrf cmpt2 ; effacer compteur2 boucle2 clrf cmpt1 ; effacer compteur1 boucle1 decfsz cmpt1 , f ; décrémenter compteur1 goto boucle1 ; si pas 0, boucler decfsz cmpt2 , f ; si 0, décrémenter compteur 2 goto boucle2 ; si cmpt2 pas 0, recommencer boucle1 return ; retour de la sous-routine ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start btfss tempoF ; tester si tempo flag mis goto start ; non, attendre qu'il soit mis call tempo ; oui, exécuter tempo bcf tempoF ; effacer flag tempo bcf INTCON , INTF ; effacer flag INT bsf INTCON , INTE ; remettre interrupts INT en service goto start ; boucler END ; directive fin de programme
Merci
-----