08M et 7 segments via CD4026B

TheMoustic

New Member
Bonjour,

J'ai 2 afficheurs LED 7 segments pilotés par 2 CD4026BE câblés selon la page 22 du manuel Interfacing circuits. Le Picaxe utilisé est un 08M programmé via le script donné par cette même doc page 21 (sauf que j'aie pris b1 = 1, car ça permet de mieux voir mon problème - je mettrai une photo dès que possible).

Le problème c'est qu'à chaque réinitialisation des CD4026 par la commande "pulsout 1,10", on voit les 6 segments formant le chiffre 0 clignoter brièvement. Donc si je retire la ligne "pause 1000", on voit toujours le chiffre 0 d'affiché, avec en plus les deux segments de droite formant le chiffre 1 qui sont eux plus lumineux que les 4 autres.

Bien évidemment, ce n'est pas normal.. (nan ? :s) Quelqu'un a-t-il déjà utilisé ces composants ?

Merci :)
 

Chavaquiah

Senior Member
Mais si, c'est normal. ;)

Sans la "pause 1000" le programme fait apparaitre, en succession rapide, les chiffres 0 et 1. Les ségments de la droite sont communs pour les deux, alors ils restent allumés tour le temps.

Si vous ne voulez pas voir les chiffres clignoter avant d'atteindre le nombre final, il est possible d'utiliser l'entrée "DISPLAY ENABLE IN". Cela nécessite l'utilisation d'une sortie supplémentaire du Picaxe.
 
Last edited:

TheMoustic

New Member
Ok d'accord. J'ai donc utilisé le pin3 des CD4026. Pour afficher 01, ça va bien, c'est bien rouge bien propre. Sauf plus j'augmente, plus l'intensité du rouge diminue. Quand j'affiche 25, ça scintille..

C'est logique, puisque le code c'est :

Code:
low 4

pulsout 1,10

If b0 <> 0 then
 For b1 = 1 to b0
  pulsout 0,10
 Next b1
End If

High 4
Il n'y a pas un autre moyen ?
 
Last edited:

Chavaquiah

Senior Member
Je ne suis pas certain d'avoir compris mais peut-être que la pause n'est pas encore là?

Il faut attendre un peu apès que l'affichage est rétabli.
 

TheMoustic

New Member
Ha oui dsl, je n'ai pas tout mis..

Code:
Symbol plus = Input3
Symbol moins = Input2
Symbol frequence = b0
Symbol counter = b1

main:
let frequence = 1

Do
 If plus is On AND frequence < 25 then
  let frequence = frequence + 1
 End if

 If moins is On AND frequence > 1 then
  let frequence = frequence - 1
 End if

 low 4

 pulsout 1,10

 If frequence <> 0 then
  For counter = 1 to frequence
   pulsout 0,10
  Next counter
 End if

 high 4

 Pause 100
Loop
Donc forcément, les deux 7 segments sont éteint le temps de la réinitialisation et jusqu'à ce que le nombre voulu soit atteint. Donc plus le nombre que je souhaite affiché est élevé, plus longue sera la boucle for et donc, plus long sera le temps où les deux 7 segments sont éteint... Ce qui fait que quand je souhaite afficher 25, bah l'affichage scintille. Et l'effet commence à se faire sentir dès le nombre 02. Puisque la boucle for augmente (et donc le temps de traitement), ça fait un peu comme du PWM où le temps haut diminue, ce qui fait "pâlir" l'affichage (le rouge des segments est moins intense).4

EDIT : le coup de l'intensité qui diminue c'est quand il n'y a pas la pause, dsl je ne peux faire de copier coller du script puisque je programme sur un autre vieux pc..
 
Last edited:

Chavaquiah

Senior Member
Je vous propose un petit changement:

Code:
Symbol plus = Input3
Symbol moins = Input2
Symbol frequence = b0
Symbol counter = b1

main:
let frequence = 1
gosub MontrerFreq

Do
   If plus is On AND frequence < 25 then
      let frequence = frequence + 1
      pulsout 0, 1
      do loop while plus is On
   End if

   If moins is On AND frequence > 1 then
      let frequence = frequence - 1
      gosub MontrerFreq
      do loop while moins is on
   End if
   
