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

#111 Message par JMarc » lun. 14 nov. 2016 18:43

Bonjour Maï

J'avais bien compris que cela ne te plaisais pas et j'avais noté "fait a ma sauce" :lol:

quand j'ai vue ta facon et bien je te l'ai piqué :langue:

Code : Tout sélectionner

   ;*********************************************************************
   
movfw    ComptSu        addition puis test si 0
   iorwf    ComptSd
,w
   iorwf    ComptMu
,w
   iorwf    ComptMd
,w
   btfsc    STATUS
,Z
   
goto    BouP0
 
;******************
    
decf    ComptSu,F    ;uS-1
    btfss   ComptSu
,7
    
goto BouP
    movlw   0X09
    movwf   ComptSu


Cela ma plus et j'ai remplacé aussitôt mon code par le tiens que je me régale a voir tourner sous debug.
Je prend aussi les exemples des organigrammes, j'espère qu'ils vont m'inspirer

Je n'ose pas ouvrir un fil pour chaque chose que je ne comprend pas, ils y en aurai trop oops

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

#112 Message par Guest » lun. 14 nov. 2016 19:30

JMarc a écrit :

Code : Tout sélectionner

   ;*********************************************************************
   movfw    ComptSu        ; addition puis test si 0
   iorwf    ComptSd
,w
   iorwf    ComptMu
,w
   iorwf    ComptMd
,w
   btfsc    STATUS
,Z
   goto    BouP0
 
;******************
    decf    ComptSu,F    ;uS-1
    btfss   ComptSu
,7
    goto BouP
    movlw   0X09
    movwf   ComptSu





Mais la il y a un petit problème,le compte n'est pas bon. Il y a une seconde de trop OUI OUI OUI, mais je te laisse finir le projet. après on regarde qui plus court et le plus rapide :sifflotte: YES

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

#113 Message par JMarc » lun. 21 nov. 2016 19:20

Bonsoir tout le monde

non, non, je n'ai pas abandonné, juste que je pédale sévère

J'ai résolu mes plantages du au passage de la gestion des afficheurs par interruption avec timer0.
un coup timer0 tourne pendant la section programmation, après problème au démarrage, de que je trouve une panne une autre apparaît :furieux:

maintenant des 0 arrêt du programme, le compte est bon :langue:

je sais c'est le fouillis mais je débute et vu le temps passé a chercher maintenant l'expérience est mémorisé :sifflotte:

allé maintenant j'attaque la gestion des bp

Code : Tout sélectionner

;*******************************************************************
;
;********************************************************************
;
;
   Auteur   :maï/JMarc
;   Version   :1.1
;   Date   :11/2016   
;
;
    timer0 = gestion afficheurs
;    timer1 = gestion du temps
;********************************************************************
;
            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
   GLOBAL   tempaffi
 udata    0x30
ComptSu   res 1            ;comteur seconde
ComptSd   res 1
ComptMu   res 1            ;compteur minute
ComptMd   res 1
tempaffi   res 1  
;*********************** Définitions variables en RAM PAGE0 *********
    CBLOCK   0x20
    Sauv
    Sauv1
    Temp            ;compteur temps
    i,j,              ;temporaire boucle
 ;   tempaffi
   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
   

         
;********************************************************************

   ORG 0x00

    GOTO    Principale

;****************** Gestion des interruptions ***********************
   ORG 0x04
   
   MOVWF   Sauv         ;sauve W
   SWAPF   STATUS, 0      ; 
   MOVWF   Sauv1         ;sauve status
   
   btfss   PIR1,TMR1IF        ; test timer1 en cours
   goto        timer0        ; non alors test suivant
   MOVLW   TIMER1L         ;oui
   MOVWF   TMR1L        ; 45
   MOVLW   TIMER1H         ;on recharge le timer1
   MOVWF   TMR1H        ; 207
       
   BCF   PIR1,TMR1IF      ;RAZ du drapeau de TMR1
       
   INCF   Temp,F         ; à 10 cela fera 1s
   goto fintimer
;************************
; test timer0
timer0
   btfss    INTCON,T0IF        ;test si interuption tmr0
   goto        fintimer        ; non alors fin
   bcf        INTCON,T0IF        ; raz du drapeau TMR0
   decf        tempaffi,f        ; -1 au compteur des afficheurs
   call        affichage
   
fintimer
   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 ************************
;*************************timer0
   bcf    OPTION_REG,PSA        ;diviseur sur timer et non wachdog
   bcf    OPTION_REG,PS2        ; PS2=0,PS1=1,PS0=0 diviser tmr0 par 8
   bcf    OPTION_REG,PS0
   bcf     OPTION_REG,T0CS
;   bsf     INTCON,T0IE        ; valide le TMR0 
   
;************************timer1   
   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
     
    clrf       TMR0            ; effacement compteur par precaution

   BSF   T1CON,TMR1ON      ;    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
   bsf        PORTB,3    ; allumage led sur le port3 (alimentation plaque de cuisson)
   
   movlw    0X05
   movwf    tempaffi
   
   bsf     INTCON,T0IE        ; valide le TMR0 

;*********************** 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         
   CLRF       Temp         ;RAZ compteur temp
 
   ;*********************************************************************
   decf        ComptSu,f
   
   movfw    ComptSu        ; addition puis test si 0
   iorwf    ComptSd,w
   iorwf    ComptMu,w
   iorwf    ComptMd,w
   btfsc    STATUS,Z
   goto    BouP0
 ;******************
    btfss   ComptSu,7
    goto BouP
    movlw   0X09
    movwf   ComptSu
    
    decf    ComptSd,F
    btfss   ComptSd,7
    goto    BouP
    movlw   0X05
    movwf   ComptSd
    
    decf    ComptMu,F
    btfss   ComptMu,7
    goto    BouP
    movlw   0x09
    movwf   ComptMu
    
    decf    ComptMd
    goto    BouP
BouP0
    bcf        T1CON,TMR1ON    ; arret timer
    bcf        PORTB,3        ; extextion de la led sur portB
    bsf        PORTB,4        ; sonnerie sur portb en fonction
    goto BouP

   
   
Alarm 

    GOTO   AFFI            ; affiche
;*********************** Ici c'
est les sous Programmes *************************   


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
   
   
affichage  
   call Tem2ms
   decfsz   tempaffi
   goto        affi1
   bcf        PORTA
,1
   BSF   PORTA
,0         ;allumage digit0
   MOVFW   ComptSu         
;charge la donnée
   CALL   LedTable      
;recherche donnée
   MOVWF   PORTC         
;envoi donnée
   movlw    0X05
   movwf    tempaffi
   RETURN
   

affi1
   decfsz   tempaffi
   goto        affi2
   bcf        PORTA
,2
   BSF   PORTA
,1
   MOVFW   ComptSd
   CALL   LedTable
   MOVWF   PORTC
   movlw    0X02
   movwf    tempaffi
   RETURN

affi2
   decfsz   tempaffi
   goto        affi3
   bcf        PORTA
,3
   BSF   PORTA
,2
   MOVFW   ComptMu
   CALL   LedTable
   MOVWF   PORTC
   movlw    0X03
   movwf    tempaffi
   RETURN

affi3
   bcf        PORTA
,0
   BSF   PORTA
,3
   MOVFW   ComptMd
   CALL   LedTable
   MOVWF   PORTC         
;idem digit3
      
   movlw    0X04
   movwf    tempaffi
   
   RETURN
;*****************************************************************************
Traitementboutonvalid
    bcf        INTCON
,T0IE        ; arret du TMR0 affichage géré manuellement
    bcf        PORTA
,1        ; autres afficheurs eteints
    BCF        PORTA
,2
    BCF        PORTA
,3
   
relachbpvalid
   CALL        Tem2ms
   btfsc    BOUTONVALID        
; test si RB2 +5 volt si non sauté l'instruction suivante
   goto        relachbpvalid    ; 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

bouclevalid
    call    Tem2ms
    btfsc   BOUTONVALID        ; test appuie boutonvalid (RB2)
    goto    boucleafficheurdizaine
    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
    
;*****************************************************************************
;
        suite provisoire car bientot traitement par macro
;*****************************************************************************
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

bouclevalid2
    call    Tem2ms
    btfsc   BOUTONVALID        ; test appuie boutonvalid (RB2)
    goto    boucleafficheurcentaine
    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
    

boucleafficheurcentaine
    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

bouclevalid3
    call    Tem2ms
    btfsc   BOUTONVALID        ; test appuie boutonvalid (RB2)
    goto    boucleafficheurmillier
    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
     
boucleafficheurmillier
   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

bouclevalid4
    call    Tem2ms
    btfsc   BOUTONVALID        ; test appuie boutonvalid (RB2)
    goto    bouclesortie
    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
    
;****************************************************************************
;
        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    TMR0
    bsf        INTCON
,T0IE        ; demarage du TMR0 qui était affichage géré manuellement
    CLRF    Temp        
;RAZ compteur temp
    GOTO    AFFI  
   
    END

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

#114 Message par Guest » lun. 21 nov. 2016 20:26

Bonsoir

:bravo: Pour la gestion de l'int est des timer 0 et 1 identique à mon programme, sauf que je ne fais pas un call affichage mais un goto j'aime pas les calls dans les INT :sifflotte: .

petite question c'est quoi

Code : Tout sélectionner

decf        tempaffi,f        ; -1 au compteur des afficheurs



Pour la suite, je te conseils, encore et toujours de repartir sur un nouveau fichier source, avec la gestion de l'int comme tu as fais et une boucle du sytle BouP goto BouP et un spg ton module affichage comme celui du #82.
Cela devrait d'afficher de joli ZERO avec le rafraîchissement PAR le TIMER0 qui entre nous une tres bonne avancé. ici rappel du spg affichage

Code : Tout sélectionner

;*********************** Affichage sur 4 digits ********************************
AFFI
   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
   RETURN


C'est CA la base après dans la boucle tu traites du module des BP et dans le module affichage le clignotement du digit sélectionne reste le module décomptage avec son problème de la seconde de trop oui oui oui module que tu rajoutes en SPG

et on va pouvoir manger nos œufs :lol:

A+

PS bon il faut aussi tout ce qui y a autour, les configs port int etc.. mais ça tu l'avais deviné :wink:

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

#115 Message par JMarc » lun. 21 nov. 2016 20:54

maï a écrit :
petite question c'est quoi

Code : Tout sélectionner

decf        tempaffi,f        ; -1 au compteur des afficheurs


Chaque passage tmr0, je decremente tempaffi que je teste dans la parti gestion affichage pour le choix du digit a allumer

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

#116 Message par Guest » mar. 22 nov. 2016 19:38

Bonsoir
JMarc a écrit :
Chaque passage tmr0, je decremente tempaffi que je teste dans la parti gestion affichage pour le choix du digit a allumer


Oui c'est pas bon puisque il faut passer par le pointeur FSR.

Bon ici

Code : Tout sélectionner

;********************************************************************
;
                descriptif du projet:
;
Decompteur programmable, sur 4 digits 7 segemnts,
;
2 BP un plus variables,un validation deplacement et demarrage decompteur.
;
;;********************************************************************
;
;
                Auteur    :JMarc maï
;                Version    :1.0
;                Date    :2016
;
;*******************************************************************************
;
            Note:PIC 16F877a par exemple
;                                
;*******************************************************************************
    ERRORLEVEL-302
    
   list       p
=16f877         ;liste directive du 16F877
   
#include    "p16f877.inc"

;********************** chargement des Macros **********************************   

;***************************** Configuation des fuses **************************
;
            
; CONFIG
; __config 0x3D3A
 __CONFIG _FOSC_HS 
& _WDTE_OFF & _PWRTE_OFF & _CP_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF
;
;
;***********************
 déclaration des variables *****************************
;
Toutes ces variables sont globales pour le fichier source,MEM MEM_us MEM1 
;MEM1_us MEM2 pour l'ensemble du projet.

;*******************************************************************************
 GLOBAL    MEM,MEM1            ;variables utilisables dans tout le projet
 GLOBAL    MEM_us,MEM1_us            ; pour macro delay
 GLOBAL    MEM2
 
Group_gobal udata 0x20
MEM    res 1                ;MEM :MEM2 sont necessaires
MEM_us    res 1    
MEM1    res 1                ;pour les macros delay
MEM1_us res 1    
MEM2    res 1                ;
 
Group_Local udata 0x30
ComptSu        res 1            ;comteur seconde
ComptSd        res 1
ComptMu        res 1            ;compteur minute
ComptMd        res 1
Index        res 1            ;lors programmation digit concerné 
Temp        res    1            ;compteur temps
Temp_Val    res    1            ;compteur temps touche val        
Sauv        res 2            ;pour sauvegarde registres lors INT
    
        
;*********************** Definition des Externes *******************************
;
;*********************** Déclarations des définitions **************************
#DEFINE    _XTAL_FREQ  .4000000        ;ici FOSC =4MHz
        
#DEFINE BP_Plus PORTB,0
#DEFINE    BP_Val PORTB,1

        
;*********************** Assignations ou constantes ****************************
DRAM    EQU 0x20         ;début Mémoire Ram banque0
    
;*********************** MACROS ************************************************
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 sur 4 digits ********************************
Aff7    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

;*********************** TOUT COMMENCE ICI *************************************
    org 0X00                   ;au rest le pointeur instruction est ICI
    GOTO debut                 ;saut sur le label debut

    org 0X04
    MOVWF   Sauv            ;sauve W
    SWAPF   STATUS,W        ; 
    MOVWF   Sauv+1            ;sauve status
    
    BTFSS    PIR1,TMR1IF        ;test flag si TIMER1
    GOTO    Int0            ;NON
    
    MOVLW    0x3C            ; int toute le 100ms    
    MOVWF    TMR1H
    MOVLW    0xB3
    MOVWF    TMR1
    
    BCF    PIR1,TMR1IF        ;RAZ du drapeau de TMR1
    INCF    Temp,F            ; à 10 cela fera 1s
    INCF    Temp_Val,F        ;tempo BP Val
    GOTO    IntS
    
Int0    BTFSS    INTCON,T0IF        ;Test flag si TIMER0
    GOTO    IntS            ;on sort pour gerer l'
affichage
    BCF    INTCON
,T0IE        ;ARRET INT TMR0
    
    Aff7
    
    MOVLW    0XA
    MOVWF    TMR0            
; charge Timer0 pour 1ms
    BCF    INTCON
,T0IF        ;RAZ Flag TIMER0
    BSF    INTCON
,T0IE        ;mise en service INT TMR0
    
IntS    SWAPF    Sauv
+1,0
    MOVWF    STATUS            
;restaure status
    SWAPF    Sauv
, 1 
    SWAPF    Sauv
, 0            ;restaure W

    RETFIE
    
;*********************** 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
   
;**********ici c'est votre programme principale ou main ************************
debut
;*********************** 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            ;efface les sorties des ports
    CLRF   PORTC
 Banque1                ;accés bank1
    
    CLRF   TRISA            ;RA:RA5    en sortie
    
    MOVLW  B'
00000111'        ;RB0:RB1 en entrées
    MOVWF   TRISB
    
    CLRF   TRISC            ;RC0:RC7 en sortie
   
    MOVLW   B'
00000110'        ;PORTA digitale
    MOVWF   ADCON1

;*********************** validation des INT ************************************
    MOVLW   (1<<GIE)|(1<<PEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)
    MOVWF    INTCON            ;Initialisation des INT
    
    BSF    PIE1,TMR1IE        ;valide int TMR1
;******************* Initialisation des timers/compteurs ***********************       
;                   ici on va travailler avec le TIMER1 et TIMER0
;*******************************************************************************

    MOVLW    0x01
    MOVWF    OPTION_REG
    
 Banque0    
    MOVLW 0xA
    MOVWF TMR0
    
;**********************
    BSF T1CON, 0x4
    BCF T1CON, 0x5
    MOVLW 0x3C
    MOVWF TMR1H
    MOVLW 0xB3
    MOVWF TMR1
    
    BSF    T1CON,TMR1ON        ; mise en service Timer1
    
;********************** Boucle principale **************************************    
BouP    GOTO    BouP    

;********************** ici c'
est des SPG **************************************    
Tem2ms
    MOVLW 0x3
    MOVWF MEM1
    MOVLW 0x98
    MOVWF MEM
temp    DECFSZ MEM
, F
    GOTO temp
    DECFSZ MEM1
, F
    GOTO temp

    RETURN
    END                
;fin pour le compilateur

la base de départ qui faut travailler, tu l'as deja fait. :wink: c'est l'affichage en macro avec rafraîchissement par le timer0 qui tourne tout seul sans passer par le module bouton ni décomptage

il y a la boucle principale qui tourne sur elle même et c'est de la qu'il faut faire le module des BP. Je 'invite a faire cela si tu le veux bien bouton plus incrémentation de digit BP validation déplacement du digit pour le moment laisse tomber le clignotement du digit sélectionné.

ici tu vas devoir travailler avec le pointeur FSR

tu es d’accord et surtout tu suis ????

A+

P allez encore 4 semaines puis je poste ma version :furieux: on y croit

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

#117 Message par JMarc » mar. 22 nov. 2016 23:22

Bonsoir Maï

Ce que je ne comprend pas c'est que tu ma dit pas de call dans les inters.
Sur le prog si dessus, lors de l'inter tmr0, la macro affichage est appelé, tout les afficheurs sont traités sur une seule inter. La tempo 2ms est appelé 4 fois par un call.
Pourquoi utilisé la 2ms plutôt que celle que j'ai fait qui utilise que le tmr0 ?

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

#118 Message par Guest » mer. 23 nov. 2016 14:20

Bonjour JMarc
JMarc a écrit :Ce que je ne comprend pas c'est que tu ma dit pas de call dans les inters.


Pas de call mais une MACRO, pas call Aff7 ni de return , mais juste Aff7
Sur le prog si dessus, lors de l'inter tmr0, la macro affichage est appelé, tout les afficheurs sont traités sur une seule inter. La tempo 2ms est appelé 4 fois par un call.


oui 2ms c'est le temps nécessaire pour ne pas faire scintiller les afficheurs (voir moins mais attention) et un fois dans la macro on fait les 4 afficheurs affaire régle
Pourquoi utilisé la 2ms plutôt que celle que j'ai fait qui utilise que le tmr0 ?

le timer 0 est la uniquement pour le faire le rafraîchissement de afficheur et laisser un peu de temps entre 2 affichages au module BP:

cela fonctionne comme cela:
les variables temps
ComptSu res 1 ;comteur seconde
ComptSd res 1
ComptMu res 1 ;compteur minute
ComptMd res 1

nous avons ou aurons 4 modules

Affichage
BP
Décomptage
Alarme

le liens entre ces modules c'est les variables temps,
Pour Affichage <=>BP
-Toute le 1ms on donne la main au module BP, suivant action modif les variables temps(touche plus )ou on décompte si validation puis on affiche au rythme du timer 0

bien sur il faut maîtriser le pointeur FSR

A+

PS 1ms on peut en prendre plus mais c'est quand même ~ 1000 instructions il y a de quoi faire

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

#119 Message par JMarc » dim. 27 nov. 2016 18:54

Bonjour Maï

J'ai un probleme dans la source ci dessus avec TMR1, j'ai remplacé par TMR1L, c'est correct ?
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
; MOVWF TMR1
movwf TMR1L

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

#120 Message par Guest » dim. 27 nov. 2016 19:05

oui c'est idem, en principe ton compile doit trouver le registre TIMER1 ou TIMER1L

ici le fichier 16f877.inc avec TIMER1 et TIMERL
TIMER1.png


A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités