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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

compteur décompteur sur 7 segments
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#71 Message par Guest » lun. 7 nov. 2016 21:04

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 :sifflotte:

J'ai plusieur idée, un compteur manuel, une minuterie pour les abreuvoirs, .... mais pour l'instant ces pour l'entrainement :-D


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 :sifflotte:

compteur décompteur sur 7 segments
JMarc
Confirmé
Confirmé
Messages : 607
Enregistré en : août 2016
Localisation : Dans le Sud...

#72 Message par JMarc » lun. 7 nov. 2016 23:39

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 :cry: ), réflexions, essais sous debug, essais sur platines, recommencer :mur:
Je part de zéro :eek:

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 :cry: 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 :wink:

compteur décompteur sur 7 segments
JMarc
Confirmé
Confirmé
Messages : 607
Enregistré en : août 2016
Localisation : Dans le Sud...

#73 Message par JMarc » mar. 8 nov. 2016 08:28

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

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
JMarc
Confirmé
Confirmé
Messages : 607
Enregistré en : août 2016
Localisation : Dans le Sud...

#74 Message par JMarc » mer. 9 nov. 2016 23:59

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 :mur:

Suis-je loin de la vérité ?

Car je doit corriger ce qui ne va pas avant de continuer cette belle aventure :wink:

compteur décompteur sur 7 segments
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#75 Message par Guest » jeu. 10 nov. 2016 08:11

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 :wink:

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
JMarc
Confirmé
Confirmé
Messages : 607
Enregistré en : août 2016
Localisation : Dans le Sud...

#76 Message par JMarc » jeu. 10 nov. 2016 10:09

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 :wink:
Mais pour la tempo :mur: 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 :shock: , 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 :roll:


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'
exercieje 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'
instantrechargement 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
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#77 Message par Guest » jeu. 10 nov. 2016 10:20

C'est bien a part ta mixture en fin de code

Je vais regarder le décomptage a vol d'oiseau bien :lol:

compteur décompteur sur 7 segments
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#78 Message par Guest » jeu. 10 nov. 2016 10:38

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

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
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#79 Message par Guest » jeu. 10 nov. 2016 10:59

Pour le Décomptage il serait bien a zéro STOP. Allez, c'est bien :bravo:

compteur décompteur sur 7 segments
JMarc
Confirmé
Confirmé
Messages : 607
Enregistré en : août 2016
Localisation : Dans le Sud...

#80 Message par JMarc » jeu. 10 nov. 2016 13:44

maï a écrit :bon pour le Decomptage c'est cela mais dit moi pourquoi tu fais cela


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



Bien vu, merci. C'est une erreur de mon cerveau, je me suis embrouillé :cry:

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 :idea:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : venom et 2 invités