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

#1 Message par JMarc » sam. 24 sept. 2016 16:25

Bonjour a tous

Comme je suis nouveau dans la programmation, Maï m'aide a apprendre ce monde magnifique de la programmation des pics en assembleur.

soyez indulgent, je comprend vite mais il faut m'expliquer longtemps :sifflotte:

d'abord voici le code de départ

Code : Tout sélectionner

;*******************************************************************
;
;********************************************************************
;
;   
Auteur   :maï/JMarc
;   Version   :1.0
;   Date   :09/2016   
;
;********************************************************************
;            
Note:PIC 16F876A_04            
;********************************************************************
   
ERRORLEVEL-302

   
list       p=16f877         ;liste directive du 16F876a
   
#include    "P16F877.INC"

    
__CONFIG   _CP_OFF _DEBUG_OFF _WRT_ENABLE_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _PWRTE_ON _WDT_OFF _HS_OSC 
   
;*********************** Déclarations des définitions ***************
;*********************** 
Assignations *******************************

DRAM   EQU 0x20         ;début Mémoire Ram banque0
FRAM    EQU 0X7F         
;fin Mémoire Ram banque0
QUARTZ   EQU .4           
;Valeur du quartz en MHz 
       
DIVISEUR1   equ   .8         
;ici 8 du TMR
TEMPS   EQU .100000         
;Valeur en µs   Normalement .100000
TIMER1   EQU .65535
-((QUARTZ*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
;*********************** Déclaration des Globales *******************
   GLOBAL Sauv, Sauv1, Temp
   GLOBAL ComptSu,ComptSd
   
   UDATA
    Sauv res 1
    Sauv1 res 1
    Temp res 1
    ComptSu res 1
    ComptSd res 1
;*********************** Définitions variables en RAM PAGE0 *********
   CBLOCK   0x20
   ;Sauv,Sauv1,Temp
   ;ComptSu
   ;ComptSd
   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      ;        dans w
   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                ; dans w
   MOVWF   STATUS         ;restaure status
   SWAPF   Sauv, 1                ; 1=f
   SWAPF   Sauv, 0         ;restaure W          0=w
   
   RETFIE            ; retour int
   
;*********************** AFFICHAGE des SECONDES *******************************
;poids fort ComptSd ;poid faible ComptSu
;******************************************************************************   
   
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
   CLRF   TRISB         ;Broches RB0:RB7 en sortie
   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
   
;******************* 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    bit a 1
   
;********************** Boucle principale *************************************
   
AFFI
   
   MOVFW   ComptSu    ; compteur des unitées
   CALL   LedTable
   MOVWF    PORTC
   MOVFW   ComptSd    ; compteur des dizaines
   CALL   LedTable
   MOVWF   PORTB
  
Boup MOVLW   0X0A        ;on test si 10fois 100mS     0x0A
   SUBWF   Temp,W        ; temp - w
   BTFSS   STATUS,Z    ;  si resultat = 0, drapeau z de status =0, alors saut
   GOTO   BouP         ;NON on retourne dans la boucle P
   INCF   ComptSu         ; oui compteur seconde +1

   
   MOVLW   0X0A         ; on test si poid faible >9
   SUBWF   ComptSu,W
   BTFSS   STATUS,C
   GOTO   Compt         
   INCF   ComptSd
   CLRF   ComptSu
   
Compt   MOVLW   0X06         ;ici on test si compteur =60S
   SUBWF   ComptSd,W        ; ComptSd - w
   BTFSS   STATUS,Z
   GOTO   AFFI         ; NON on retourne dans boucle P
   CLRF   ComptSu         ;RAZ du compteur
   CLRF   ComptSd
   GOTO   AFFI
   
;*********************** Allez c'
est partie *************************            
    
END

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

#2 Message par JMarc » sam. 24 sept. 2016 16:33

L'idée est de libérer un port et de faire du multiplexage
J'aurai pu copier un programme existant mais je souhaite comprendre. je me suis dit trop simple bsf porta,0 pour commander les cathodes commune de l'afficheur des unitées, envoie sur portc des données, bcf porta,0 puis bsf portb,1 envoie des données pour l'afficheur des dizaines :sifflotte:

oui mais j'ai passé la journée et l'afficheur fonctionne mais illisible du moins pas d'une qualité qui me convient
voici le dernier resultat de ma recherche :mur:

Code : Tout sélectionner

   
;********************** Boucle principale *************************************
   
AFFI
   clrf    Temp        
j'ai rajouté l'effacement de Temp
BouP 
    BTFSC   PORTA
,0
    
GOTO chiffre2
 
    BCF        PORTA
,1
    BSF        PORTA
,0
   MOVFW   ComptSu    
compteur des unitées
   CALL   LedTable
   MOVWF    PORTC
    BTFSC   PORTA
,0
   
GOTO Suite
chiffre2
   BCF    PORTA
,0
   BSF    PORTA
,1
   MOVFW   ComptSd    
compteur des dizaines
   CALL   LedTable
   MOVWF   PORTC
  
   
Suite   
MOVLW   0X0A        
;on test si 10fois 100mS     0x0A
   SUBWF   Temp
,W        temp w
   BTFSS   STATUS
,Z    ;  si resultat 0drapeau z de status =0alors saut
   
GOTO   BouP         ;NON on retourne dans la boucle P
   INCF   ComptSu         
oui compteur seconde +1

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

#3 Message par Guest » sam. 24 sept. 2016 16:35

bonjour

tu fais cela

Code : Tout sélectionner

   
;*********************** Affichage sur 4 digits ********************************
   MOVLW   TEST
AFFI   BSF   PORTC,0         ;allumage digit0


avec un point d'arret sur MOVLW TEST

dans assignation tu rajoutes

Code : Tout sélectionner

Fosc   EQU .20            ;Valeur du quartz en MHz
TEST   EQU .11       


si dans W tu n'as pas 0XB tu vires dans les assignations le point a toutes les valeurs AMHA on n'as pas le meme complilateur precompli

A+

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

#4 Message par Guest » sam. 24 sept. 2016 16:43

il te manque cela

la petite tempo

Code : Tout sélectionner

;*******************************************************************
;
;********************************************************************
;
;   Auteur   :maï/JMarc
;   Version   :1.0
;   Date   :09/2016   
;
;********************************************************************
;            Note:PIC 16F876A_04            
;********************************************************************
   ERRORLEVEL-302

   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 ***************
 
;*********************** Assignations *******************************

DRAM   EQU 0x20         ;début Mémoire Ram banque0
FRAM    EQU 0X7F         ;fin Mémoire Ram banque0
Fosc   EQU .20            ;Valeur du quartz en MHz      
;********************** calcul pour une boucle de temporisation ****************
; a 2 niveaux sur un 16F boucle secondaire en 756 cycles
;*******************************************************************************   
TEMPS1   EQU .10000000         ;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

;*********************** Définitions variables en RAM PAGE0 *********
   CBLOCK   0x20
   Sauv,Sauv1
   Temp            ;compteur temps
   
   ComptSu            ;comteur seconde
   ComptSd
   ComptMu            ;compteur minute
   ComptMd
   
   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
         
;********************************************************************

   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
   CLRF   TRISB         ;Broches RB0:RB7 en sortie
   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
   
;*********************** Affichage sur 4 digits ********************************
AFFI   BSF   PORTC,0         ;allumage digit0
   MOVFW   ComptSu         ;charge la donnée
   CALL   LedTable      ;recherche donnée
   MOVWF   PORTB         ;envoi donnée
   CALL   Tem2ms         ;petite tempo 2ms   
   BCF   PORTC,0         ;arrêt digit0
   
   BSF   PORTC,1
   MOVFW   ComptSd
   CALL   LedTable
   MOVWF   PORTB
   CALL   Tem2ms         ;idem digit1
   BCF   PORTC,1
   
   BSF   PORTC,2
   MOVFW   ComptMu
   CALL   LedTable
   MOVWF   PORTB
   CALL   Tem2ms         ;idem digit2         
   BCF   PORTC,2
   
   BSF   PORTC,3
   MOVFW   ComptMd
   CALL   LedTable
   MOVWF   PORTB         ;idem digit3
   CALL   Tem2ms
   BCF   PORTC,3
   
;********************** Boucle principale *************************************   
BouP   MOVLW   0X0A         ;on test si 10fois 100mS
   SUBWF   Temp,W
   BTFSS   STATUS,Z
   GOTO   BouP         ;NON on retourne dans la boucle P
   CLRF      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 *************************   
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
   
    END


Attention!! il faut faire le test pour savoir si ton compli prend bien : .11 ou 11
Modifié en dernier par Anonymous le sam. 24 sept. 2016 17:10, modifié 1 fois.

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

#5 Message par Guest » sam. 24 sept. 2016 16:54

Tu as bien droit a 2 :bravo: un ici l'autre sur le post debug :lol: j’écris le programme avec toi, c'est pas un copie/colle

Pour la RAZ de Temp plutôt ici

Code : Tout sélectionner

;********************** Boucle principale *************************************   
BouP   MOVLW   0X0A         ;on test si 10fois 100mS
   SUBWF   Temp,W
   BTFSS   STATUS,Z
   GOTO   BouP         ;NON on retourne dans la boucle P
   CLRF   Temp         ;RAZ compteur temp
   INCF   ComptSu         ; oui compteur seconde +1



apres le test si c'est a 10 on fait ,RAZ de la variable Temp et on incrémente le compteur seconde

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

#6 Message par JMarc » sam. 24 sept. 2016 17:40

maï a écrit :si dans W tu n'as pas 0XB tu vires dans les assignations le point a toutes les valeurs AMHA on n'as pas le meme complilateur precompli


Ça fonctionne, w= 0xB

Mais même avec ton listing complet, ça ne veut pas fonctionner :mur:

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

#7 Message par Guest » sam. 24 sept. 2016 17:50

bon donc la tempo une seconde fonctionne ?
on va allez par étape

le timer 1 doit être recharge avec du 4MHz de la valeur 0XCF pour le H et 0X2B pour le L
tu as bien les variables TempS et TempM qui progressent?

le problème vient de, tu m'affiches rien ???? sous debug c'est OK ????

ta platine les afficheurs sont bien alimenté par de transistors c'est quoi la platine ?
il faut peut-être changer de port regard le tuto de JEREMY viewtopic.php?f=15&p=4080#p4080

Perso je n’ai pas de platine donc a toi de gérer coté platine .

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

#8 Message par Guest » sam. 24 sept. 2016 18:22

oops j'ai encore fait une boulette ici

Code : Tout sélectionner

TEMPS1   EQU .2000000   


je ne suis amusé avec et fait une tempo de 10ms pour voir la precision de ma tempo et le code est resté comme cela :mur: mille excuses et de 2

ici la tempo de 2ms
Capture1.png


pour une boucle c'est pas mal :wink:

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

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

#9 Message par Guest » sam. 24 sept. 2016 19:00

Tient j'ai poussé sous debug
ici toutes les secondes
Capture1S.png

toutes les 10s
Capture10S.png


ici sous debug ca roule

avec comme port B et port C
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

#10 Message par JMarc » sam. 24 sept. 2016 19:17

moi sous debug la variable des seconde passe a 1 pour le tour d'après elle est a 0
J'ai viré les globales et j'ai déclaré comme tu l'as fait au debut et ca fonctionne sous debug
ma platine, rien de particulier, tout est brocher, tu relis avec des fils volant du port que tu veux aux afficheurs, donc portb pour les segments et portc pour les commandes. mais je devine a peine les chiffres comme si la commande ne resté pas assez longtemps affiché.
Ce soir j'arrête, cerveau en surchauffe.

en tout cas, merci pour ta patience :bravo:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité