Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
compteur décompteur sur 7 segments
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
d'abord voici le code de départ
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
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
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
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
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
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
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 = 0, drapeau z de status =0, alors saut
GOTO BouP ;NON on retourne dans la boucle P
INCF ComptSu ; oui compteur seconde +1
compteur décompteur sur 7 segments
bonjour
tu fais cela
avec un point d'arret sur MOVLW TEST
dans assignation tu rajoutes
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+
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
il te manque cela
la petite tempo
il faut faire le test pour savoir si ton compli prend bien : .11 ou 11
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
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
Tu as bien droit a 2 un ici l'autre sur le post debug j’écris le programme avec toi, c'est pas un copie/colle
Pour la RAZ de Temp plutôt ici
apres le test si c'est a 10 on fait ,RAZ de la variable Temp et on incrémente le compteur seconde
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
compteur décompteur sur 7 segments
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 .
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
j'ai encore fait une boulette ici
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 mille excuses et de 2
ici la tempo de 2ms
pour une boucle c'est pas mal
A+
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 mille excuses et de 2
ici la tempo de 2ms
pour une boucle c'est pas mal
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
compteur décompteur sur 7 segments
compteur décompteur sur 7 segments
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
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
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités