- 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
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
Je ne suis pas un familier de l'assembleur mais je m'y lance accompagné de la doc de Bigonoff.
Le cas concret est un récepteur DMX512 dont le canal de consigne ne serai pas géré par des roues codeuses. L'idée de de mettre sur un 16f877 3 boutons poussoirs (Down, Valid, Up) accompagné d'un affichage à MAX7219.
J'ai trouvé une routine qui me semble assez complète pour le max : http://www.hagi-online.org/picmicro/max7219.html.
Je commence à dessiner le schéma sous Proteus pour la simulation.
Je devrai déjà arriver à gérer seul la commande et la gestion de l'affichage.
J'ai déjà rencontré ce soucis par ailleurs et le problème va revenir dans ce projet, je vais devoir supprimer les "0" pour les centaines et dizaines lorsque cela sera nécessaire.
Dans l'eeprom du pic va être stocké la valeur du canal sur lequel va commencer le décodage sous 2 espaces :
DE H'00' ;OP3H
DE H'00' ;OP3L
Quel est le cheminement à utiliser pour supprimer les premiers "0" (les rendre non visibles par un blanck)
A+
François
Je viens de regarder le datasheet du Max7219
Dans l'exemple décrit par ton lien, l'auteur utilise le mode SPI bit bang, 16 bits sont envoyés pour pilotage du MAX7219, donc voici
Au moment de l'envoie CS doit être mit à l'état bas, une fois l'envoie fini CS doit être remit à l'état haut.
Pour revenir à ta question, veux tu supprimer les zéros dans ton programme, ou sur l'afficheur ?
Pour supprimer l'affichage d'un digit, il faut activer le code B sur tous les digits et envoyer sur le bit D0 à D3 = "1111"
Remarque : on n'est pas obligé d'activer le code B, mais ça nous facilite la vie.
Maintenant si c'est pour supprimer les zéros dans ton programme, c'est pas compliqué, je vais attendre ta réponse pour la suite.
A+
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
Je souhaite que l'afficheur soit complétement éteint pour les 0 qui se situent avant le canal à afficher mais ceux faisant partie de nombre s'affichent comme pour "108" par exemple.
En fait, c'est un mix de ta solution, il faudrai que le programme détecte les 0 précédant le canal réel et les remplace donc par un code B (segements de l'afficheur concerné éteint).
Et que cette détection ne fonctionne pas quant le 0 est intercalé entre deux chiffres (108) ou en fin (100).
Cela est-il plus clair ?
Merci
François
Ouais, si j'ai bien compris, quand tu veux afficher 00108 tu voudrais supprimer les zéros qui sont à gauche tu voudrais les voir afficher comme cela 108
J'ai créé une fonction pour supprimé tout les zéros qui sont à gauches, si c'est ça, je peux mettre le code ici, on t’expliquant son fonctionnement.
Code : Tout sélectionner
CBLOCK H'20'
loop6 :1
unite :1
dizaine :1
centaine :1
millier :1
dix_millier :1
cent_millier :1
million :1
dix_million :1
cent_million :1
ENDC
call affiche_donner
do_loop
nop
goto do_loop
;***********************************************************************************************
affiche_donner
; "suprime les zéros qui sont à gauches"
movlw D'9' ; 9 variables à traiter
movwf loop6
movlw cent_million
movwf FSR0L
supprimer_zero
movf INDF0,W
xorlw D'48'
btfss STATUS,Z
goto imprime_lcd
decf FSR0L,F
decfsz loop6,F
goto supprimer_zero
movlw '0'
movwf lettre
call ecrit_lcd
return
; "écrit les données sur le lcd"
imprime_lcd
movf INDF0,W
movwf lettre
call ecrit_lcd
decf FSR0L,F
decfsz loop6,F
goto imprime_lcd
return
;***********************************************************************************************
Dans cette exemple je me sert d'un LCD, c'est la même chose pour ton cas, suffit d'éteindre les afficheurs qui doivent afficher Zéro.
ou de faire un décalage à droite pour les faire passer d'une variable à une autre.
A+
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
oui c'est bien cela. Tu es en avance sur moi par contre. J'ai encore la gestion des BP (boutons poussoirs) à écrire.
Ca fait quelques temps que ce projet me titille car dans mon département, chaque été, un son et lumière, sur gradin mobile (unique en Europe) est créé. https://www.la-cassine.com/
L'asso qui gère utilise du vieux matériel (acquis en 84) et il tombe souvent en panne maintenant.
Ils utilisent des récépteurs DMX512 à 24 canaux 0-10V pour piloter des gradateurs. Ces récepteurs posent soucis souvent. L'idée est d'en créer qui rendra l'asso autonome.
J'essaye d'écrire en assembleur pour que l'UL traite vie les infos. Je décoderai les valeurs DMX et convertirai en tension avec des MAX528.
Je ferai aussi une version à relais car ils ont besoin dans certains spectacles de créer une ambiance brouillard avec des machines à fumée.
Voila l'idée du projet et le pourquoi.
François
folkeu08 a écrit :Source du message J'ai encore la gestion des BP (boutons poussoirs) à écrire.
Pour les boutons poussoir
Code : Tout sélectionner
;
; Utilisation du PORTB pour économiser les résistances
;
;**************** exemple pour 8 boutons poussoir qui son relié sur le PORTB *******************
#DEFINE bout1 PORTB,0 ; RB0
#DEFINE bout2 PORTB,1 ; RB1
#DEFINE bout3 PORTB,2 ; RB2
#DEFINE bout4 PORTB,3 ; RB3
#DEFINE bout5 PORTB,4 ; RB4
#DEFINE bout6 PORTB,5 ; RB5
#DEFINE bout7 PORTB,6 ; RB6
#DEFINE bout8 PORTB,7 ; RB7
;****************************** déclaration des variables *************************************
CBLOCK H'20'
loop1 :1
loop2 :1
loop3 :1
loop4 :1
loop5 :1
loop6 :1
unite :1
dizaine :1
centaine :1
millier :1
dix_millier :1
cent_millier :1
million :1
dix_million :1
cent_million :1
ENDC
ORG H'0'
goto debut
ORG H'4'
retfie
debut
;***********************************************************************************************
BANKSEL OPTION_REG ; passe en bank 1
;************************ configuration du registre OPTION_REG en bank 1 ***********************
movlw B'00000000' ; résistanse en service sur tous le PORTB
movwf OPTION_REG ;
;************************** configuration du registre TRISB en bank 1 **************************
movlw B'11111111' ; configurer tous le PORTB en entrée
movwf TRISB
;***********************************************************************************************
BANKSEL PORTB ; passer en bank 0
;***********************************************************************************************
bt1
btfsc bout1
goto bt2
btfss bout1
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt2
btfsc bout2
goto bt3
btfss bout2
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt3
btfsc bout3
goto bt4
btfss bout3
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt4
btfsc bout4
goto bt5
btfss bout4
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt5
btfsc bout5
goto bt6
btfss bout5
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt6
btfsc bout6
goto bt7
btfss bout6
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt7
btfsc bout7
goto bt8
btfss bout7
goto $-D'1'
call mico_pause
; traitement
return
;***********************************************************************************************
bt8
btfsc bout8
return
btfss bout8
goto $-D'1'
call mico_pause
; traitement
return
;********************* "pause de 100 microsecondes pour horloge de 4 Mhz" ***********************
mico_pause
movlw D'33'
movwf loop1
decfsz loop1,F
goto $-D'1'
return
;***********************************************************************************************
A+
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
Temps-x a écrit :Source du message J'ai créé une fonction pour supprimé tout les zéros qui sont à gauches, si c'est ça, je peux mettre le code ici, on t’expliquant son fonctionnement.
Peux-tu expliquer ta fonction car il y a des sytèmes d'écriture dont je n'ai pas l'habitude comme les :1 dans les déclarations.
Comment introduire mes valeurs OP3H et OP3L dans ta routine.
Mon pic est un 16F877
Merci
François
folkeu08 a écrit :Source du message comme les :1 dans les déclarations.
C'est une déclaration de 1 octet = 8 bits
Exemple
Code : Tout sélectionner
temps :1
Pour une déclaration de 2 octets = 16 bits
Exemple
Code : Tout sélectionner
temps :2
Pour une déclaration de 3 octets = 24 bits
Exemple
Code : Tout sélectionner
temps :3
Pour une déclaration de 4 octets = 32 bits
Exemple
Code : Tout sélectionner
temps :4
Si je veux écrire 54 dans une variable de 4 octets
Code : Tout sélectionner
temps :4 ; déclaration d'une variable de 4 octets
clrf temps+0 ; efface l'octet 1
clrf temps+1 ; efface l’octets 2
clrf temps+2 ; efface l’octets 3
clrf temps+3 ; efface l’octets 4
movlw D'54'
movwf temps+0
Si je veux écrire 540 dans une variable de 4 octets
Code : Tout sélectionner
temps :4 ; déclaration d'une variable de 4 octets
clrf temps+0 ; efface l'octet 1
clrf temps+1 ; efface l’octets 2
clrf temps+2 ; efface l’octets 3
clrf temps+3 ; efface l’octets 4
movlw D'12'
movwf temps+0
movlw D'33'
movwf temps+1
Si u comprends toujours pas, une grande révision s'impose, et je commencerais par le début, et je crois que c'est le cas
folkeu08 a écrit :Source du message Comment introduire mes valeurs OP3H et OP3L dans ta routine.
ouh là là..., tu es pas sortie de l'auberge .... il faut convertir tes valeurs pour les envoyer sur ton MAX7219
OP3H et OP3L représente 2 variables, qui à eux 2 fonts 16 bits, comptage jusqu’à 65535 décimal ou FFFF hexadécimal ou 1111111111111111 binaire.
Le gros problème c'est qu'un microcontrôleur compte en binaire, et qu'il faut convertir le binaire en décimal, et pour cela il faut 6 variables pour 16 bits
Code : Tout sélectionner
unite :1
dizaine :1
centaine :1
millier :1
dix_millier :1
cent_millier :1
Mais comme ton afficheur à 8 chiffres il faudra 9 variables pour 24 bits
Code : Tout sélectionner
unite :1
dizaine :1
centaine :1
millier :1
dix_millier :1
cent_millier :1
million :1
dix_million :1
cent_million :1
Ne t’inquiète pas, j'ai fait une fonction qui fait le travaille, ce que j'aimerais c'est que tu comprennes le fonctionnement, et tu vas voir que c'est pas compliqué.
Comme il est tard, et que je tiens plus debout, je reprendrais demain.
A+
Pour les boutons poussoir regarde aussi http://www.fantaspic.fr/viewtopic.php?f=11&t=444
Tu peux même avoir plusieurs fonctions avec le même bouton suivant la durée d’appui
Bonjour JMarc, Content de te revoir sur le forum, pour nous apporter tes précieux conseille.
Avant d'aller plus loin
J'attends d'avoir des nouvelles de folkeu08, de plus je voudrais savoir si il a commencé à écrire quelque chose. ....
A voir l'excellent code de ducran lapoigne ICI
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 87 invités