Bonjour, pour mon projet en stage, j'ai choisi de réaliser un compteur avec pic 16f84A qui compte avec appuie sur un bouton et la RAZ est avec
un autre bouton, l'affichage est sur des sept segments, cette partie j'ai pu la réaliser, cependant, je veux ajouter des autres afficheurs sept
segments permettant de calculer la somme de tout le comptage, la RAZ sera avec un code écrit sur un KEYPAD affiché sur des sept segments ou
LCD (d'après ce que j'ai pu voir sur le forum il me faudra un autre pic pour piloter l'afficher)
ci joint à quoi ressemble mon projet (enfin le début )
le programme est le suivant, le problème est que quand je réinitialise le premier compteur, dés que le deuxième arrive a XXX0, le premier aussi
passe à XXX0 (donc le deuxième bit s'incrémente) ex: compteur 15 totaliseur 15 réinitialisation compteur 00 totaliseur 15 après 5 appuies,
compteur 10 totaliseur 20
voilà le programme:
LIST p=16F84 ; Définition de processeur
#include <p16F84.inc> ; Définitions des constantes
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;***************************** ****************************** **********
; ASSIGNATIONS *
;***************************** ****************************** **********
OPTIONVAL EQU B'00111111' ;interuption RB0 sur fron décendant
INTERMASK EQU B'00010000' ; Interruptions sur RB0
;***************************** ****************************** **********
; DEFINE *
;***************************** ****************************** **********
#DEFINE reset PORTA,4 ;
;***************************** ****************************** **********
; MACRO *
;***************************** ****************************** **********
BANK0 macro
bcf STATUS , RP0 ; passer banque0
endm
BANK1 macro
bsf STATUS , RP0 ; passer banque1
endm
;***************************** ****************************** **********
; DECLARATIONS DE VARIABLES *
;***************************** ****************************** **********
CBLOCK 0x00C ; début de la zone variables
w_temp :1 ; Sauvegarde du registre W
status_temp : 1 ; Sauvegarde du registre STATUS
cmpt :1 ; compteur de passage
c1,c2,c3,U1,U2,U3,U4,D1,D2,V1, V2,V3,V4,V5,V6
ENDC ; Fin de la zone
;***************************** ****************************** ***********
; 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é
; switch vers différentes interrupts
; inverser ordre pour modifier priorités
;----------------------------------------
btfsc INTCON,T0IE ; tester si interrupt timer autorisée
btfss INTCON,T0IF ; oui, tester si interrupt timer en cours
goto intsw1 ; non test suivant
call inttimer ; oui, traiter interrupt timer
bcf INTCON,T0IF ; effacer flag interrupt timer
goto restorereg ; et fin d'interruption
; SUPPRIMER CETTE LIGNE POUR
; TRAITER PLUSIEURS INTERRUPT
; EN 1 SEULE FOIS
intsw1
btfsc INTCON,INTE ; tester si interrupt RB0 autorisée
btfss INTCON,INTF ; oui, tester si interrupt RB0 en cours
goto intsw2 ; non sauter au test suivant
call intrb0 ; oui, traiter interrupt RB0
bcf INTCON,INTF ; effacer flag interupt RB0
goto restorereg ; et fin d'interruption
; SUPPRIMER CETTE LIGNE POUR
; TRAITER PLUSIEURS INTERRUPT
; EN 1 SEULE FOIS
intsw2
btfsc INTCON,RBIE ; tester si interrupt RB4/7 autorisée
btfss INTCON,RBIF ; oui, tester si interrupt RB4/7 en cours
goto intsw3 ; non sauter
call intrb4 ; oui, traiter interrupt RB4/7
bcf INTCON,RBIF ; effacer flag interupt RB4/7
goto restorereg ; et fin d'interrupt
; SUPPRIMER CETTE LIGNE POUR
; TRAITER PLUSIEURS INTERRUPT
; EN 1 SEULE FOIS
intsw3
BANK1 ; passer banque1
btfsc INTCON,EEIE ; tester si interrupt EEPROM autorisée
btfss EECON1,EEIF ; oui,tester si interrupt EEPROM
goto restorereg ; non sauter
call inteep ; traiter interruption eeprom
;restaurer registres
;-------------------
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
;***************************** ****************************** ***********
; INTERRUPTION TIMER 0 *
;***************************** ****************************** ***********
inttimer
decfsz cmpt , f ; décrémenter compteur de passages
return ; pas 0, on ne fait rien
movlw b'00000100' ; sélectionner bit à inverser
xorwf PORTA , f ; inverser LED
movlw 7 ; pour 7 nouveaux passages
movwf cmpt ; dans compteur de passages
return ; fin d'interruption timer
;***************************** ****************************** ***********
; INTERRUPTION RB0/INT *
;***************************** ****************************** ***********
intrb0
bcf INTCON,GIE
bcf INTCON,INTE
movlw h'02'
movwf D1
movwf D2
incf U1,f
movfw U1
incf V1,f
movfw V1
sublw 0x3A
btfss STATUS,Z
return
movlw 0x30
movwf U1
movwf V1
incf U2,f
movfw U2
incf V2,f
movfw V2
sublw 0x3A
btfss STATUS,Z
return
movlw 0x30
movwf U2
movwf V2
incf U3,f
movfw U3
incf V3,f
movfw V3
sublw 0x3A
btfss STATUS,Z
return
movlw 0x30
movwf U3
movwf V3
incf U4,f
movfw U4
incf V4,f
movfw V4
sublw 0x3A
btfss STATUS,Z
return
movlw 0x30
movwf U4
movwf V4
bcf INTCON,INTF
; fin d'interruption RB0/INT
; peut être remplacé par
; retlw pour retour code d'erreur
;***************************** ****************************** ***********
; INTERRUPTION RB4/RB7 *
;***************************** ****************************** ***********
intrb4
return
;***************************** ****************************** ***********
; INTERRUPTION EEPROM *
;***************************** ****************************** ***********
inteep
return ; fin d'interruption eeprom
; peut être remplacé par
; retlw pour retour code d'erreur
;***************************** ****************************** **********
; 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
movlw 0x01
movwf TRISB
movlw 0x10
movwf TRISA
; 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
; initialiser ports
; -----------------
BANK0 ; passer banque0
movlw INTERMASK ; masque interruption
movwf INTCON ; charger interrupt control
clrf PORTA
; initialisations variables
; -------------------------
;***************************** ****************************** **********
; PROGRAMME PRINCIPAL *
;***************************** ****************************** **********
start
movlw 0x30
movwf FSR
movlw 0x80
movwf INDF
incf FSR
movlw 0xF3
movwf INDF
incf FSR
movlw 0x48
movwf INDF
incf FSR
movlw 0x60
movwf INDF
incf FSR
movlw 0x33
movwf INDF
incf FSR
movlw 0x24
movwf INDF
incf FSR
movlw 0x04
movwf INDF
incf FSR
movlw 0xF0
movwf INDF
incf FSR
movlw 0x01
movwf INDF
incf FSR
movlw 0x20
movwf INDF
incf FSR
movlw 0x00
movwf INDF
incf FSR
movlw 0xFF
movwf INDF
goto debut
; allumage de touts les segments
movlw 0x3A
movwf U1
movwf U2
movwf U3
movwf U4
movlw h'12'
movwf D2
bcc
movlw h'02'
movwf D1
movlw h'02'
movwf D2
debut_bc
call affiche
decfsz D1
goto debut_bc
decfsz D2
goto bcc
;extinction de tous les segments
movlw 0x3B
movwf U1
movwf U2
movwf U3
movwf U4
movlw h'12'
movwf D2
bbb
movlw h'02'
movwf D1
movlw h'02'
movwf D2
debut_bb
call affiche
decfsz D1
goto debut_bb
decfsz D2
goto bbb
debut
movlw 0x30
movwf V1
movwf V2
movwf V3
movwf V4
movwf V5
movwf V6
debut1
movlw 0x30
movwf U1
movwf U2
movwf U3
movwf U4
boucle
movfw D1
btfsc STATUS,Z
goto dec_D2
decf D1
goto anul_int
dec_D2
movfw D2
btfsc STATUS,Z
goto valid_int
decf D2
goto anul_int
valid_int
bsf INTCON,GIE
bcf INTCON,INTF
bsf INTCON,INTE
goto suite
anul_int
bcf INTCON,INTF
bcf INTCON,INTE
bcf INTCON,GIE
suite
call affiche
btfsc reset
goto boucle
goto debut1
affiche
movlw 0x00
movwf PORTA
movfw U1
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x01
movwf PORTA
movfw U2
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x02
movwf PORTA
movfw U3
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x03
movwf PORTA
movfw U4
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x04
movwf PORTA
movfw V1
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x05
movwf PORTA
movfw V2
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x06
movwf PORTA
movfw V3
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x07
movwf PORTA
movfw V4
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x08
movwf PORTA
movfw V5
movwf FSR
movfw INDF
movwf PORTB
call tempo
movlw 0x09
movwf PORTA
movfw V6
movwf FSR
movfw INDF
movwf PORTB
call tempo
return
tempo
movlw 0x10
movwf c1
b3 movlw 0x10
movwf c2
b2 movlw 0x10
movwf c3
b1 decfsz c3
goto b1
decfsz c2
goto b2
decfsz c1
goto b3
return
END ; directive fin de programme
toute intervention est la bienvenue, si je n'étais pas très claire dans la description de mon projet, vos questions sont les bienvenues (malgré
que je préfère vos réponses )
-----