Problème programme assembleur pic12f675
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Problème programme assembleur pic12f675



  1. #1
    jojo150393

    Problème programme assembleur pic12f675


    ------

    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.

    -----

  2. #2
    RISC

    Re : Problème programme assembleur pic12f675

    Salut,

    Y a-t-il une raison spéciale pour que tu utilises l'assembleur plutôt que le C pour un si petit programme ?
    As-tu regardé les cours de Bigonoff ?

    Je te recommande TRES VIVEMENT si tu restes sur l'assembleur d'utiliser les macros de sélection de banque automatique (BANKSEL variable) avant chaque accès à une variable (voir Bigonoff).
    C'est une des erreurs les plus courantes et les plus difficiles à détecter.

    Le PIC12F675 est très très piégeux...Tous ceux qui l'ont utilisés savent de quoi je parle.
    Un grand nombre de fonction sur chaque broche...pour pouvoir accéder à une fonction particulière, surtout si elle est digitale il faur parfois passer par de multiples configurations (ANSEL, CMCON,...)
    Le MCLR qui peut être programmer en IO, etc...

    Pour ce qui est de l'interruption, regarde le cours de Bigonoff qui concerne le coeur Mid-Range (instructions sur 14 bits) = même coeur que le PIC16F877.

    C'est compliqué de comparer avec le simulateur à cause des pull-up,etc....le simulateur ne voit aussi pas les conflits électriques du vrai hardware...

    As-tu un schéma ?

    a+

  3. #3
    jojo150393

    Re : Problème programme assembleur pic12f675

    Merci RSC pour tes réponses.
    En fait cela ne venait pas du programme. Cela venait simplement de la sortie PGD de mon ICD2 qui était connecté sur une pin utilisé pas un bouton poussoir. Ma naïveté m'a fait croire que l'ICD2 ne générai des données que lors de la programmation.

    Désolé pour le faux problème et le post inutile.

  4. #4
    RISC

    Re : Problème programme assembleur pic12f675

    Salut,

    En mode programmation, l'ICD2 ne communique plus avec le PIC après avoir fini et vérifé la programmation. Par contre il "maintient" sans doute la broche ce qui peut "amener" un fonctionnement différent en mode connecté à l'ICD2 ou pas connecté.
    Le PIC12F675 est un produit pointu car on peut utiliser la broche MCLR en mode GPIO ..
    Il est possible de bouger la broche MCLR quand l'ICD2 est connecté car c'est équivalent à un drain ouvert (ou collecteur ouvert)

    Par contre, en mode debugger, des données sont échangées en permanence sur PGC et PGD.

    Il existe un module de DEBUG spécial qui permet d'avoir accès à toutes broches y compris pendant le debug. Ce module s'appelle un "header" en l'occurence il s'agit du AC162050. Il utilise un PIC "spécial" qui ajoute des broches et vu du dessous se comporte comme un PIC12F675 ce qui permet de deboguer tout en ayant toues les broches pour l'application ;=)

    a+

  5. A voir en vidéo sur Futura

Discussions similaires

  1. programme pic assembleur
    Par invite0e711291 dans le forum Électronique
    Réponses: 9
    Dernier message: 05/04/2012, 00h12
  2. Problème d' écriture un programme d' assembleur 1
    Par inviteb719afe3 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 21/11/2011, 20h27
  3. programme en assembleur
    Par invite9a9891ae dans le forum Électronique
    Réponses: 1
    Dernier message: 06/08/2007, 11h22
  4. programme assembleur
    Par inviteeb2cd22e dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 29/05/2006, 21h33
  5. Problème PIC12F675
    Par invitec3f40086 dans le forum Électronique
    Réponses: 0
    Dernier message: 22/02/2005, 13h32
Découvrez nos comparatifs produits sur l'informatique et les technologies.