Loop

MontrerFreq:
   low 4
   
   pulsout 1,1

   If frequence <> 0 then
      For counter = 1 to frequence
         pulsout 0,1
      Next counter
   End if

   high 4
   return
 

TheMoustic

New Member
Ha super !! Ça marche très bien ! Pas bête le coup de "Do loop while plus is On",vraiment pratique, parce qu'à 4 MHz, c'est difficile d'aller de 1 en 1 avec un bouton poussoir ^^

En fait si j'ai bien compris, on incrémente le compteur sans réinitialiser tant qu'on ne fait qu'appuyer sur "plus" ; et si on appui sur "moins", le compteur est réinitialisé puis augmenté jusqu'à "la précédente valeur - 1" (ce qui fait d'ailleurs un peu scintiller l'affichage - comparativement à la montée qui elle est hyper fluide -, mais je suppose qu'on ne peut pas avoir mieux avec ce genre de montage).

En tous cas merci beaucoup, c'est vraiment pas mal ;)
 
Last edited:

TheMoustic

New Member
Sinon j'avais une question quant à la fonction PWM du Picaxe.

Malgré la doc, je ne vois pas du tout comment elle fonctionne, et comme je n'ai pas d'oscillo, je ne peux pas m'amuser à en faire varier les paramètre pour percer ses secrets.

Pour moi, pour faire du PWM, faut définir une période en seconde (ou une fréquence en Hertz) et un rapport cyclique en pourcentage (ou un temps haut -ou bas- en seconde).

Or là je vois que la valeur du duty cycle va de 0 à 255 o_0
 

Chavaquiah

Senior Member
Peut-être que vous pensez de la commande pwmout? pwm n'est pas si utile car elle ne fonctionne que brièvement tandis qu'avec pwmout la sortie reste active jusqu'à ce que la command soit annulée (il est possible d'utiliser PWM avec un loop, mais ça ne marche pas trop bien).

Heureusement, l'éditeur de programmes Picaxe dispose d'un assistant très utile pour travailler avec pwmout. Voyez, svp, sous Picaxe --> Wizards --> pwmout.
 

TheMoustic

New Member
Oui effectivement je voulais parler de la fonction pwmout. L'assistant est en effet très utile ; pour un pwm à 1 kHz, la fonction est :

pwmout pwmdiv4, 2, 249, 500 (pour un duty cycle à 50 %)

Mais si je veux piloter le pwm (sont duty cycle) via un potentiomètre par exemple.. La technique serait donc :
readadc 1, b0

pwmout pwmdiv4, 2, 249, b0
Or la valeur lue du potentiomètre via la fonction readadc du Picaxe va renvoyer une variable entre 0 et 255... Soit au final un duty cycle de 0 à 25-26 % (quoi que.. le picaxe ne gérant que les entiers....).

En admettant que readadc fournisse une variable entre 0 et 1000, ne faudrait-il pas "protéger" la fonction pwmout si jamais b0 = 0 ou b0 = 1000 ? Pour b0 = 1000 encore.. on aurait un signal continue, mais pour b0 = 0..
 

PieM

Senior Member
Si seule la valeur du duty doit changer, il vaut mieux utiliser alors la fonction pwmduty.
duty peut varier entre 0 et 1023. il faut donc utiliser une variable du type word (w0 par exemple )
l'entrée ana (b3 par exemple) varie effectivement entre 0 et 255
Il est nécessaire de définir la relation entre les deux: si duty=0 doit correspondre à 0 et duty=1023 (1020 pour simplifier) à 255, alors w0 = 4 * b3

Par contre, et je pense que c'est le cas, si l'on veut que duty varie entre un mini et un maxi, pour toute la variation du potard, il y a une petite équation à appliquer qui est : w0 = mini + (maxi - mini)/255 * b3
sachant qu'on calcule à part (maxi-mini)/255 = coef.
la formule générale à appliquer devient donc w0= mini+ coef * b3

c'est ce que j'appelais la mise à l'échelle dans un autre post.
 
Top