Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
compteur décompteur sur 7 segments
JMarc a écrit :mon idée etait l'appuis sur valid (il fallait trouvé un nom, j'ai mis valid) pour sortir du chrono et entrée dans la parti correction des unitées avec l'allumage que des unitées, alors si appuie du bouton plus = incrementation des unités de 0 a 9 et repassage a 0. si appuie sur valid = passage sur les dizaines puis les centaines puis les milliers puis retour au chrono.
si chrono affiché, si appuie sur plus alors demarage du chrono, nouvel appuis arret
plus tard, après reglage du chrono, envoie des données dans l'eprom mais cela sera plus tard
J'ai plusieur idée, un compteur manuel, une minuterie pour les abreuvoirs, .... mais pour l'instant ces pour l'entrainement
Oui mais la c'est pas la bon procédure, à la mise en service tu dois être dans le mode programmation compteur a ZÉRO, pas dans le mode chrono.
Donc il faut bien définir, que vont faire tes boutons.car ils sont ton INTERFACE .Exemple:
On programme digits après digits ou comme dans un compteur?
si c'est digits après digits La sélection du digit? c'est le BP centrale, le gauche de incrémentation digit, le droit incrémentation digit. Comment visualiser ce digit, ici pas de curseur(on fait clignoter le digit,ou on fait un curseur). Pour sortir de la programmation et passer en mode chrono quel bouton? Le centrale, avec un temps plus long de combien de l'appuie pour faire différence avec la sélection des digits
une fois le chrono lancé, on peu l’arrêter? Si oui avec quel bouton centrale appuie long de combien, et comme cela on peut affiner par exemple
le bouton droit, si appui permanent au bout de X temps c'est tout le compteur de l'on incrément a une vitesse supérieur
bon on va pas en faire un cheval de course c'est juste pour cuire des oeufs mais tu vois pas si simple
et j'ai pas parlé on compte ou l'on décompte pour arriver a zero ou a la valeur de la programmation
compteur décompteur sur 7 segments
Je suis tout à fait d'accord avec toi mais je sais pas encore programmer pour avoir une idée précise sur le module final.
L'exercice d'éclaircir la gestion des pb ma pris la journée (oui je sais, je ne suis pas rentable
), réflexions, essais sous debug, essais sur platines, recommencer
Je part de zéro
La tempo du début c'est parce que le bp a déjà été appuyé plus haut
L'emplacement des bp? Pas grave je recablerai
Visu de l'afficheur? Allumage de l'afficheur concerné et extinction des autres
Nombres de bp? Je dois pouvoir me passer de bpmoins car une fois incrémenté a 9=>passage à 0
Démarrage du pic => chargement de la valeur de l'eeprom puis directement sur chrono en décompte. Si appuis sur bpvalib=>modif de la valeur puis enregistrement dans eeprom
Pour la vitesse? J'essai de tenir compte de tes infos même si c'est difficile pour moi
mais j'ai l'impression que cela viens peut a peut. Je pense que nous sommes toujours dans le bon sujet et je pense ouvrir un autre post plus tard au quel nous reprendrons ce sujet enfin de l'optimiser 
L'exercice d'éclaircir la gestion des pb ma pris la journée (oui je sais, je ne suis pas rentable
Je part de zéro
La tempo du début c'est parce que le bp a déjà été appuyé plus haut
L'emplacement des bp? Pas grave je recablerai
Visu de l'afficheur? Allumage de l'afficheur concerné et extinction des autres
Nombres de bp? Je dois pouvoir me passer de bpmoins car une fois incrémenté a 9=>passage à 0
Démarrage du pic => chargement de la valeur de l'eeprom puis directement sur chrono en décompte. Si appuis sur bpvalib=>modif de la valeur puis enregistrement dans eeprom
Pour la vitesse? J'essai de tenir compte de tes infos même si c'est difficile pour moi
compteur décompteur sur 7 segments
Bonjour
Je remet le code pour repartir sur des bonnes bases
J'ai réussi a finir le bouton plus
Le bouton moins n'est pas fini, il ne gère pas le retour a zéro mais je le ferai plus tard
Je remet le code pour repartir sur des bonnes bases
J'ai réussi a finir le bouton plus
Le bouton moins n'est pas fini, il ne gère pas le retour a zéro mais je le ferai plus tard
Code : Tout sélectionner
;*******************************************************************
;;*******************************************************************
;
;********************************************************************
;
; Auteur :maï/JMarc
; Version :1.0
; Date :09/2016
;
;********************************************************************
; Note:PIC 16F877
;********************************************************************
ERRORLEVEL-302
ERRORLEVEL-305
list p=16f877 ;liste directive du 16F876a
#include "p16f877.inc"
; CONFIG
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;*********************** Déclarations des définitions ***************
DIRPORTB EQU B'00000111' ; Direction PORTB
;********************************************************************
#DEFINE BOUTONPLUS PORTB,0
#DEFINE BOUTONMOINS PORTB,1
#DEFINE BOUTONVALID PORTB,2
;*********************** Assignations *******************************
DRAM EQU 0x20 ;début Mémoire Ram banque0
FRAM EQU 0X7F ;fin Mémoire Ram banque0
Fosc EQU .04 ;Valeur du quartz en MHz
;********************** calcul pour une boucle de temporisation ****************
; a 2 niveaux sur un 16F boucle secondaire en 756 cycles
;*******************************************************************************
TEMPS1 EQU .2000000 ;en ns a modifier suivant besoin ici 2ms
TEMPO EQU ((TEMPS1/(.4000/Fosc))/.768)
;********************** calcul pour timer1 *************************************
DIVISEUR1 equ .8 ;ici 8 du TMR
TEMPS EQU .100000 ;Valeur en µs a modifier suivant besoin
TIMER1 EQU .65535-((Fosc*TEMPS)/(.4*DIVISEUR1)-2);les-2 pour temps chargement timer1
TIMER1L EQU LOW TIMER1 ;valeur
TIMER1H EQU HIGH TIMER1 ;pour 100 ms qu'il faudra incorporer dans le timer 1
;*********************** GLOBAL ************************************************
GLOBAL ComptSu
GLOBAL ComptSd
GLOBAL ComptMu
GLOBAl ComptMd
udata 0x30
ComptSu res 1 ;comteur seconde
ComptSd res 1
ComptMu res 1 ;compteur minute
ComptMd res 1
;*********************** Définitions variables en RAM PAGE0 *********
CBLOCK 0x20
Sauv
Sauv1
Temp ;compteur temps
i,j ;temporaire boucle
ENDC
;*********************** Macro **************************************
Banque0 MACRO
BCF STATUS,RP0 ;Acces bank0
BCF STATUS,RP1
ENDM
Banque1 MACRO
BSF STATUS,RP0 ;Acces bank1
BCF STATUS,RP1
ENDM
Banque2 MACRO
BCF STATUS,RP0 ;acces bank2
BSF STATUS,RP1
ENDM
Banque3 MACRO
BSF STATUS,RP0 ;Acces bank4
BSF STATUS,RP1
ENDM
AFFICHAGE MACRO
BSF PORTA,0 ;allumage digit0
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
CALL Tem2ms ;petite tempo 2ms
BCF PORTA,0 ;arrêt digit0
BSF PORTA,1
MOVFW ComptSd
CALL LedTable
MOVWF PORTC
CALL Tem2ms ;idem digit1
BCF PORTA,1
BSF PORTA,2
MOVFW ComptMu
CALL LedTable
MOVWF PORTC
CALL Tem2ms ;idem digit2
BCF PORTA,2
BSF PORTA,3
MOVFW ComptMd
CALL LedTable
MOVWF PORTC ;idem digit3
CALL Tem2ms
BCF PORTA,3
ENDM
;********************************************************************
ORG 0x00
GOTO Principale
;****************** Gestion des interruptions ***********************
ORG 0x04
MOVWF Sauv ;sauve W
SWAPF STATUS, 0 ;
MOVWF Sauv1 ;sauve status
MOVLW TIMER1L ;oui
MOVWF TMR1L
MOVLW TIMER1H ;on recharge le timer1
MOVWF TMR1H
BCF PIR1,TMR1IF ;RAZ du drapeau de TMR1
INCF Temp,F ; à 10 cela fera 1s
SWAPF Sauv1,0
MOVWF STATUS ;restaure status
SWAPF Sauv, 1
SWAPF Sauv, 0 ;restaure W
RETFIE ; retour int
;*********************** Alumage segments afficheur ****************************
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
;*******************************************************************
; Début du Programme
;*******************************************************************
Principale
;*********************** Mise a zéro de la mémoire RAM banque0 ******
MOVLW DRAM
MOVWF FSR
Effa CLRF INDF
INCF FSR,F ;RAZ RAM
BTFSS FSR,7
GOTO Effa
;*********************** Initialisation des ports *******************
CLRF PORTA
CLRF PORTB
CLRF PORTC
Banque1 ;accés bank1
CLRF TRISA ;PortA en sortie
movlw DIRPORTB ; Direction PORTB
movwf TRISB ; écriture dans registre direction
CLRF TRISC ;Broches RC0:RC7 en sortie
MOVLW B'00000110' ;PORTA digitale
MOVWF ADCON1 ;
;*********************** validation des INT ************************
BSF INTCON,GIE ;validation des INT
BSF INTCON,PEIE
BSF PIE1,TMR1IE ;valide le TMR1
Banque0 ;acces banque 0
;******************* Initialisation des timers/compteurs *************
; ici on va travailler avec le TIMER1
;*********************************************************************
MOVLW (0)|(0)|(1<<T1CKPS1)|(1<<T1CKPS0)|(0<<T1OSCEN)|(0<<T1SYNC)|(0<<TMR1CS)|(0<<TMR1ON)
MOVWF T1CON
MOVLW TIMER1H ;on charge le TIMER1
MOVWF TMR1H
MOVLW TIMER1L ;voir son calcul dans
MOVWF TMR1L ;assignation
BSF T1CON,TMR1ON ;arrêt TMR1 Mise en route du timer1
;*********************** Affichage sur 4 digits ********************************
AFFI
AFFICHAGE
BTFSC BOUTONVALID ; si +5volts sur RB2 alors goto
goto Traitementboutonvalid
;********************** Boucle principale *************************************
BouP MOVLW 0X0A ;on test si 10fois 100mS
SUBWF Temp,W
BTFSS STATUS,Z
GOTO AFFI ;NON
CLRF Temp ;RAZ compteur temp
INCF ComptSu ; oui compteur seconde +1
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptSu,W
BTFSS STATUS,C
GOTO AFFI ;NON
INCF ComptSd ;oui dizaine+1 unité=0
CLRF ComptSu
MOVLW 0X06 ;ici on test si compteur =60S
SUBWF ComptSd,W
BTFSS STATUS,Z
GOTO AFFI ;NON on affiche et boucleP
CLRF ComptSu ;RAZ du compteur
CLRF ComptSd
INCF ComptMu ;minute +1
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptMu,W
BTFSS STATUS,C
GOTO AFFI ;NON
INCF ComptMd ;oui dizaine+1 unité=0
CLRF ComptMu
MOVLW 0X06 ;ici on test si compteur =60Mn
SUBWF ComptMd,W
BTFSS STATUS,Z
GOTO AFFI ;NON on affiche et boucleP
CLRF ComptSu ;RAZ du compteur
CLRF ComptSd
; Alarm
GOTO AFFI ; affiche
;*********************** Ici c'est les sous Programmes *************************
Tem20ms
clrf i
movlw .20
movwf j
goto Tem0
Tem2ms
CLRF i
MOVLW TEMPO
MOVWF j ;charge variable boucle principale
Tem0 DECFSZ i ;test si boucle secondaire =0
GOTO Tem0 ;NON retoure dans boucle secondaire
DECFSZ j ;test si boucle principale =0
GOTO Tem0 ;NON recharge boucle secondaire
RETURN ;oui fin de la tempo
;*****************************************************************************
Traitementboutonvalid
AFFICHAGE
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto Traitementboutonvalid ; boucle pour attendre le relachement du bouton
BSF PORTA,0 ;allumage digit0
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto boucleafficheurdizaine
btfsc BOUTONMOINS
goto bouclemoins
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus ; attendre le relachement du bouton
incf ComptSu
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptSu,W
BTFSC STATUS,C
CLRF ComptSu ; remise a zéro
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid
bouclemoins
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins ; attendre le relachement du bouton
decf ComptSu
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid
;*****************************************************************************
; suite provisoire car bientot traitement par macro
;*****************************************************************************
; Traitementboutonvalid
boucleafficheurdizaine
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto boucleafficheurdizaine ; boucle pour attendre le relachement du bouton
BCF PORTA,0 ;arrêt digit0
BSF PORTA,1 ;allumage digit1
MOVFW ComptSd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid2
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto boucleafficheurcentaine
btfsc BOUTONMOINS
goto bouclemoins2
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid2 ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus2
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus2 ; attendre le relachement du bouton
incf ComptSd
MOVLW 0X06 ; on test si poid faible >9
SUBWF ComptSd,W
BTFSC STATUS,C
CLRF ComptSd ; remise a zéro
MOVFW ComptSd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid2
bouclemoins2
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins2 ; attendre le relachement du bouton
decf ComptSd
MOVFW ComptSd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid2
;***************************************************************************
; Traitementboutonvalid
boucleafficheurcentaine
; AFFICHAGE
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto boucleafficheurcentaine ; boucle pour attendre le relachement du bouton
BCF PORTA,1 ;arrêt digit1
BSF PORTA,2 ;allumage digit2
MOVFW ComptMu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid3
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto boucleafficheurmillier
btfsc BOUTONMOINS
goto bouclemoins3
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid3 ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus3
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus3 ; attendre le relachement du bouton
incf ComptMu
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptMu,W
BTFSC STATUS,C
CLRF ComptMu ; remise a zéro
MOVFW ComptMu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid3
bouclemoins3
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins3 ; attendre le relachement du bouton
decf ComptMu
MOVFW ComptMu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid3
;*************************************************************
; afficheur millier
; Traitementboutonvalid
boucleafficheurmillier
; AFFICHAGE
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto boucleafficheurmillier ; boucle pour attendre le relachement du bouton
BCF PORTA,2 ;arrêt digit2
BSF PORTA,3 ;allumage digit3
MOVFW ComptMd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid4
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto bouclesortie
btfsc BOUTONMOINS
goto bouclemoins4
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid4 ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus4
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus4 ; attendre le relachement du bouton
incf ComptMd
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptMd,W
BTFSC STATUS,C
CLRF ComptMd ; remise a zéro
MOVFW ComptMd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid4
bouclemoins4
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins4 ; attendre le relachement du bouton
decf ComptMd
MOVFW ComptMd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid4
;****************************************************************************
; fin du provisoire
;*******************************************************************************
bouclesortie
call Tem2ms
btfsc BOUTONVALID
goto bouclesortie ; boucle pour attendre que le bouton soit relaché
BCF PORTA,3 ;arrêt digit0
CLRF Temp ;RAZ compteur temp
GOTO AFFI
END
Modifié en dernier par JMarc le mar. 8 nov. 2016 14:44, modifié 1 fois.
compteur décompteur sur 7 segments
Bonjour à tous
Suite au plantage, du forum, il manque les derniers post, c'est pas grave
Je résume,
Donc le prog tourne mais n'est pas du tout optimisé et c'est le fouilli donc il faut que j'optimise
J'ai repris les posts du début
Enlever le défine sur la déclaration du portB car elle n'est utilisé qu'une seule fois
Redescendre le test du bouton valid pour ne plus avoir le goto
Supprimer certaines tempo et passer à 800milli les anti rebonds bp relâchement
Et c'est même tempo doivent utiliser le timer
Suis-je loin de la vérité ?
Car je doit corriger ce qui ne va pas avant de continuer cette belle aventure
Suite au plantage, du forum, il manque les derniers post, c'est pas grave
Donc le prog tourne mais n'est pas du tout optimisé et c'est le fouilli donc il faut que j'optimise
J'ai repris les posts du début
Enlever le défine sur la déclaration du portB car elle n'est utilisé qu'une seule fois
Redescendre le test du bouton valid pour ne plus avoir le goto
Supprimer certaines tempo et passer à 800milli les anti rebonds bp relâchement
Et c'est même tempo doivent utiliser le timer
Suis-je loin de la vérité ?
Car je doit corriger ce qui ne va pas avant de continuer cette belle aventure
compteur décompteur sur 7 segments
Bonjour
Tu dois utiliser 2 timers ,un pour la tempo d'une seconde,voir plus si.... et un dédié uniquement au rafraîchissement de l'affichage.
Pourquoi le timer pour affichage.
L'affichage, doit être renouvelé, dans un temps tres court, pour éviter les scintillements voir le clignotement de celui ci.Nous sommes partis ,avec dans le cahier des charges (je sais pas encore fait ) que le basculement du module programmation vers le module décomptage ce fait sur un temps long sur le BP val, un temps long a l’échelle humain c'est a partir de la 1/2 s soit 500ms vers ...... C'est énorme 1/2 s pour l'affichage, qui va donc clignoter.
Si tu as une autre solution, je suis preneur
Perso j'ai fini la partie programmation avec clignotement digits sélectionné et passage en décomptage.Reste la partie Décomptage plus le module alarme. Mais ca c'est pour toi
allez plaisir de voir ce code optimisé
A+
PS: si tu as un soucis avec la gestion des BP je t’ai fait un organigramme
Tu dois utiliser 2 timers ,un pour la tempo d'une seconde,voir plus si.... et un dédié uniquement au rafraîchissement de l'affichage.
Pourquoi le timer pour affichage.
L'affichage, doit être renouvelé, dans un temps tres court, pour éviter les scintillements voir le clignotement de celui ci.Nous sommes partis ,avec dans le cahier des charges (je sais pas encore fait ) que le basculement du module programmation vers le module décomptage ce fait sur un temps long sur le BP val, un temps long a l’échelle humain c'est a partir de la 1/2 s soit 500ms vers ...... C'est énorme 1/2 s pour l'affichage, qui va donc clignoter.
Si tu as une autre solution, je suis preneur
Perso j'ai fini la partie programmation avec clignotement digits sélectionné et passage en décomptage.Reste la partie Décomptage plus le module alarme. Mais ca c'est pour toi
allez plaisir de voir ce code optimisé
A+
PS: si tu as un soucis avec la gestion des BP je t’ai fait un organigramme
compteur décompteur sur 7 segments
Bonjour Maï
Je me suis mal exprimé, le timer pour l'affichage, je voulais dire le rafraîchissement de l'affichage et la tempo donc nous sommes d'accord
Mais pour la tempo
je ne comprend pas comment faire, j'ouvre un post la dessus pour ne pas surcharger celui ci
pour la parti décompte du chrono, voici ma mayonnaise
, je poste le code complet pour que l'on soit d'accord
Pour le basculement du module programmation vers le module Décomptage, mais solution par appuis sur bpval n'est pas bien ? avec allumage que de l'afficheur concerné et si encore appuis passage sur l'afficheur suivant ? ainsi dessuite.
J'ai laissé le bpmoins pour l'instant car il m'amuse (il a un bug que je cherche a corriger) mais si nous adoptons ma solution je le supprimerai
J'ai hate de voir ta partie programmation avec clignotement digits
Je me suis mal exprimé, le timer pour l'affichage, je voulais dire le rafraîchissement de l'affichage et la tempo donc nous sommes d'accord
Mais pour la tempo
pour la parti décompte du chrono, voici ma mayonnaise
Pour le basculement du module programmation vers le module Décomptage, mais solution par appuis sur bpval n'est pas bien ? avec allumage que de l'afficheur concerné et si encore appuis passage sur l'afficheur suivant ? ainsi dessuite.
J'ai laissé le bpmoins pour l'instant car il m'amuse (il a un bug que je cherche a corriger) mais si nous adoptons ma solution je le supprimerai
J'ai hate de voir ta partie programmation avec clignotement digits
Code : Tout sélectionner
;*******************************************************************
;
;********************************************************************
;
; Auteur :maï/JMarc
; Version :1.1
; Date :11/2016
;
;********************************************************************
; Note:PIC 16F877
;********************************************************************
ERRORLEVEL-302
ERRORLEVEL-305
list p=16f877 ;liste directive du 16F876a
#include "p16f877.inc"
; CONFIG
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;*********************** Déclarations des définitions ***************
;
;********************************************************************
#DEFINE BOUTONPLUS PORTB,0
#DEFINE BOUTONMOINS PORTB,1
#DEFINE BOUTONVALID PORTB,2
;*********************** Assignations *******************************
DRAM EQU 0x20 ;début Mémoire Ram banque0
FRAM EQU 0X7F ;fin Mémoire Ram banque0
Fosc EQU .04 ;Valeur du quartz en MHz
;********************** calcul pour une boucle de temporisation ****************
; a 2 niveaux sur un 16F boucle secondaire en 756 cycles
;*******************************************************************************
TEMPS1 EQU .2000000 ;en ns a modifier suivant besoin ici 2ms
TEMPO EQU ((TEMPS1/(.4000/Fosc))/.768)
;********************** calcul pour timer1 *************************************
DIVISEUR1 equ .8 ;ici 8 du TMR
TEMPS EQU .100000 ;Valeur en µs a modifier suivant besoin
TIMER1 EQU .65535-((Fosc*TEMPS)/(.4*DIVISEUR1)-2);les-2 pour temps chargement timer1
TIMER1L EQU LOW TIMER1 ;valeur
TIMER1H EQU HIGH TIMER1 ;pour 100 ms qu'il faudra incorporer dans le timer 1
;*********************** GLOBAL ************************************************
GLOBAL ComptSu
GLOBAL ComptSd
GLOBAL ComptMu
GLOBAl ComptMd
udata 0x30
ComptSu res 1 ;comteur seconde
ComptSd res 1
ComptMu res 1 ;compteur minute
ComptMd res 1
;*********************** Définitions variables en RAM PAGE0 *********
CBLOCK 0x20
Sauv
Sauv1
Temp ;compteur temps
i,j ;temporaire boucle
ENDC
;*********************** Macro **************************************
Banque0 MACRO
BCF STATUS,RP0 ;Acces bank0
BCF STATUS,RP1
ENDM
Banque1 MACRO
BSF STATUS,RP0 ;Acces bank1
BCF STATUS,RP1
ENDM
Banque2 MACRO
BCF STATUS,RP0 ;acces bank2
BSF STATUS,RP1
ENDM
Banque3 MACRO
BSF STATUS,RP0 ;Acces bank4
BSF STATUS,RP1
ENDM
AFFICHAGE MACRO
BSF PORTA,0 ;allumage digit0
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
CALL Tem2ms ;petite tempo 2ms
BCF PORTA,0 ;arrêt digit0
BSF PORTA,1
MOVFW ComptSd
CALL LedTable
MOVWF PORTC
CALL Tem2ms ;idem digit1
BCF PORTA,1
BSF PORTA,2
MOVFW ComptMu
CALL LedTable
MOVWF PORTC
CALL Tem2ms ;idem digit2
BCF PORTA,2
BSF PORTA,3
MOVFW ComptMd
CALL LedTable
MOVWF PORTC ;idem digit3
CALL Tem2ms
BCF PORTA,3
ENDM
;********************************************************************
ORG 0x00
GOTO Principale
;****************** Gestion des interruptions ***********************
ORG 0x04
MOVWF Sauv ;sauve W
SWAPF STATUS, 0 ;
MOVWF Sauv1 ;sauve status
MOVLW TIMER1L ;oui
MOVWF TMR1L
MOVLW TIMER1H ;on recharge le timer1
MOVWF TMR1H
BCF PIR1,TMR1IF ;RAZ du drapeau de TMR1
INCF Temp,F ; à 10 cela fera 1s
SWAPF Sauv1,0
MOVWF STATUS ;restaure status
SWAPF Sauv, 1
SWAPF Sauv, 0 ;restaure W
RETFIE ; retour int
;*********************** Alumage segments afficheur ****************************
LedTable
addwf PCL,f ; ajout au PC
retlw B'00111111' ; LED allum?es pour afficher 0
retlw B'00000110' ; LED allum?es pour afficher 1
retlw B'01011011' ; LED allum?es pour afficher 2
retlw B'01001111' ; LED allum?es pour afficher 3
retlw B'01100110' ; LED allum?es pour afficher 4
retlw B'01101101' ; LED allum?es pour afficher 5
retlw B'01111101' ; LED allum?es pour afficher 6
retlw B'00000111' ; LED allum?es pour afficher 7
retlw B'01111111' ; LED allum?es pour afficher 8
retlw B'01100111' ; LED allum?es pour afficher 9
retlw B'00000000' ; Effacement toutes LED
;*******************************************************************
; Début du Programme
;*******************************************************************
Principale
;*********************** Mise a zéro de la mémoire RAM banque0 ******
MOVLW DRAM
MOVWF FSR
Effa CLRF INDF
INCF FSR,F ;RAZ RAM
BTFSS FSR,7
GOTO Effa
;*********************** Initialisation des ports *******************
CLRF PORTA
CLRF PORTB
CLRF PORTC
Banque1 ;accés bank1
CLRF TRISA ;PortA en sortie
movlw B'00000111' ; Direction PORTB RB0,RB1 et RB2 en entrée
movwf TRISB ; écriture dans registre direction
CLRF TRISC ;Broches RC0:RC7 en sortie
MOVLW B'00000110' ;PORTA digitale
MOVWF ADCON1 ;
;*********************** validation des INT ************************
BSF INTCON,GIE ;validation des INT
BSF INTCON,PEIE
BSF PIE1,TMR1IE ;valide le TMR1
Banque0 ;acces banque 0
;******************* Initialisation des timers/compteurs *************
; ici on va travailler avec le TIMER1
;*********************************************************************
MOVLW (0)|(0)|(1<<T1CKPS1)|(1<<T1CKPS0)|(0<<T1OSCEN)|(0<<T1SYNC)|(0<<TMR1CS)|(0<<TMR1ON)
MOVWF T1CON
MOVLW TIMER1H ;on charge le TIMER1
MOVWF TMR1H
MOVLW TIMER1L ;voir son calcul dans
MOVWF TMR1L ;assignation
BSF T1CON,TMR1ON ;arrêt TMR1 Mise en route du timer1
;*****************************************************
; pour l'exercie, je charge les variables a 9
; cette parti sera remplacé par un accée a l'eeprom
movlw 0X09
movwf ComptSu
movlw 0X05
Movwf ComptSd
movlw 0X09
movwf ComptMu
movlw 0X05
Movwf ComptMd
;*********************** Affichage sur 4 digits ********************************
AFFI
AFFICHAGE
BTFSC BOUTONVALID ; si +5volts sur RB2 alors goto
goto Traitementboutonvalid
;********************** Boucle principale *************************************
BouP MOVLW 0X0A ;on test si 10fois 100mS
SUBWF Temp,W
BTFSS STATUS,Z
GOTO AFFI ;NON
CLRF Temp ;RAZ compteur temp
;INCF ComptSu ; oui compteur seconde +1
decf ComptSu ; decrémentation, sauté si 0
movlw 0XFF ;
subwf ComptSu,W ; teste si passage sous 0
btfss STATUS,C ; oui saut pour traitement
goto AFFI ; non afficher le chiffre
decf ComptSd
movlw 0X09
movwf ComptSu ; recharger unité a 9
;MOVLW 0X0A ; on test si poid faible >9
; SUBWF ComptSu,W
; BTFSS STATUS,C
; GOTO AFFI ;NON
; INCF ComptSd ;oui dizaine+1 unité=0
; CLRF ComptSu
MOVLW 0XFF ;ici on test si inférieur a 0
SUBWF ComptSd,W
BTFSS STATUS,Z
GOTO AFFI ;NON on affiche et boucleP
decf ComptMu
movlw 0X09
movwf ComptSu ; recharger unité a 9
movlw 0X05
movwf ComptSd ; recharger dizaine a 5
MOVLW 0XFF ; on test si sous 0
SUBWF ComptMu,W
BTFSS STATUS,C
GOTO AFFI ;NON
decf ComptMd
movlw 0X09
movwf ComptSu ; recharger unité a 9
movlw 0X05
movwf ComptSd ; recharger dizaine a 5
movlw 0X09
movwf ComptMu ; recharge Centaine
MOVLW 0XFF ;ici on test si inférieur 0
SUBWF ComptMd,W
BTFSS STATUS,Z
GOTO AFFI ;NON on affiche et boucleP
; Alarm
;**************************************************
; ici traitement de la fin du comptage
; pour l'instant, rechargement des variables et bouclage
; mais les oeufs vont etre cramés lol
movlw 0X09
movwf ComptSu
movlw 0X05
movwf ComptSd
movlw 0X09
movwf ComptMu
movlw 0X05
movwf ComptMd
GOTO AFFI ; affiche
;*********************** Ici c'est les sous Programmes *************************
Tem20ms
clrf i
movlw .20
movwf j
goto Tem0
Tem2ms
CLRF i
MOVLW TEMPO
MOVWF j ;charge variable boucle principale
Tem0 DECFSZ i ;test si boucle secondaire =0
GOTO Tem0 ;NON retoure dans boucle secondaire
DECFSZ j ;test si boucle principale =0
GOTO Tem0 ;NON recharge boucle secondaire
RETURN ;oui fin de la tempo
;*****************************************************************************
Traitementboutonvalid
AFFICHAGE
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto Traitementboutonvalid ; boucle pour attendre le relachement du bouton
BSF PORTA,0 ;allumage digit0
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto boucleafficheurdizaine
btfsc BOUTONMOINS
goto bouclemoins
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus ; attendre le relachement du bouton
incf ComptSu
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptSu,W
BTFSC STATUS,C
CLRF ComptSu ; remise a zéro
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid
bouclemoins
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins ; attendre le relachement du bouton
decfsz ComptSu,f ; sauté l'instruction suivante si 0
goto suitemoins ; pas 0 allé plus loing
movfw ComptSu
CALL LedTable
movwf PORTC
movlw 0X0A ; essai pour remetre a 10 dans w
movwf ComptSu ; de w au registre comptsu
goto bouclevalid
suitemoins
MOVFW ComptSu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid
;*****************************************************************************
; suite provisoire car bientot traitement par macro
;*****************************************************************************
; Traitementboutonvalid
boucleafficheurdizaine
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto boucleafficheurdizaine ; boucle pour attendre le relachement du bouton
BCF PORTA,0 ;arrêt digit0
BSF PORTA,1 ;allumage digit1
MOVFW ComptSd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid2
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto boucleafficheurcentaine
btfsc BOUTONMOINS
goto bouclemoins2
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid2 ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus2
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus2 ; attendre le relachement du bouton
incf ComptSd
MOVLW 0X06 ; on test si poid faible >9
SUBWF ComptSd,W
BTFSC STATUS,C
CLRF ComptSd ; remise a zéro
MOVFW ComptSd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid2
bouclemoins2
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins2 ; attendre le relachement du bouton
decfsz ComptSd,f ; sauté l'instruction suivante si 0
goto suitemoins2 ; pas 0 allé plus loing
movfw ComptSd
CALL LedTable
movwf PORTC
movlw 0X06 ; essai pour remetre a 10 dans w
movwf ComptSd ; de w au registre comptsu
goto bouclevalid2
suitemoins2
MOVFW ComptSd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid2
;***************************************************************************
; Traitementboutonvalid
boucleafficheurcentaine
; AFFICHAGE
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto boucleafficheurcentaine ; boucle pour attendre le relachement du bouton
BCF PORTA,1 ;arrêt digit1
BSF PORTA,2 ;allumage digit2
MOVFW ComptMu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid3
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto boucleafficheurmillier
btfsc BOUTONMOINS
goto bouclemoins3
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid3 ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus3
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus3 ; attendre le relachement du bouton
incf ComptMu
MOVLW 0X0A ; on test si poid faible >9
SUBWF ComptMu,W
BTFSC STATUS,C
CLRF ComptMu ; remise a zéro
MOVFW ComptMu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid3
bouclemoins3
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins3 ; attendre le relachement du bouton
decfsz ComptMu,f ; sauté l'instruction suivante si 0
goto suitemoins3 ; pas 0 allé plus loing
movfw ComptMu
CALL LedTable
movwf PORTC
movlw 0X0A ; essai pour remetre a 10 dans w
movwf ComptMu ; de w au registre comptsu
goto bouclevalid3
suitemoins3
MOVFW ComptMu ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid3
;*************************************************************
; afficheur millier
; Traitementboutonvalid
boucleafficheurmillier
; AFFICHAGE
call Tem2ms
btfsc BOUTONVALID ; test si RB2 +5 volt si non sauté l'instruction suivante
goto boucleafficheurmillier ; boucle pour attendre le relachement du bouton
BCF PORTA,2 ;arrêt digit2
BSF PORTA,3 ;allumage digit3
MOVFW ComptMd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
;**************************************************************************************
; ma boucle d'attente d'appuie des boutons poussoirs
;*************************************************************************************
bouclevalid4
call Tem2ms
btfsc BOUTONVALID ; test appuie boutonvalid (RB2)
goto bouclesortie
btfsc BOUTONMOINS
goto bouclemoins4
btfss BOUTONPLUS ; test appuie boutonplus (RB0), si non sauté l'instruction suivante
goto bouclevalid4 ; boucle pour attendre soit appuie de valid soit appuie de plus
;***************************************************************************************
boucleplus4
call Tem2ms
btfsc BOUTONPLUS
goto boucleplus4 ; attendre le relachement du bouton
incf ComptMd
MOVLW 0X06 ; on test si poid faible >5
SUBWF ComptMd,W
BTFSC STATUS,C
CLRF ComptMd ; remise a zéro
MOVFW ComptMd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid4
bouclemoins4
call Tem2ms
btfsc BOUTONMOINS
goto bouclemoins4 ; attendre le relachement du bouton
decfsz ComptMd,f ; sauté l'instruction suivante si 0
goto suitemoins4 ; pas 0 allé plus loing
movfw ComptMd
CALL LedTable
movwf PORTC
movlw 0X06 ; essai pour remetre a 6 dans w
movwf ComptMd ; de w au registre comptsu
goto bouclevalid4
suitemoins4
MOVFW ComptMd ;charge la donnée
CALL LedTable ;recherche donnée
MOVWF PORTC ;envoi donnée
goto bouclevalid4
;****************************************************************************
; fin du provisoire
;*******************************************************************************
bouclesortie
call Tem2ms
btfsc BOUTONVALID
goto bouclesortie ; boucle pour attendre que le bouton soit relaché
BCF PORTA,3 ;arrêt digit0
CLRF Temp ;RAZ compteur temp
GOTO AFFI
END
compteur décompteur sur 7 segments
compteur décompteur sur 7 segments
bon pour le Decomptage c'est cela mais dit moi pourquoi tu fais cela
j'ai pris la les unites de minutes mais c'est idem pour les autres
alors qu'il suffit de faire
tu as deja fais la modif sur les autres variables
j'ai pris la les unites de minutes mais c'est idem pour les autres
Code : Tout sélectionner
movlw 0X09
movwf ComptSu ; recharger unité a 9
movlw 0X05
movwf ComptSd ; recharger dizaine a 5
movlw 0X09
movwf ComptMu ; recharge Centaine
alors qu'il suffit de faire
Code : Tout sélectionner
movlw 0X09
movwf ComptMu ; recharge Centaine
tu as deja fais la modif sur les autres variables
compteur décompteur sur 7 segments
compteur décompteur sur 7 segments
maï a écrit :bon pour le Decomptage c'est cela mais dit moi pourquoi tu fais cela
alors qu'il suffit de faireCode : Tout sélectionner
movlw 0X09
movwf ComptMu ; recharge Centaine
tu as deja fais la modif sur les autres variables
Bien vu, merci. C'est une erreur de mon cerveau, je me suis embrouillé
Pour le boucle ok, je pourrais allumer une led lors du décompte et l'arrêter une fois à zéro, même allumer une seconde led une fois à zéro
La première serai le contacteur le la plaque de cuisson et la seconde la sonnerie
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : venom et 2 invités

