Max7219 avec 08m2

#1
Bonjour, je suis en train de développer une application en utilisant le Max7219 avec un picaxe 08m2.

L'application fonctionne bien mais l'animation est très lente. Je vois les lignes une par une qui s’efface ainsi que les lignes qui s'affiche une par une.

Certain vont me dire c'est normale car tu affiches ligne par ligne et tu efface ligne par ligne.
Mais je n'ai aucune pause ! Je suppose que ça devrais être bien plus rapide.

Dans la logique, je devrais même mettre une pause entre chaque animation afin d'avoir le temps de la voir.

PS: j'utilise une Matrix 64 Led.

Merci d'avance.


Code:
  symbol DIN  = C.0
  symbol LOAD = C.1
  symbol CLK  = C.2
  symbol LEN  = 1    'pulse duration

  low DIN
  low LOAD
  low CLK
 
'init7219
  b1=$09  'decode mode
  b0=$00  '=yes, all digits=BCD
  gosub shiftout1

  b1=$0b  'scan limit
  b0=$07  '=4 digits, $00=1 digit only, $01=2 digits only, ...
  gosub shiftout1

  b1=$0c  'shutdown mode
  b0=$01  '=normal
  gosub shiftout1


  b1=$0a  'intensity
  b0=$02  '=max1
  gosub shiftout1
 
 
  b1=$0f  'display test
  b0=$00  '=normal
  gosub shiftout1
  
  gosub clearDisplay

main:

  b1=6
  b0=%00100100
  gosub shiftout1
 
  b1=5
  b0=%00111100
  gosub shiftout1
 
  b1=4
  b0=%00100100
  gosub shiftout1
 
  b1=3
  b0=%00111100
  gosub shiftout1

  gosub clearDisplay
 
  b1=7
  b0=%00100100
  gosub shiftout1
 
  b1=6
  b0=%00111100
  gosub shiftout1
 
  b1=5
  b0=%00100100
  gosub shiftout1
 
  b1=4
  b0=%00111100
  gosub shiftout1
 
  gosub clearDisplay
 
  b1=8
  b0=%00100100
  gosub shiftout1
 
  b1=7
  b0=%00111100
  gosub shiftout1
 
  b1=6
  b0=%00100100
  gosub shiftout1
 
  b1=5
  b0=%00111100
  gosub shiftout1
 
  gosub clearDisplay
  goto main


clearDisplay: 
  for b3 = 1 to 8
      b1=b3
      b0=$00
      gosub shiftout1
  next   
  return
 

shiftout1:
 
  for b5=1 to 16
    w6 = w0 & $8000
    low DIN
    if w6 = 0 then bit_is_low
    high DIN 

bit_is_low:
 
  pulsout CLK,LEN
  w0 = w0 * 2  '<< (shift bits left)
 
  next b5
  pulsout LOAD,LEN
  return
 

MGU

Senior Member
#2
Bonjour, je suis en train de développer une application en utilisant le Max7219 avec un picaxe 08m2.

L'application fonctionne bien mais l'animation est très lente. Je vois les lignes une par une qui s’efface ainsi que les lignes qui s'affiche une par une.

Certain vont me dire c'est normale car tu affiches ligne par ligne et tu efface ligne par ligne.
Mais je n'ai aucune pause ! Je suppose que ça devrais être bien plus rapide.

Dans la logique, je devrais même mettre une pause entre chaque animation afin d'avoir le temps de la voir.

PS: j'utilise une Matrix 64 Led.

Merci d'avance.


Code:
  symbol DIN  = C.0
  symbol LOAD = C.1
  symbol CLK  = C.2
  symbol LEN  = 1    'pulse duration

  low DIN
  low LOAD
  low CLK

'init7219
  b1=$09  'decode mode
  b0=$00  '=yes, all digits=BCD
  gosub shiftout1

  b1=$0b  'scan limit
  b0=$07  '=4 digits, $00=1 digit only, $01=2 digits only, ...
  gosub shiftout1

  b1=$0c  'shutdown mode
  b0=$01  '=normal
  gosub shiftout1


  b1=$0a  'intensity
  b0=$02  '=max1
  gosub shiftout1


  b1=$0f  'display test
  b0=$00  '=normal
  gosub shiftout1

  gosub clearDisplay

