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 : Jérémy
problème d'alimentation d'un afficheur 7 segments
Bonjour à chacun, j'achève la mise au point d'un affichage sur 8 7 segments piloté par un 12F675. c'est un peu un défi
Je rencontre un problème de luminosité satisfaisante pour un 1 ou un 7 voire pour un C, beaucoup moins pour les autres chiffres qui nécessitent plus de segments. Il est plus que probable que c'est un problème d'alimentation.
Totalement béotien en électronique, j'ai choisi au hasard de piloter l'anode commune de chaque afficheur par un BC557 sa doc dit qu'il délivre 100mA
et chaque segment consomme 20 mA d'où sûrement le problème.
Un expert de ce forum saura certainement me dire quel transistor pour le remplacer.
Merci d'avance.
Je rencontre un problème de luminosité satisfaisante pour un 1 ou un 7 voire pour un C, beaucoup moins pour les autres chiffres qui nécessitent plus de segments. Il est plus que probable que c'est un problème d'alimentation.
Totalement béotien en électronique, j'ai choisi au hasard de piloter l'anode commune de chaque afficheur par un BC557 sa doc dit qu'il délivre 100mA
et chaque segment consomme 20 mA d'où sûrement le problème.
Un expert de ce forum saura certainement me dire quel transistor pour le remplacer.
Merci d'avance.
problème d'alimentation d'un afficheur 7 segments
-
cyril13110
Confirmé- Messages : 737
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
bonjours jje et bonjour a tous,
cest sur que 100mA pour 8 afficheurs ca fait un poile juste, mais il ny a pas que ca il y a aussi la frequence de multiplexage qui peut expliquer ce phénomène.
si tu veux rester en bipolaire tu peux utiliser un 2N2222A qui peut debiter 1A, ou tu peux toujours prendre un transistor Mosfet.
cest sur que 100mA pour 8 afficheurs ca fait un poile juste, mais il ny a pas que ca il y a aussi la frequence de multiplexage qui peut expliquer ce phénomène.
si tu veux rester en bipolaire tu peux utiliser un 2N2222A qui peut debiter 1A, ou tu peux toujours prendre un transistor Mosfet.
problème d'alimentation d'un afficheur 7 segments
problème d'alimentation d'un afficheur 7 segments
merci de vous intéresser à mon problème,
à cyril13110, le 2N2222A est un NPN et par maladresse, j'ai acheté des 7 segments anode commune qui doivent donc être pilotés par des PNP. Le fréquence de multiplexage retenue est la première qui ne fait pas clignoter (50000microcycles soit environ 50 ms par afficheur), j'ai essayé plus petit (30) mais ça ne change rien, je ne pense pas qu'elle soit en cause car cela n'expliquerait pas la différence de luminosité entre un chiffre 1 et un chiffre 8
à Gérard, j'essaye de trouver le temps de le mettre au propre dans la journée et de le poster
à cyril13110, le 2N2222A est un NPN et par maladresse, j'ai acheté des 7 segments anode commune qui doivent donc être pilotés par des PNP. Le fréquence de multiplexage retenue est la première qui ne fait pas clignoter (50000microcycles soit environ 50 ms par afficheur), j'ai essayé plus petit (30) mais ça ne change rien, je ne pense pas qu'elle soit en cause car cela n'expliquerait pas la différence de luminosité entre un chiffre 1 et un chiffre 8
à Gérard, j'essaye de trouver le temps de le mettre au propre dans la journée et de le poster
problème d'alimentation d'un afficheur 7 segments
-
cyril13110
Confirmé- Messages : 737
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
JJE a écrit :à cyril13110, le 2N2222A est un NPN et par maladresse, j'ai acheté des 7 segments anode commune qui doivent donc être pilotés par des PNP. Le fréquence de multiplexage retenue est la première qui ne fait pas clignoter (50000microcycles soit environ 50 ms par afficheur), j'ai essayé plus petit (30) mais ça ne change rien, je ne pense pas qu'elle soit en cause car cela n'expliquerait pas la différence de luminosité entre un chiffre 1 et un chiffre 8
ha ok je vois, bein le plus simple serait des mosfet.
canal P ou N je serait tenté de dire que l'on sen fou un peut vue qu'une fois commandé en saturation le transistor se comporte comme une resistance......la seul difference sera dans ton code pour le niveau de commande (etat haut ou etat bas).
le seul hic cest que le montage sera différent.
Si non petite idée de bricolage a la mac giver, tu mets 2 transistors en parallèle et tu change les resistances sur les bases pour avoir le double de courant afin d'assurer la saturation des 2 transistors.
un petit schéma serai en effet bien venu.
problème d'alimentation d'un afficheur 7 segments
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ici,
Effectivement si ton transistor à max rating de 100mA , en allumant un "8" tu as donc 7 segments d'allumés soit 140 mA . Ça peut poser probléme.
Il n'y as pas que l'alimentation qui peut être cause de ce petit soucis. La programmation aussi, suivant comment tu traites l'activation d'un afficheur et ensuite l'allumage des segments. Sur le même afficheur actif les segments peuvent être allumés plus ou moins longtemps.
LE code ET le schéma sont nécessaire pour t'aider un peu plus !
Effectivement si ton transistor à max rating de 100mA , en allumant un "8" tu as donc 7 segments d'allumés soit 140 mA . Ça peut poser probléme.
Il n'y as pas que l'alimentation qui peut être cause de ce petit soucis. La programmation aussi, suivant comment tu traites l'activation d'un afficheur et ensuite l'allumage des segments. Sur le même afficheur actif les segments peuvent être allumés plus ou moins longtemps.
LE code ET le schéma sont nécessaire pour t'aider un peu plus !
problème d'alimentation d'un afficheur 7 segments
problème d'alimentation d'un afficheur 7 segments
merci de toutes ces idées,
j'espérais qu'il existait un équivalent PNP du 2N2222A comme le BC 547 est l'équivalent NPN du BC557, il ne semble pas que ce soit le cas puisque personne ne m'en parle.
Pour Gérard, pour moi, c'est un challenge, mon petit 12F975 n'a ni de fonctionnalité I2C ni de fonctionnalité SPI
Pour Cyril13110, je veux bien tenter des mofset, mais je ne m'en suis jamais servi, tu as un modèle à suggérer ?
à la demande générale, je joins un schéma logique de mon circuit
quelques mots sur le principe de fonctionnement :
Le pic envoie, strobe bas, aux deux HC4094 en cascade, deux octets, le premier qui ne contient que des 1 sauf un bit à 0 sera écrit dans le 4094 numéroté 1 et servira à sélectionner l'afficheur à activer ; le deuxième contient la description des segments à activer (bits à 0) et sera écrit dans le 4094 noté 2
Cette opération est relancée toutes les 50 ms en faisant tourner le TDS actif et en adaptant la valeur à afficher.
Ci-dessous le programme qui fonctionne bien, seul ce problème de luminosité me chagrine.
une petite photo, très médiocre de la platine d'essais .
le petit bout de circuit en bas à gauche supporte les résistances ce charge des cathodes des TDS pour gagner de la place sur la platine d'essais.
Il manque quelques fils car j'ai essayé d'attaquer les anodes des TDS directement depuis le 4094-1 (en changeant un peu le code. C'est encore moins lumineux. Je me demande si les 660 ohm des résistances de charge des cathodes ne sont pas un peu beaucoup.
j'espérais qu'il existait un équivalent PNP du 2N2222A comme le BC 547 est l'équivalent NPN du BC557, il ne semble pas que ce soit le cas puisque personne ne m'en parle.
Pour Gérard, pour moi, c'est un challenge, mon petit 12F975 n'a ni de fonctionnalité I2C ni de fonctionnalité SPI
Pour Cyril13110, je veux bien tenter des mofset, mais je ne m'en suis jamais servi, tu as un modèle à suggérer ?
à la demande générale, je joins un schéma logique de mon circuit
quelques mots sur le principe de fonctionnement :
Le pic envoie, strobe bas, aux deux HC4094 en cascade, deux octets, le premier qui ne contient que des 1 sauf un bit à 0 sera écrit dans le 4094 numéroté 1 et servira à sélectionner l'afficheur à activer ; le deuxième contient la description des segments à activer (bits à 0) et sera écrit dans le 4094 noté 2
Cette opération est relancée toutes les 50 ms en faisant tourner le TDS actif et en adaptant la valeur à afficher.
Ci-dessous le programme qui fonctionne bien, seul ce problème de luminosité me chagrine.
Code : Tout sélectionner
;**********************************************************************
; PROGRAMME de test du multiplexage de 8 7 segments
; *
;**********************************************************************
; *
; NOM: Test Multiplex *
; Date: 30/07/2018 *
; Version: 1.0 *
; Circuit: Platine d'essais *
; Auteur: JJE *
; *
;**********************************************************************
; *
; Fichier requis: p12F675.inc *
; *
;**********************************************************************
; *
; Notes: Ce programme exploite un tampon de 8 octets contenant des
; entiers successifs initialisés de 0 à 7
; Il commence par un affichage de 8 sur les 8 TDS puis,
; tous les 50.000 microcycles, il affiche le nième octet
; de ce tampon dans le nième TDS
; toutes les 5.000.000 microcycles (5"), il incrémente tous les
; octets du tampon modulo 16
; *
;**********************************************************************
;**********************************************************************
; variables d'assemblage conditionel
;; retenir une et une seule des 2 lignes suivantes
;; associer le bon processeur dans Configure/Select device
#define TDSO316 ; si assemblé pour 12F675 qui gère les TDSO316
;; #define AV0820 ; si assemblé pour 16F88 qui gère les TDSO316 en
; ; ; attendant de gérer l'écran AV 0820
; vérification
#ifdef TDSO316
#ifdef AV0820
error "ne définir qu''une seule variable TDSO316 ou AV0820"
#endif
#endif
#ifndef TDSO316
#ifndef AV0820
error "définir l'une des variables TDSO316 ou AV0820"
#endif
#endif
; retenir une et une seule des 2 lignes suivantes
#define ANODECOMMUNE
; #define CATHODECOMMUNE
; vérification
#ifdef ANODECOMMUNE
#ifdef CATHODECOMMUNE
error "ne définir qu''une seule variable ANODECOMMUNE ou CATHODECOMMUNE"
#endif
#endif
#ifndef ANODECOMMUNE
#ifndef CATHODECOMMUNE
error "définir l'une des variables ANODECOMMUNE ou CATHODECOMMUNE"
#endif
#endif
;**********************************************************************
ifdef TDSO316
messg "Assemblé pour Pic 12F675 et 7 segments TDS 0316"
LIST p=PIC12F675 ; Définition du processeur
#INCLUDE <p12F675.inc> ; Définitions des constantes
else
error "non développé"
endif
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
;*********************************************************************
; DEFINE *
;*********************************************************************
; donnons un nom logique aux ports utilisés
; les n° des pattes corespondant au 12F675
#DEFINE IO_Strobe GPIO, 0 ; (patte 7)GP0
#DEFINE IO_Data GPIO, 1 ; (patte 6) GP1
#DEFINE IO_Clock GPIO, 2 ; (patte 5 ) GP2
; #DEFINE BOUTON_POUSSOIR GPIO, 3 ; (patte 4) GP3 entrée du bouton-poussoir
; #DEFINE CHOIX_BASE GPIO, 4 ; (patte 3) GP4 sélection mode d'affichage
; #DEFINE IO_Com GPIO, 5 ; (patte 2) GP5 port de communication
; brochage sur la platine d'essai
#DEFINE segmenta 0x08 ; 0x1
#DEFINE segmentb 0x01 ; 0x2
#DEFINE segmentc 0x80 ; 0x4
#DEFINE segmentd 0x04 ; 0x80
#DEFINE segmente 0x02 ; 0x40
#DEFINE segmentf 0x40 ; 0x20
#DEFINE segmentg 0x20 ; 0x10
#DEFINE segmentDP 0x10 ; 0x8
;*********************************************************************
; commandes des 7 segments
ifdef ANODECOMMUNE
chiffre0 EQU (segmenta + segmentb + segmentc + segmentd + segmente + segmentf)^0xff
chiffre1 EQU (segmentb + segmentc)^0xff
chiffre2 EQU (segmenta + segmentb + segmentd + segmente + segmentg)^0xff
chiffre3 EQU (segmenta + segmentb + segmentc + segmentd + segmentg)^0xff
chiffre4 EQU (segmentb + segmentc + segmentf + segmentg)^0xff
chiffre5 EQU (segmenta + segmentc + segmentd + segmentf + segmentg)^0xff
chiffre6 EQU (segmenta + segmentc + segmentd + segmente + segmentf + segmentg)^0xff
chiffre7 EQU (segmenta + segmentb + segmentc)^0xff
chiffre8 EQU (segmenta + segmentb + segmentc + segmentd + segmente + segmentf + segmentg)^0xff
chiffre9 EQU (segmenta + segmentb + segmentc + segmentf + segmentg)^0xff
chiffreA EQU (segmenta + segmentb + segmentc + segmente + segmentf + segmentg)^0xff
chiffreB EQU (segmentc + segmentd + segmente + segmentf + segmentg)^0xff
chiffreC EQU (segmenta + segmentd + segmente + segmentf)^0xff
chiffreD EQU (segmentb + segmentc + segmentd + segmente + segmentg)^0xff
chiffreE EQU (segmenta + segmentd + segmente + segmentf + segmentg)^0xff
chiffreF EQU (segmenta + segmente + segmentf + segmentg)^0xff
chiffreVide EQU (0x00)^0xff
point EQU segmentDP^0xff
else
chiffre0 EQU segmenta + segmentb + segmentc + segmentd + segmente + segmentf
chiffre1 EQU segmentb + segmentc
chiffre2 EQU segmenta + segmentb + segmentd + segmente + segmentg
chiffre3 EQU segmenta + segmentb + segmentc + segmentd + segmentg
chiffre4 EQU segmentb + segmentc + segmentf + segmentg
chiffre5 EQU segmenta + segmentc + segmentd + segmentf + segmentg
chiffre6 EQU segmenta + segmentc + segmentd + segmente + segmentf + segmentg
chiffre7 EQU segmenta + segmentb + segmentc
chiffre8 EQU segmenta + segmentb + segmentc + segmentd + segmente + segmentf + segmentg
chiffre9 EQU segmenta + segmentb + segmentc + segmentf + segmentg
chiffreA EQU segmenta + segmentb + segmentc + segmente + segmentf + segmentg
chiffreB EQU segmentc + segmentd + segmente + segmentf + segmentg
chiffreC EQU segmenta + segmentd + segmente + segmentf
chiffreD EQU segmentb + segmentc + segmentd + segmente + segmentg
chiffreE EQU segmenta + segmentd + segmente + segmentf + segmentg
chiffreF EQU segmenta + segmente + segmentf + segmentg
chiffreVide EQU 0x00
point EQU segmentDP
endif
;************************************************************************
; valeurs initiales des registres spéciaux
OPTIONVAL EQU B'10000001' ; bit 7 = 1 : GPIO pull-ups disabled
; bit 6 = 0 : sans objet
; bit 5 = 0 : internal cycle clock
; bit 4 = 0 : sans objet
; bit 3 = 0 : prescaler is assiogned to
; TIMER0 module
; bit 2-0 = 001 : prescaler rate 1:4
; cf page 14 du DataSheet
TRISIOVAL EQU B'00001000' ; toutes les pins en sortie sauf GPIO,3
; cf page 22 du DataSheet
;ANSELVAL EQU B'00001000' ; ADCS<2:0> = 000 sans objet
; ; ANS3: ANS0 = 1000 GPIO3 = AN3
; cf page 46 du DataSheet
INTCONVAL EQU H'C0' ; bit 7 = 1 : Enables unmasked interrupts
; bit 6 = 1 : Enaables all peripheral interrupts
; bit 5 = 0 : disables TMR0 interrupt
; bit 4 = 0 : disables GPIO port change interrupt
; bit 3-0 = 0 sans objet
; cf page 15 du DataSheet
; ADCON0VAL EQU b'00000000' ; b7 = 0, résultat justifié à gauche
; b6 = 0, référence VDD
; b5-4, non implémentés
; b3-2 = 11, an3 utilisé
; b1= 0, pas de conversion en cours
; b0 = 1; convertisseur A/D en service
; voir page 43 du datasheet
;*********************************************************************
; quelques constantes
TIMER0VAL EQU .9 ; valeur initial de TIMER0 pour obtenir
; une IT toutes les 1ms avec un
; prescaler à 4 et une fréquence de 4MH
Nb_ITVAL EQU .5 ; pour simuler unr IT toutes les 5.000 microcycles
cmpt100VAL EQU .200 ; pour simuler une IT toutes les 1.000ms
;dojob1 EQU .4 ; pour simuler unr IT toutes les 40 microcycles
dojob1VAL EQU .1
;dojob2 EQU .4 ; pour simuler unr IT toutes les 1.000.000 microcycles
dojob2VAL EQU .5
;*********************************************************************
; MACRO *
;*********************************************************************
; inutile de se préoccuper de STATUS, RP1
BANK1 macro
bsf STATUS,RP0
endm
BANK0 macro
bcf STATUS,RP0
endm
;*********************************************************************
; Variables *
;*********************************************************************
CBLOCK 0x020 ; Début de la zone des variables
; sauvegardes pour l'IT
w_temp : 1 ; W
status_temp : 1 ; STATUS
; variables du ssp de sortie SetRegWithW
CmptBits ; compe les bits sortis
HC4094Temp ; rangement temporaire de la valeur à écrire
;variables gérées par l'IT timer0
Nb_IT : 1
cmpt100 : 1
dojob1 : 1 ; compteur utile à déclencher job1
dojob2 : 1 ; compteur utile à déclencher job2
CmptJob2 : 1 ; compteur pour la boucle de job2
Tampon : 8 ; les 8 octets affichés
NuChiffre : 1 ; chiffre à afficher
NuAfficheur : 1 ; numéro de l'afficheur exploité
ENDC ; Fin de la zone
errorlevel -302
;**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************
org 0x000 ; Adresse de départ après reset
goto init ; Adresse 0: initialiser
;**********************************************************************
; ROUTINE INTERRUPTION *
;**********************************************************************
;sauvegarder registres
;---------------------
ORG 0x004 ; adresse d'interruption
; interruption reçue toutes les 1ms
movwf w_temp ; 1 sauver registre W
swapf STATUS,w ; 2 swap status avec résultat dans w
movwf status_temp ; 3 sauver status swappé
BANK0
btfsc INTCON,T0IE ; 4/5 tester si interrupt timer autorisée
btfss INTCON,T0IF ; 5/6 oui, tester si interrupt timer en cours
goto int2 ; 7 non, c'est une autre interrupt
bcf INTCON,T0IF ; 7 effacer flag interrupt timer
movlw TIMER0VAL ; 8
movwf TMR0 ; 9
nop ;10
; à ce moment, TIMER0 va compter 988 [(256-9)*4] micro-cycles et reviendra au début de
; ce sous-programme de gestion des IT ce qui compte tenu des instructions
; qui précèdent et des deux non décomptées après l'initialisation de TMR0
; ammène bien à 1000 micro-cycles, soit 1000 microsecondes
goto inttimer ; traiter interrupt timer
int2 ; traitement éventuel des autres interruptions
nop
restorereg
swapf status_temp,w ; 2 swap ancien status, résultat dans w
movwf STATUS ; 3 restaurer status
swapf w_temp,f ; 4 Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; 5 Réinversion de L et H dans W
; W restauré sans modifier status
retfie ; 7 return from interrupt
;**********************************************************************
; INTERRUPTION TIMER 0
;**********************************************************************
; Cette routine est appelée toutes les 1.000 microcycles (1ms)
inttimer
decfsz Nb_IT, f
goto inttimer1
; ici, on passe toutes les Nb_ITVAL (5)ms
; on réinitialise le compteur d'IT
movlw Nb_ITVAL
movwf Nb_IT
; on décrémente les compteur de passages
; déclenchera le travail dans la boucle principale
; en s'annulant
decf dojob1,f
decfsz cmpt100,f
goto inttimer1
; ici on passe toutes les 1.000.000microcycles (1s)(cmpt100VAL*Nb_ITVAL)
; on réinitialise le compteur de passages
movlw cmpt100VAL
movwf cmpt100
; on décrémente les compteur de passages
; déclenchera le travail dans la boucle principale
; en s'annulant
decf dojob2,f
inttimer1
goto restorereg
;
;*********************************************************************
; TABLES DE CONVERSION *
;*********************************************************************
; convertit la valeur présente dans W <0:16> en la valeur à envoyer
; au HC4094 pour un affichage de ce chiffre sur le TDS0316
convertir
addwf PCL,f
retlw chiffre0
retlw chiffre1
retlw chiffre2
retlw chiffre3
retlw chiffre4
retlw chiffre5
retlw chiffre6
retlw chiffre7
retlw chiffre8
retlw chiffre9
retlw chiffreA
retlw chiffreB
retlw chiffreC
retlw chiffreD
retlw chiffreE
retlw chiffreF
retlw chiffreVide
;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
; Initialisations
; ---------------
init
clrf GPIO ; Sorties à 0
BANK1 ; sélectionner banque 1
; initialiser les registres spéciaux
; -----------------------------------
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
movlw TRISIOVAL
movwf TRISIO
; WPU n'existe que sur le 12F675
; on lui a donné une définition virtuelle pour que le code soit indépendant
; de la définition de TDSO316
errorlevel -219
bsf WPU, WPU4
errorlevel +219
; movlw ANSELVAL
; movwf ANSEL ; initialise ANSEL
BANK0
movlw INTCONVAL
movwf INTCON ; initialise INTCON
; movlw ADCON0VAL
; movwf ADCON0 ; initialise ADCON0
; Effacer RAM banque 0
; --------------------
; on se contente d'effacer les @ de 0x20 à 0x5f
; largement plus que ce dont on se sert
movlw 0x020 ; initialisation pointeur
movwf FSR ; pointeur d'adressage indirec
init1
clrf INDF ; effacer ram
incf FSR,f ; pointer sur suivant
btfss FSR,6 ; tester si fin zone atteinte (>=40)
goto init1 ; non, boucler
btfss FSR,5 ; tester si fin zone atteinte (>=60)
goto init1 ; non, boucler
; initialise les compteurs utiles à l'IT Timer0
movlw Nb_ITVAL
movwf Nb_IT
movlw dojob1VAL
movwf dojob1
movlw dojob2VAL
movwf dojob2
; initialise le tampon pour la phase de test d'affichage
SetTamponTest
movlw Tampon
movwf FSR
movlw .8
movwf NuChiffre
SetTamponTest_1
movwf INDF
incf FSR,f
decf NuChiffre, f
btfss STATUS, Z
goto SetTamponTest_1
; on commence par l'affichage de l'octet 0 du tampon
; sur l'afficheur 0
movlw 0xfe
movwf NuAfficheur
movwf NuChiffre
movlw TIMER0VAL
movwf TMR0
bsf INTCON,T0IE ; autoriser l'IT Timer0
; affiche le tampon pendant environ 5"
Bcl0
movf dojob1,f
btfsc STATUS,Z
call job1
movf dojob2,f
btfss STATUS,Z
goto Bcl0
movlw dojob2VAL
movwf dojob2
; initialise le tampon défini pour l'application
; "01234567"
SetTampon
movlw Tampon
movwf FSR
clrf NuChiffre
SetTampon_1
movf NuChiffre, w
movwf INDF
incf FSR,f
incf NuChiffre, f
btfss NuChiffre, 4
goto SetTampon_1
; on commence par l'affichage de l'octet 0 du tampon
; sur l'afficheur 0
movlw 0xfe
movwf NuAfficheur
clrf NuChiffre
;*********************************************************************
; Boucle principale
; -----------------
;*********************************************************************
Bcl
movf dojob1,f
btfsc STATUS,Z
call job1
movf dojob2,f
btfsc STATUS,Z
call job2
goto Bcl
; active l'afficheur NuAfficheur
; et lui fait afficher l'octet NuChiffre du tampon
; transfère les bonnes valeurs dans les HC4094
; NuAfficheur et NuChiffre sont mis à jour
; en vue du prochain affichage
; consomme environ 460 microcycles
job1
movlw dojob1VAL
movwf dojob1
bcf IO_Strobe
movf NuAfficheur, w
call SetRegWithW
bsf STATUS,C
rlf NuAfficheur, f
btfss STATUS, C
rlf NuAfficheur, f
movlw Tampon
addwf NuChiffre,w
movwf FSR
movf INDF,w
call convertir
call SetRegWithW
bsf IO_Strobe
incf NuChiffre,w
andlw 0x07
movwf NuChiffre
return
; modifie le tampon en incrémentant modulo 16
; tous ses octets
; consomme environ 73 micro-cycles
job2
movlw dojob2VAL
movwf dojob2
movlw .8
movwf CmptJob2
movlw Tampon
movwf FSR
job2_1
incf INDF, f
movf INDF, w
sublw 0x11
btfsc STATUS, Z
clrf INDF
incf FSR, f
decfsz CmptJob2, f
goto job2_1
return
;*********************************************************************
; SOUS_PROGRAMMES
;*********************************************************************
; transfère le contenu de W dans le HC4094
; entrée :
; W valeur à transférer
; sortie :
; le registre est chargé mais le Strobe n'a pas été fait
; pour permettre d'utiliser ce sous-propgramme
; pour charger plusieurs registres chaînés.
; W n'est pas modifié
; variables locales
; HC4094Temp
; CmptBits
; durée
; 220 cycles en comptant l'appel et le retour
SetRegWithW
movwf HC4094Temp ; 2
clrf CmptBits ; 3
SetRegWithW_1
bsf IO_Data ; 7 + 24*nb bits sortis
rlf HC4094Temp, F ; 4 + 24*nb bits sortis
btfss STATUS, C ; 5 + 24*nb bits sortis
bcf IO_Data ; 8 + 24*nb bits sortis
; goto SetRegWithW_2 ; 6 + 24*nb bits sortis
; goto SetRegWithW_3 ; 8 + 24*nb bits sortis
;SetRegWithW_2
; nop ; 9 + 24*nb bits sortis pour équilibrer les deux cas
;SetRegWithW_3
call tempo0 ; 10 + 24*nb bits sortis
bsf IO_Clock ; 14 + 24*nb bits sortis
call tempo0 ; 15 + 24*nb bits sortis
bcf IO_Clock ; 19 + 24*nb bits sortis
call tempo0 ; 20 + 24*nb bits sortis
incf CmptBits, F ; 24 + 24*nb bits sortis
btfss CmptBits,3 ; 25 + 24*nb bits sortis
goto SetRegWithW_1 ; 26 + 24*nb bits sortis
return ; 218
;*********************************************************************
; ROUTINES DE TEMPORISATION *
;*********************************************************************
; Cette routine introduit un retard de 4us
tempo0
nop
return
end
une petite photo, très médiocre de la platine d'essais .
le petit bout de circuit en bas à gauche supporte les résistances ce charge des cathodes des TDS pour gagner de la place sur la platine d'essais.
Il manque quelques fils car j'ai essayé d'attaquer les anodes des TDS directement depuis le 4094-1 (en changeant un peu le code. C'est encore moins lumineux. Je me demande si les 660 ohm des résistances de charge des cathodes ne sont pas un peu beaucoup.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
problème d'alimentation d'un afficheur 7 segments
-
cyril13110
Confirmé- Messages : 737
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
si non tu a aussi la solution des registres a decalage du type 74HC595 en series, 1 par afficheur du coup tu supprime le multiplexage.
pour les references des mos je retrouve et je te dit.
je viens de trouver, jutilise des FQP60N06L. Pour faire une commande en saturation tu mets la gate directement a la sortie du pic avec une resistance de tirages vers le bas pour éviter les etats indesirables, perso je mets toujours du 10Kohm.
vue les puissances il nest pas pres de chauffer.
il doit exister sûrement des references plus compactes.
Le plus important est l'indice L pour commande sur etat logique de faible tension, en gros le mos peut se commander a pargir de 3V.
pour les references des mos je retrouve et je te dit.
je viens de trouver, jutilise des FQP60N06L. Pour faire une commande en saturation tu mets la gate directement a la sortie du pic avec une resistance de tirages vers le bas pour éviter les etats indesirables, perso je mets toujours du 10Kohm.
vue les puissances il nest pas pres de chauffer.
il doit exister sûrement des references plus compactes.
Le plus important est l'indice L pour commande sur etat logique de faible tension, en gros le mos peut se commander a pargir de 3V.
problème d'alimentation d'un afficheur 7 segments
merci pour ces infos cyril13110,j'ai déjà fait une verson de ce circuit avec 6 HC4094 qui me donnait satisfaction. Je voulais exploiter le multiplexage par curiosité et parcequ'on gagnait avec un circuit plus simple.
Je vais regarder ces mofset, j'ai un point d'entrée
Je vais regarder ces mofset, j'ai un point d'entrée
Retourner vers « Généralités sur les PICs »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités