bonjour à tous!
Je souhaite effectuer un petit programme avec MPLAB sur un PIC16f84a qui aurait pour but de faire s'allumer la diode verte branchée sur le port B1 dès que le port A2 passe à 1 et de faire s'allumer la diode rouge branchée sur le port B2 dès que le port A3 passe à 1.(le programme que j'ai écrit ce trouve ci-dessous. j'ai utilisé les cours de Bigonoff pour l'écrire et j'utilise un circuit RC comme oscillateur)
Toutefois je voudrais que la diode verte ne puisse pas s'allumer pendant que la diode rouge est allumée ou si elle a déja été allumée une fois.
Seulement voila, les diodes s'allument puis s'éteignent dès que je ne mets plus à 1 les ports A2 ou A3!? alors que normalement elles devraient rester allumées puisque je ne mets aucune instruction pour les éteindre (sauf pour la verte mais c'est seulement dans le cas où la rouge doit s'allumer) . De plus, une fois que la rouge a été allumée puis s'éteind, la diode orange peut se rallumer: ce qui n'est pas normal d'après le programme que j'ai écrit.
Enfin mon dernier problème est que apparemment la routine de temporisation ne fonctionne pas. En effet, rien ne se passe quand je l'inclus dans le programme.
J'ajoute aussi que j'ai simulé mon programme sur MPLAB et qu'il fonctionne.
je remercie d'avance la personne qui pourra trouver la réponse à ces questions.
Au fait, est-ce nécessaire d'effacer la RAM lors de l'initialisation car lorsque je le fait, plus aucune LED ne s'allume.
voici mon programme (déoslé pour la présentation du programme mais je n'ai pas réussi à conserver les espaces):
LIST p=16F84A ; Définition de processeur
#INCLUDE <p16F84A.inc> ; Définitions des constantes
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_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
;***************************** ****************************** **********
; DECLARATIONS DE VARIABLES *
;***************************** ****************************** **********
CBLOCK 0x0C ;début de la zone variables
cmpt1 : 1
cmpt2 : 1
cmpt3 : 1
ma_variable : 1
temp : 1
attente : 1
ENDC ; Fin de la zone
;***************************** ****************************** ***********
; DEMARRAGE SUR RESET *
;***************************** ****************************** ***********
ORG 0x000 ;Adresse de départ après reset
GOTO init ;Adresse 0: initialiser
;***************************** ****************************** **********
; INITIALISATIONS *
;***************************** ****************************** **********
init org 0x5
;initialisation des ports
;------------------------
BCF STATUS,RP0 ;sélectionne la banque 0
CLRF PORTB ;efface le port B
CLRF PORTA ;efface le portA
BSF STATUS,RP0 ; sélectionner banque 1
MOVLW B'00000000' ;place cette valeur binaire dans W
MOVWF TRISB ;assigne le portB en sortie
MOVLW B'00011111' ;place cette valeur binaire dans W
MOVWF TRISA ;assigne les 5 premiers ports du portA en entrée
MOVLW B'10001000' ;place cette valeur dans W
MOVWF OPTION_REG ;puis dans le registre option
;effacer la RAM
;--------------
movlw 0x00C
movwf FSR
init1
clrf INDF
incf FSR,f
btfss FSR,6
goto init1
btfss FSR,4
goto init1
;initialisation variables
;------------------------
BCF STATUS,RP0 ; sélectionner banque 0
MOVLW 0x00 ;place 1 dans W
MOVWF ma_variable ;puis dans ma_variable
movlw 0x00
movwf attente
MOVLW B'00000000' ;place cette valeur dans W
MOVWF INTCON ;puis dans le registre INTCON
GOTO START ;saut jusqu'à start
;***************************** ****************************** **********
; sous routine *
;***************************** ****************************** **********
alerte
;call tempo
;decfsz attente,f
;return
bsf PORTB,1 ;non, allume LED1
return
alert1
BSF PORTB,2 ;allume LED2
BCF PORTB,1 ;éteind LED1
MOVLW 0x01
MOVWF ma_variable
return
alert2
BSF PORTB,3
BCF PORTB,1
BCF PORTB,2
CALL fin
return
fin
GOTO fin
return
;***************************** ****************************** **********
; SOUS ROUTINE DE TEMPORISATION *
;***************************** ****************************** **********
tempo
movlw 2 ;place 2 dans W
movwf cmpt3 ;initialise cmpt3 à 2
boucle3
movlw 255
movwf cmpt2
boucle2
movlw 255
movwf cmpt1
boucle1
nop ;perdre 1cycle*256*256*2
decfsz cmpt1,f ;décrémenter le compteur1
goto boucle1 ;si pas 0, boucler
decfsz cmpt2,f ;décrémente cmpt2, si 0 sauter prochaine instruction
goto boucle2 ;si pas 0,recommencer boucle 2
decfsz cmpt3,f ;décrémente cmpt3, si 0 sauter prochaine instruction
goto boucle3 ;si cmpt3 pas 0,recommencer boucle 3
return ;retour de la sous routine
;***************************** ****************************** **********
; PROGRAMME PRINCIPAL *
;***************************** ****************************** **********
START
MOVLW B'00000110' ;place cette valeur dans W
ANDWF PORTA,W ;opération qui
movwf temp
btfss temp,1 ;vérifie si
goto suite1 ;les diodes verte et orange
btfss temp,2 ;sont allumées
goto suite1 ;=dysfonctionnement du boitier
call alert2 ;si oui, appel de alerte2
suite1
movlw B'00001010' ;place cette valeur dans W
andwf PORTA,W ;opération qui
movwf temp
btfss temp,1 ;vérifie si
goto suite2 ;les diodes vertes et rouges
btfss temp,3 ;sont allumées
goto suite2 ;=dysfonctionnement du boitier
call alert2 ;si oui, appel de alerte2
suite2
movf PORTA,W
movwf temp
decfsz ma_variable,W ;test si la diode rouge s'est déjà allumée
btfsc temp,3 ;test si la diode rouge est allumée
goto suite3 ;si oui, saut à suite3
btfsc temp,2 ;test si orange à 0, si oui saute prochaine instruction
call alerte
suite3
movf PORTA,W
movwf temp
btfsc temp,3 ;test si rouge à 0, si oui saute prochaine instruction
call alert1 ;non, appelle alerte
GOTO START ; boucler
END ; directive fin de programme
-----