Bonjour à tous,
je viens vous demander de l'aide car je ne sais plus du tout quoi changer pour faire fonctionner mon mini programme assembleur.
J'ai la pin GP0 connecté à une led, le bouton poussoir gauche connecté à GP1 et le bouton poussoir droit connecté à GP2.
Le programme est très simple: Quand on appui sur BPG on allume la led et quand on appui sur BPD on éteint la led. Les ITs sont activés pour INT/GP2 et pour le changement d'état de la pin GP1. C'est dans la routine d'interruption que je change l'état de la led. En simulation sur MPLABSIM ça marche très bien par contre en vrai j'obtiens quelque chôse d'assez bizarre:
- La led est allumé au démarrage (alors qu'elle doit être éteinte)
- Quand j'appui sur BPG ou BPD rien de se passe
- Quand je reste appuyé sur BPG et que j'appui sur BPD la led s'éteint
- Quand je relâche BPG la led s'allume
- Quand je reste appuyé sur BPD et que j'appui sur BPG rien ne se passe.
Voila mon code:
Code:list p=12f675 ; list directive to define processor ;********************************************************************** ; Inclusions ;********************************************************************** #include <p12f675.inc> ; processor specific variable definitions ;********************************************************************** ; Config ;********************************************************************** errorlevel -302 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ;********************************************************************* ; DEFINE * ;********************************************************************* #define EMITTER GPIO,GP0 #define LED GPIO,GP0 #define BPG GPIO,GP1 #define BPD GPIO,GP2 ;********************************************************************* ; ASSIGNATIONS (EQU) * ;********************************************************************* ;************************ Registre definition ************************ ; REGISTRE OSCCAL (calibration oscillateur) ; ----------------------------------------- OSCCALVAL EQU B'10000000' ; b7-b2: ; 0b000000 : Minimum frequency ; 0b100000 : Center frequency ; 0b11111 : Maximum frequency ; b1-b0: unused ; REGISTRE OPTION ; ----------------------------------------- OPTIONVAL EQU B'00000000' ; b7: ; 0 : enable pull-ups ; b6: ; 0 : INT falling edge ; b5: ; 0 : Internal instruction cycle clock ; b4: ; 0 : Increment 1->0 transition ; 0 : Prescaler to timer0 ; b2-0: ; 0b000 : 1/2 TMR0 | 1/1 WDT ; 0b111 : 1/256 | 1/128 ; REGISTRE INTCON (contrôle interruptions standard) ; ------------------------------------------------- INTCONVAL EQU B'10011000' ; GIE b7 : 0= masque toutes les interruptions ; PEIE b6 : 0= masque toutes les interruptions périphériques ; T0IE b5 : 0= masque les interruptions tmr0 ; INTE b4 : 0= masque les interruptions GP2/Int ; GPIE b3 : 0= masque les interruptions GP0/GP5 ; T0IF b2 : flag tmr0 ; INTF b1 : flag GP2/Int ; GPIF b0 : flag interruption GP0/GP5 ; REGISTRE PIE1 (contrôle interruptions périphériques) ; ---------------------------------------------------- PIE1VAL EQU B'00000000' ; EEIE b7 : 0= masque interruption de fin d'écriture EEPROM ; ADIE b6 : 0= masque interruption convertisseur A/D ; b5 : inutilisé ; b4 : inutilisé ; CMIE b3 : 0= masque interruption comparateur ; b2 : inutilisé ; b1 : inutilisé ; TMR1IE b0 : 0= masque interruption débordement tmr1 ; REGISTRE WPU (pull-up) ; ---------------------- WPUVAL EQU B'00000110' ; b7 : inutilisé ; b6 : inutilisé ; b5 : 0= pull-up GP5 hors-service ; b4 : 0= pull-up GP4 hors-service ; b3 : inutilisé ; b2 : 0= pull-up GP2 hors-service ; b1 : 0= pull-up GP1 hors-service ; b0 : 0= pull-up GP0 hors-service ; REGISTRE IOC (contrôle interruptions detaillé) ; ---------------------------------------------- IOCVAL EQU B'00000010' ; b7 : inutilisé ; b6 : inutilisé ; b5 : 0= masque interruption sur GP5 ; b4 : 0= masque interruption sur GP4 ; b3 : 0= masque interruption sur GP3 ; b2 : 0= masque interruption sur GP2 ; b1 : 0= masque interruption sur GP1 ; b0 : 0= masque interruption sur GP0 ; REGISTRE ANSEL (ANALOGIQUE/DIGITAL) ; ----------------------------------- ANSELVAL EQU B'00000000' ; b7 : inutilisé ; b6-4 : Sélection de l'horloge de conversion ; b3 : 1= GP3 en mode analogique (AN3) ; b2 : 1= GP2 en mode analogique (AN2) ; b1 : 1= GP1 en mode analogique (AN1) ; b0 : 1= GP0 en mode analogique (AN0) ; REGISTRE CMCON (COMPARATEUR) ; ---------------------------- CMCONVAL EQU B'00000111' ; b7 : inutilisé ; b6 : 1= COUT = Vin+ > Vin- (inversé si Cinv = 1) ; b5 : inutilisé ; b4 : 1= Entrées inversées (Cinv) ; b3 : 1= Vin- connecté Ã* Cin+, 0= Ã* Cin- ; b2-0 : Modes de comparaison p39 ; DIRECTION DU PORT I/O ; --------------------- DIRGP EQU B'00111110' ; Direction GP (1=entrée) ;******************* GENERALE *************************************** w_temp EQU 0x20 ; variable used for context saving status_temp EQU 0x21 ; variable used for context saving ;***************************************************************** ;* MACRO ;********************************************************************* LEDON macro bsf LED endm LEDOFF macro bcf LED endm BANK0 macro bcf STATUS,RP0 ; passer banque0 endm BANK1 macro bsf STATUS,RP0 ; passer banque1 endm ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x0020 bpg_state : 1 bpd_state : 1 led_state : 1 ENDC ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** ORG 0x000 ; processor reset vector goto _main ; go to beginning of program ;************************************************************************ ;* Interrupt vector ;************************************************************************ ORG 0x004 ; interrupt vector location ;************Sauvegarde du contexte***************** movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé BANK0 btfsc INTCON,GPIF ;if(BPG pas appuyé) LEDON ; non donc BPG appuyé btfsc INTCON,INTF ;if(BPD pas appuyé) LEDOFF ; non donc BPD appuyé bcf INTCON,INTF bcf INTCON,GPIF restorereg 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 ;********************************************************************* ; Fonctions * ;********************************************************************* pmcoInitHardware BANK0 clrf GPIO ; Sorties GPIO Ã* 0 BANK1 ; passer banque1 clrf EEADR ; permet de diminuer la consommation movlw OSCCALVAL ; charger la valeur movwf OSCCAL ; pour calibrer l'oscillateur interne movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option movlw PIE1VAL ; charger masque movwf PIE1 ; initialiser registre PIE1 movlw WPUVAL ; charger masque movwf WPU ; initialiser registre WPU movlw IOCVAL ; charger masque movwf IOC ; initialiser registre IOC movlw ANSELVAL ; charger masque movwf ANSEL ; initialiser registre ANSEL ; Effacer RAM ; ------------ movlw 0x20 ; 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,5 ; tester si fin zone atteinte (>=60) goto init1 ; non, boucler movlw DIRGP ; Direction GP movwf TRISIO ; écriture dans registre direction BANK0 ; passer banque0 movlw CMCONVAL ; masque de comparaison movwf CMCON ; chager comparaison control movlw INTCONVAL ; masque interruption movwf INTCON ; charger interrupt control return ;************************************************************************ ;* Debut du programme ;************************************************************************ _main call pmcoInitHardware boucle ;boucle principale nop goto boucle END
Je sais bien que lire un programme surtout en assembleur c'est chiant. Mais pouvez-vous en moins regarder la routine d'IT pour voir si ça vient de là. Merci.
-----