Bonjour, je suis en train de programmer un pic 16f84a en assembleur avec le logiciel
MPLAB IDE de la société Microship. Le but de mon programme, est simple (puisque je suis débutant
dans la programmation des pic). Lu but est d'allumer et d'ateindre des LED branchées sur les sorties
A1, A2, A3 (du port A du composant). J'ai donc pensé à réaliser une boucle mais elle ne marche pas.
Voici mon code:
LIST p=16F84 ; Définition de processeur
#include <p16F84.inc> ; Définitions de variables
__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. 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'0008' ; Valeur registre option
; Résistance pull-up ON
; Pas de préscaler
;***************************** ****************************** **********
; DEFINE *
;***************************** ****************************** **********
#DEFINE LED PORTA,0 ; Led 1
#DEFINE LED1 PORTA,1 ; Led 2
#DEFINE LED2 PORTA,2 ; Led 3
#DEFINE LED3 PORTA,3 ; Led 4
#DEFINE BOUTON PORTB,2 ; bouton-poussoir
;***************************** ****************************** ***********
; DEMARRAGE SUR RESET *
;***************************** ****************************** ***********
org 0x000 ; Adresse de départ après reset
goto init ; Adresse 0: initialiser
;***************************** ****************************** **********
; 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 OPTIONVAL ; 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
; initialisations spécifiques
; ---------------------------
bcf LED ; LED en sortie (banque1)
bcf LED1
bcf LED2
bcf LED3
bcf STATUS,RP0 ; repasser banque 0
goto start ; sauter au programme principal
;***************************** ****************************** **********
; DECLARATIONS DE VARIABLES *
;***************************** ****************************** **********
CBLOCK 0x00C ; début de la zone variables
cmpt1 : 1 ; compteur de boucles 1
cmpt2 : 1 ; compteur de boucles 2
cmpt3 : 1 ; compteur de boucles 3
cmpt4: 1 ; compteur de boucles 4
ENDC ; Fin de la zone
;***************************** ****************************** **********
; SOUS-ROUTINE DE TEMPORISATION *
;***************************** ****************************** **********
;---------------------------------------------------------------------
; Cette sous-routine introduit un retard de 500.000 µs.
; Elle ne reçoit aucun paramètre et n'en retourne aucun
;---------------------------------------------------------------------
tempo
movlw 2 ; pour 2 boucles
movwf cmpt3 ; initialiser compteur3
boucle3
clrf cmpt2 ; effacer compteur2
boucle2
clrf cmpt1 ; effacer compteur1
boucle1
nop ; perdre 1 cycle
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
decfsz cmpt3,f ; si 0, décrémenter compteur 3
goto boucle3 ; si cmpt3 pas 0, recommencer boucle2
return ; retour de la sous-routine
;***************************** ****************************** **********
; MACRO *
;***************************** ****************************** **********
CLIGLED0 macro
bsf PORTA, cmpt4
call tempo
bcf PORTA, cmpt4
call tempo
endm
;***************************** ****************************** **********
; PROGRAMME PRINCIPAL *
;***************************** ****************************** **********
start
movlw 4 ;on met 4 dans w
movwf cmpt4 ; on met w dans cmpt4
goto boucleLED
boucleLED
CLIGLED0
decfsz cmpt4, f ;décrémente cmpt4 de 1 si cmpt4>0
goto boucleLED
goto start ; boucler
END ; directive fin de programme
Pourriez vous m'aider? Je pense que le problème se situe dans le programme principal et plus précisément
dans la boucle boucleLED mais je n'en suis pastotalement sûr.
Merci de votre aide...
Jonathan
-----