main:

  b1=6
  b0=%00100100
  gosub shiftout1

  b1=5
  b0=%00111100
  gosub shiftout1

  b1=4
  b0=%00100100
  gosub shiftout1

  b1=3
  b0=%00111100
  gosub shiftout1

  gosub clearDisplay

  b1=7
  b0=%00100100
  gosub shiftout1

  b1=6
  b0=%00111100
  gosub shiftout1

  b1=5
  b0=%00100100
  gosub shiftout1

  b1=4
  b0=%00111100
  gosub shiftout1

  gosub clearDisplay

  b1=8
  b0=%00100100
  gosub shiftout1

  b1=7
  b0=%00111100
  gosub shiftout1

  b1=6
  b0=%00100100
  gosub shiftout1

  b1=5
  b0=%00111100
  gosub shiftout1

  gosub clearDisplay
  goto main


clearDisplay:
  for b3 = 1 to 8
      b1=b3
      b0=$00
      gosub shiftout1
  next 
  return


shiftout1:

  for b5=1 to 16
    w6 = w0 & $8000
    low DIN
    if w6 = 0 then bit_is_low
    high DIN

bit_is_low:

  pulsout CLK,LEN
  w0 = w0 * 2  '<< (shift bits left)

  next b5
  pulsout LOAD,LEN
  return
Bonjour,

Je n'ai pas détaillé le programme ci dessus. Mais la vitesse d’affichage est directement liée à la vitesse horloge du picaxe. setfreq M32 devrait améliorer les choses.

J'ai aussi fait, il y a déjà quelques temps une page sur le sujet, si ça peut servir:
http://electromag1.wifeo.com/matrice-64-leds-driver-max7219-.php
La routine d'affichage est inspirée de la doc, peu mieux faire...

MM
 

BESQUEUT

Senior Member
#3
Deux routines plus performantes pour le shift out, la première uniquement pour les X2, la seconde pour tout le monde :
Code:
SHOUTNP:
    shiftout clock,sData,MSBFirst_L,(b1,b0)
    pulsout sLoad,1
return

SHOUTNP_:
    outpinC.6=bit15:pulsout clock, 1  
    outpinC.6=bit14:pulsout clock, 1
    outpinC.6=bit13:pulsout clock, 1
    outpinC.6=bit12:pulsout clock, 1
    outpinC.6=bit11:pulsout clock, 1
    outpinC.6=bit10:pulsout clock, 1
    outpinC.6=bit9:pulsout clock, 1
    outpinC.6=bit8:pulsout clock, 1
    outpinC.6=bit7:pulsout clock, 1
    outpinC.6=bit6:pulsout clock, 1
    outpinC.6=bit5:pulsout clock, 1
    outpinC.6=bit4:pulsout clock, 1
    outpinC.6=bit3:pulsout clock, 1
    outpinC.6=bit2:pulsout clock, 1
    outpinC.6=bit1:pulsout clock, 1
    outpinC.6=bit0:pulsout clock, 1
    pulsout sLoad,1
return
 
Last edited:

BESQUEUT

Senior Member
#4
Petite optimisation pour l'effacement :
Code:
clearDisplay:
   b0=$00
  for b1 = 1 to 8
      gosub shiftout1
  next
Je travaille actuellement sur un petit projet avec deux blocs de 4 matrices 8x8 pilotés par un 20X2 (avec setfreq m64...)
Quand on a 4 matrices en série, SPIout permet d'envoyer 8 octets en une seule commande, donc les 32 bits d'une ligne en une seule fois.
Le rafraîchissement est instantané, les animations sont fluides.
Du coup, bien que j'ai prévu la connectique pour utiliser le hspi, je ne l'ai pas mise en oeuvre.
 
Last edited:
Top