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 ---
On parle des Pics, sans rapport avec le langage ou la programmation

Modérateur : Jérémy

problème d'alimentation d'un afficheur 7 segments
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » mar. 31 juil. 2018 01:36

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 :roll:
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.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

problème d'alimentation d'un afficheur 7 segments
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#2 Message par cyril13110 » mar. 31 juil. 2018 06:44

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.

problème d'alimentation d'un afficheur 7 segments
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#3 Message par Gérard » mar. 31 juil. 2018 08:33

Bonjour,
Peux-tu nous montrer le schéma de ton oeuvre?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

problème d'alimentation d'un afficheur 7 segments
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#4 Message par JJE » mar. 31 juil. 2018 09:59

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
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

problème d'alimentation d'un afficheur 7 segments
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#5 Message par cyril13110 » mar. 31 juil. 2018 10:40

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
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » mar. 31 juil. 2018 10:41

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 !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

problème d'alimentation d'un afficheur 7 segments
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#7 Message par Gérard » mar. 31 juil. 2018 14:43

Je viens de penser à une autre solution pour éviter le multiplexage : des expanseurs de bus en I2C genre MCP 23016 ou 23017.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

problème d'alimentation d'un afficheur 7 segments
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#8 Message par JJE » mar. 31 juil. 2018 17:29

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 :cry:
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
Schéma logique.pdf

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
Image5.jpg
.
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.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

problème d'alimentation d'un afficheur 7 segments
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#9 Message par cyril13110 » mar. 31 juil. 2018 22:49

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.

problème d'alimentation d'un afficheur 7 segments
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#10 Message par JJE » mer. 1 août 2018 08:14

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
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e


Retourner vers « Généralités sur les PICs »

Qui est en ligne

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