Led Matrix

Bavelt

Golden Member

Het is alweer een tijdje geleden dat ik hiermee aan de slag was, vandaar maar een nieuw topic.

Een oud projectje dat ik had heb ik nu gebruikt voor een klokje die de tijd schrijft (dus "tien voor half een" ipv 12:20).
Gewoon leuk om te maken.

Waar ik nog wel mee zit (en vroeger ook wel zat) is de lichtkrant die je kunt maken met LED Matrixen 8*8, waarvan er vier (1088AS) aan elkaar zitten met voor iedere matrix een MAX7219. Aangestuurd met SPI.
De lichtkrant werkt, maar ik blijf zitten met het probleem dat de tekst niet lekker vloeiend loopt.
Ik was laatst bij een busstation en daar liep ook een lichtkrantje. Ook met Led matrixen. De tekst loopt daar heel mooi vloeiend.

Als ik dat bij mij doe, dan loopt de tekst wel, maar als je er (met name van dichtbij) naar kijkt, dan lijkt het of de tekst toch wat 'bibberend' en trillend over het scherm gaat. Een onrustig beeld. Het is echt het geheel van 'knipperende ledjes'.

Hoe is dit nu 'busbaan' look-alike te krijgen?
De techniek lijkt redelijk simpel: je schuift van alle matrixen iedere kolom ééntje op, en schrijft dan de inhoud rij voor rij.

Toch moet er iets zijn, dat maakt dat het een onrustig beeld geeft.
Misschien vergeet ik iets.

Het lichtkrantje in MikroBasic heb ik bijgevoegd, De sourcecode is deze:

pic basic code:


'=========================================================================================
Program TestMatrix                                                  'Test Matrix LED
'=========================================================================================
'Display Matrix: 4 Elements LED 8 * 8, type 1088AS
'Processor: PIC16F1847
'Fequency : 20 Hmx External Xtal pin 15 and 16
'Clock    At PortB.4     pin 10
'Latch    At PortB.3     pin 9
'Data     At PortB.2     pin 8
'=========================================================================================

Const Font1 As Byte[760] = (                                        'Character table big characters
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ' space
  0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x18, 0x00, ' !
  0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0x6c, 0x00, ' "
  0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, ' #
  0x10, 0x3c, 0x40, 0x38, 0x04, 0x78, 0x10, 0x00, ' $
  0x60, 0x66, 0x0c, 0x18, 0x30, 0x66, 0x06, 0x00, ' %
  0xfc, 0x66, 0xa6, 0x14, 0x3c, 0x66, 0x3c, 0x00, ' &
  0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x30, 0x00, ' '
  0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, ' (
  0x06, 0x0c, 0x18, 0x18, 0x18, 0x0c, 0x06, 0x00, ' )
  0x00, 0x6c, 0x38, 0xfe, 0x38, 0x6c, 0x00, 0x00, ' *
  0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, ' +
  0x06, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, ' ,
  0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, ' -
  0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ' .
  0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, ' /
  0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, ' 0
  0x7e, 0x18, 0x18, 0x18, 0x1c, 0x18, 0x18, 0x00, ' 1
  0x7e, 0x06, 0x0c, 0x30, 0x60, 0x66, 0x3c, 0x00, ' 2
  0x3c, 0x66, 0x60,0x38, 0x60, 0x66, 0x3c, 0x00, ' 3
  0x30, 0x30, 0x7e, 0x32, 0x34, 0x38, 0x30, 0x00, ' 4
  0x3c, 0x66, 0x60, 0x60, 0x3e, 0x06, 0x7e, 0x00, ' 5
  0x3c, 0x66, 0x66, 0x3e, 0x06, 0x66, 0x3c, 0x00, ' 6
  0x18, 0x18, 0x18, 0x30, 0x30, 0x66, 0x7e, 0x00, ' 7
  0x3c, 0x66, 0x66, 0x3c, 0x66, 0x66, 0x3c, 0x00, ' 8
  0x3c, 0x66, 0x60, 0x7c, 0x66, 0x66, 0x3c, 0x00, ' 9
  0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, ' :
  0x0c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, ' ;
  0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, ' <
  0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, ' =
  0x06, 0x0c, 0x18, 0x30, 0x18, 0x0c, 0x06, 0x00, ' >
  0x18, 0x00, 0x18, 0x38, 0x60, 0x66, 0x3c, 0x00, ' ?
  0x00, 0x3c, 0x42, 0x1a, 0x3a, 0x22, 0x1c, 0x00, ' @
  0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x3c, 0x00, ' A
  0x3e, 0x66, 0x66, 0x3e, 0x66, 0x66, 0x3e, 0x00, ' B
  0x3c, 0x66, 0x06, 0x06, 0x06, 0x66, 0x3c, 0x00, ' C
  0x3e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x00, ' D
  0x7e, 0x06, 0x06, 0x3e, 0x06, 0x06, 0x7e, 0x00, ' E
  0x06, 0x06, 0x06, 0x3e, 0x06, 0x06, 0x7e, 0x00, ' F
  0x3c, 0x66, 0x76, 0x06, 0x06, 0x66, 0x3c, 0x00, ' G
  0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x00, ' H
  0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, ' I
  0x1c, 0x36, 0x36, 0x30, 0x30, 0x30, 0x78, 0x00, ' J
  0x66, 0x36, 0x1e, 0x0e, 0x1e, 0x36, 0x66, 0x00, ' K
  0x7e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, ' L
  0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00, ' M
  0xc6, 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0x00, ' N
  0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, ' O
  0x06, 0x06, 0x3e, 0x66, 0x66, 0x66, 0x3e, 0x00, ' P
  0x60, 0x3c, 0x76, 0x66, 0x66, 0x66, 0x3c, 0x00, ' Q
  0x66, 0x36, 0x1e, 0x3e, 0x66, 0x66, 0x3e, 0x00, ' R
  0x3c, 0x66, 0x60, 0x3c, 0x06, 0x66, 0x3c, 0x00, ' S
  0x18, 0x18, 0x18, 0x18, 0x18, 0x5a, 0x7e, 0x00, ' T
  0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, ' U
  0x18, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, ' V
  0x63, 0x77, 0x7f, 0x6b, 0x63, 0x63, 0x63, 0x00, ' W
  0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x00, ' X
  0x18, 0x18, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x00, ' Y
  0x7e, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x7e, 0x00, ' Z
  0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, ' [
  0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, ' \
  0x1e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1e, 0x00, ' ]
  0x00, 0x00, 0x00, 0x82, 0x44, 0x28, 0x10, 0x00, ' ^
  0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ' _
  0x00, 0x00, 0x00, 0x0c, 0x18, 0x18, 0x18, 0x00, ' '
  0x7c, 0x66, 0x7c, 0x60, 0x3c, 0x00, 0x00, 0x00, ' a
  0x3e, 0x66, 0x66, 0x3e, 0x06, 0x06, 0x06, 0x00, ' b
  0x3c, 0x66, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, ' c
  0x7c, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x00, ' d
  0x3c, 0x06, 0x7e, 0x66, 0x3c, 0x00, 0x00, 0x00, ' e
  0x0c, 0x0c, 0x3e, 0x0c, 0x0c, 0x6c, 0x38, 0x00, ' f
  0x3c, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0x00, ' g
  0x66, 0x66, 0x66, 0x3e, 0x06, 0x06, 0x06, 0x00, ' h
  0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 0x00, ' i
  0x1c, 0x36, 0x36, 0x30, 0x30, 0x00, 0x30, 0x00, ' j
  0x66, 0x36, 0x1e, 0x36, 0x66, 0x06, 0x06, 0x00, ' k
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, ' l
  0xd6, 0xd6, 0xfe, 0xee, 0xc6, 0x00, 0x00, 0x00, ' m
  0x66, 0x66, 0x66, 0x7e, 0x3e, 0x00, 0x00, 0x00, ' n
  0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, ' o
  0x06, 0x06, 0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, ' p
  0xf0, 0xb0, 0x3c, 0x36, 0x36, 0x3c, 0x00, 0x00, ' q
  0x06, 0x06, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, ' r
  0x3e, 0x40, 0x3c, 0x02, 0x7c, 0x00, 0x00, 0x00, ' s
  0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, ' t
  0x7c, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, ' u
  0x18, 0x3c, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, ' v
  0x7c, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, ' w
  0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, ' x
  0x3c, 0x60, 0x7c, 0x66, 0x66, 0x00, 0x00, 0x00, ' y
  0x3c, 0x0c, 0x18, 0x30, 0x3c, 0x00, 0x00, 0x00, ' z
  0x70, 0x18, 0x18, 0x0c, 0x18, 0x18, 0x70, 0x00, ' {
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, ' |
  0x0e, 0x18, 0x18, 0x30, 0x18, 0x18, 0x0e, 0x00, ' }
  0x00, 0x00, 0x00, 0x36, 0x5c, 0x00, 0x00, 0x00  ' ~
  )

  Dim
  Latch      As sbit at LATB.3        'pin 9
  Datapin    As sbit at LATB.2        'pin 8

  Row        As Byte
  Col        As Byte
  Dis        As Byte
  i1         As Byte
  j1         As Byte
  x1         As Byte
  y1         As Byte

  Index      As Byte
  BufferIn   As Byte[5][8]

  Buffer     As Byte[4]
  CharX      As Char
  Flags      As Byte
  fFont      As sBit At Flags.0
  fIndChange As sBit At Flags.1
  BufferDis  As Char[32]
  Str        As Char[32]
  BufConv    As Byte[8]

'=========================================================================================
Sub Procedure Max_Write(Dim pRow, pDig0, pDig1, pDig2, pDig3 As Byte)
'=========================================================================================
 Latch = 0
 SPI1_Write(pRow)
 SPI1_Write(pDig0)
 SPI1_Write(pRow)
 SPI1_Write(pDig1)
 SPI1_Write(pRow)
 SPI1_Write(pDig2)
 SPI1_Write(pRow)
 SPI1_Write(pDig3)
 Latch = 1
End sub

'=========================================================================================
Sub Procedure Max7219_Init()
'=========================================================================================
Max_Write(0x09, 0x00, 0x00, 0x00, 0x00)
Max_Write(0x0B, 0x07, 0x07, 0x07, 0x07)
Max_Write(0x0C, 0x01, 0x01, 0x01, 0x01)
Max_Write(0x0A, 0x01, 0x01, 0x01, 0x01)
End sub

'=========================================================================================
Sub Procedure Clear_Leds()                                          'Turn all Leds off
'=========================================================================================
For Row = 1 TO 8
   Max_Write(Row, 0x00, 0x00, 0x00, 0x00)
   Delay_Ms(1)
Next Row
End sub

'=========================================================================================
Sub Function Read_Str() As Byte
'=========================================================================================
 Result = Str[Index]
 Inc(Index)
 If Index > Length(str) - 1 Then Index = 0 End If
End Sub

'=========================================================================================
Sub Procedure Write_Text()
'=========================================================================================
   For Row = 0 to 7                                                 'CharX is new character
        BufferIn[0][Row] = Font1[((CharX - 0x20) <<3) + Row]
   Next Row

   For Col = 0 to 7                                                 'Each column to write
      For Dis = 4 to 0 step -1                                      'ShIft characters
         For Row = 0 to 7
           BufferIn[Dis][Row].0 = BufferIn[Dis][Row].1
           BufferIn[Dis][Row].1 = BufferIn[Dis][Row].2
           BufferIn[Dis][Row].2 = BufferIn[Dis][Row].3
           BufferIn[Dis][Row].3 = BufferIn[Dis][Row].4
           BufferIn[Dis][Row].4 = BufferIn[Dis][Row].5
           BufferIn[Dis][Row].5 = BufferIn[Dis][Row].6
           BufferIn[Dis][Row].6 = BufferIn[Dis][Row].7
           If Dis > 0 Then BufferIn[Dis][Row].7 = BufferIn[Dis-1][Row].0 else BufferIn[0][Row].7 = 0  End If
         Next Row
      Next Dis

      For Row = 0 to 7
        Buffer[0] = BufferIn[1] [Row]                         'Write each Row to Buffer (display)
        Buffer[1] = BufferIn[2] [Row]
        Buffer[2] = BufferIn[3] [Row]
        Buffer[3] = BufferIn[4] [Row]
        Max_Write(Row + 1, Buffer[0], Buffer[1], Buffer[2], Buffer[3])
      Next Row
      Delay_Ms(40)
   Next Col
 End Sub



'=========================================================================================
Main:

'=========================================================================================
  ANSELB     = %00000000                                     'Port B digital
  TRISB      = %00100001                                     'Port B.0, B.5 Input

  Index      = 0
  Str        = "TEST LICHTKRANT     "                        'Initialize String

  SPI1_Init()                                                'Initialize SPI
  Max7219_Init()
  Delay_Ms(10)

  Clear_Leds()
  Delay_Ms(10)

While True
 For j1 = 0 to Length(str) - 1
    CharX = Read_Str()                                       'Read Character From Str into buffer
    Write_Text()                                             'to display the text
 Next j1

Wend
End.

[Bericht gewijzigd door Henry S. op maandag 14 maart 2022 22:47:02 (0%)

Fouten zijn het bewijs dat je het probeert..

Een beetje commerciële lichtkrant maakt geen gebruikt van MAX7219 ic's
veel te duur.
Die gebruiken gewoon een rits schuifregisters voor een rij en een 7 of 8 tal row drivers.
Ik ken de MAX7219 niet, maar dat hoef top zich geen probleem te zijn denk ik.
Alles komt hier op een super snelle verwerking en uitclocken van de nieuwe bits en de daarbijbehorende activatie van de row.
Wellicht ben je simpelweg gewoon te traag in je software? Of laat je onnodig alles even uit

Op 14 maart 2022 13:15:02 schreef Bavelt:
Als ik dat bij mij doe, dan loopt de tekst wel, maar als je er (met name van dichtbij) naar kijkt, dan lijkt het of de tekst toch wat 'bibberend' en trillend over het scherm gaat. Een onrustig beeld. Het is echt het geheel van 'knipperende ledjes'.

Hoe is dit nu 'busbaan' look-alike te krijgen?

Een gedeelte van de "busbaan" look is dat de busbaan-lichtkrant 4 meter boven je hoofd hangt. Jouw matrixbordje is een stuk dichterbij.
Terwijl jij dezelfde 8x8 matrixblokjes gebruikt.

Een tijdje (4 jaar?) terug was er hier een topic over Surtronic FDS184 ledborden. (Surtronic maakt(te?)) die busbaanborden)

Die borden hebben 16 rijen van 256 kolommen. De truc daar is dat de controle-signalen om de schuifregisters te besturen uit eenstuk programmeerbare logica (CPLD) komen, die ervoor zorgt dat de timing heel precies en constant is.

Bavelt

Golden Member

Dat Busbaan-lichtkrantje heb ik van tamelijk dichtbij bekeken (< 1 meter). Het waren matrixen van 7 rijen en 5 kolommen per karakter. Dus nog minder dan ik heb.

Het valt me wel op , dat wanneer ik de snelheid van het tonen verhoog, het 'bibberende' effect veel minder wordt. Maar ja, dan vliegt de tekst over het scherm...

Ik heb wat lopen experimenteren en bij het 'schuiven' van de tekst eerst de displays uit, alle kolommen 1 opschuiven, rijen schrijven en dan display weer aan. Geeft zeker geen verbetering.

Er moet dus iets zijn waardoor de bus-lichtkrant wel vloeiend loopt. In de tram zag ik onlangs ook zo'n ding; mooi rustig over de displays.

Fouten zijn het bewijs dat je het probeert..
buckfast_beekeeper

Golden Member

Zijn het niet je delays die je parten spelen? Je processor staat elke main cyclus 20ms niks te doen. Kan die tijd niet nuttiger gebruikt worden om een nieuw karakter te laden? Is het na het resetten van de leds nog nodig 10ms te wachten? Ook in je write text heb je nog een delay van 40ms.

Van Lambiek wordt goede geuze gemaakt.
Bavelt

Golden Member

Op 14 maart 2022 18:36:44 schreef buckfast_beekeeper:
Zijn het niet je delays die je parten spelen? Je processor staat elke main cyclus 20ms niks te doen. Kan die tijd niet nuttiger gebruikt worden om een nieuw karakter te laden? Is het na het resetten van de leds nog nodig 10ms te wachten? Ook in je write text heb je nog een delay van 40ms.

De delays zijn eenmalig bij de start van het programma (na de init).

Dan start de loop (While - Wend en daar komt hij niet meer uit).
De Delay die overblijft is die van 40mS in de Write_Tekst. En die bepaalt de snelheid waarmee de lichtkrant loopt. Wijzig ik die in bv 10ms, dan vliegt de tekst over het scherm.

Verhoog ik hem, dan gaat de tekst stap voor stap. Dan is het effect tak-tak-tak...

Fouten zijn het bewijs dat je het probeert..
buckfast_beekeeper

Golden Member

Kan je hier en uit de c librarie geen bruikbare zaken halen?

Van Lambiek wordt goede geuze gemaakt.

Lang, lang geleden schreef men in quick basic bijvoorbeeld iets als:

On timer(0.040) gosub UpdateScherm

Bestaat zoiets ook in mikrobasic?
Dan begint elke update preciezer om de 40 ms.
In c zou je een hardware timer van de pic hiervoor gebruiken.

De Delay die overblijft is die van 40mS in de Write_

Ik vind 40mS niets doen best wel veel. Wat is de cyclustijd van jouw programma? Als dat ook 40mS zou zijn, dan je doet je cpu de helft van de tijd niets. Er wordt dan dus ook niets aangestuurd. Is de cyclustijd van je programma niet steeds hetzelfde doordat je cpu de ene cyclus meer moet rekenen dan een volgende cyclus dan ga je dat waarschijnlijk wel zien ook.

Ik probeer altijd wait commando's te vermijden. Helemaal in subroutines. Zet die wait dan liever in het hoofdprogramma. Als dat basic voor subroutines interrupts gebruikt kan het gewoon fout lopen en onstabiel worden.

Als je met interrupts werkt heb je kans dat die wait opdrachten ook niet steeds even lang zijn. Als je met een vaste tijd wil wegschrijven kun je dat beter met een timer interrupt doen. Dan heb je als je het goed programmeerd altijd hetzelfde tijdsinterval.

Dus het programma gewoon wild laten rondrennen en pas als het timerbit geset word, het write commando starten en daarna meteen het timerbit weer resetten.

[Bericht gewijzigd door Ex-fietser op maandag 14 maart 2022 20:39:35 (18%)

Bavelt

Golden Member

Ik kan gebruik maken van interrupts in MikroBasic. Ik zal het daarom maar eens gaan herschrijven.

Maar kan dat het 'knipper' effect veroorzaken?

Als ik dezelfde LED matrix in een Arduino lichtkrant sketch gebruik, krijg ik exact hetzelfde verschijnsel.

Het effect lijkt een beetje of de ledjes even 'heen en weer' aan gaan.

Fouten zijn het bewijs dat je het probeert..

@bavelt:
Je heb wat mail in je postbus.
Hopelijk heb je er wat aan.

MVG Gerard.;)

soms zoekt men te diep in het EENVOUDIGE.
Ben G.

Golden Member

@bavelt:
Volgens mij hoef je met de MAX7219 het "scherm" niet uit en weer aan te zetten. Je schuift de data in de buffers van alle MAXxen die er zijn en maakt dan de pin "load" hoog en weer laag, hierdoor krijgen de uitgangen nieuwe data en is het knippereffect weg. De uitgangen behouden hun nieuwe toestand tot de volgende hoog/laag load.
(neem me niet kwalijk als het niet klopt, ik heb al vijf jaar niet meer een MAX7219 geprogrammeerd :-))

Bavelt

Golden Member

Op 14 maart 2022 22:10:53 schreef Ben G.:
@bavelt:
Volgens mij hoef je met de MAX7219 het "scherm" niet uit en weer aan te zetten. Je schuift de data in de buffers van alle MAXxen die er zijn en maakt dan de pin "load" hoog en weer laag, hierdoor krijgen de uitgangen nieuwe data en is het knippereffect weg. De uitgangen behouden hun nieuwe toestand tot de volgende hoog/laag load.
(neem me niet kwalijk als het niet klopt, ik heb al vijf jaar niet meer een MAX7219 geprogrammeerd :-))

Het scherm aan en uit zetten was een proefje om te kijken of dat hielp. Nee dus.
Ik heb het inmiddels weer verwijderd.
Ik ga ook eens proberen om dit zonder MAX7219 te doen. Ik vind die dingen niet altijd even stabiel. De ledjes branden soms niet constant (ondanks dat er geen data is gewijzigd) En vaak moet je ook de spanning er af halen omdat bij één matrix spontaan alle LEDS fel oplichten. Dit verschijnsel kwam ik bij andere projecten ook wel eens tegen.
Dan kan je dat sturen wat je wilt, je krijgt hem alleen weer goed door power down.
Die MAX-en hebben een eigen oscillator aan boord, waarmee het multiplexen wordt geregeld. Misschien zit daar iets niet lekker (of wellicht omdat het Chinees spul is van tante Alie).
Maar dit staat allemaal nog los van mijn topic: het mooi vloeiend laten verlopen.

Fouten zijn het bewijs dat je het probeert..
KGE

Golden Member

Meerdere MAX7219 zullen nooit synchroon lopen, zat net even in de datasheet te kijken maar zover ik kan zien is er geen mogelijkheid de multiplex clock te synchroniseren.

Wanneer je dus 'animatie' gaat doen krijg je dus de effecten die je ziet.

Met de 74HC595 eventueel gebufferd met een ULN2803 kun je zelf de synchronisatie bepalen.

[Bericht gewijzigd door KGE op dinsdag 15 maart 2022 10:43:47 (16%)

Niek56

Golden Member

Misschien een idee om met een snelle camera, die bijv. 100fps kan opnemen, het busbaan lichtkrantje op te nemen en deze dan langzaam af te spelen om te zien hoe de overgangen zijn van de kolommen. Dan weet je in ieder geval waarom het busbaan lichtkrantje zo soepel loopt.

Bavelt

Golden Member

Ik heb inmiddels het programma aangepast en maak nu gebruik van de timer interrupt van de PIC16F1847. Die loopt exact.

Het effect is zoals ik al vermoedde hetzelfde.

pic basic code:




'=========================================================================================
Program TestMatrix                                                  'Test Matrix LED
'=========================================================================================
'Display Matrix: 4 Elements LED 8 * 8, type 1088AS
'Processor: PIC16F1847
'Fequency : 20 Hmx External Xtal pin 15 and 16
'Clock    At PortB.4     pin 10
'Latch    At PortB.3     pin 9
'Data     At PortB.2     pin 8
'=========================================================================================

Const Font1 As Byte[760] = (                                        'Character table big characters
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ' space
  0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x18, 0x00, ' !
  0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0x6c, 0x00, ' "
  0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, ' #
  0x10, 0x3c, 0x40, 0x38, 0x04, 0x78, 0x10, 0x00, ' $
  0x60, 0x66, 0x0c, 0x18, 0x30, 0x66, 0x06, 0x00, ' %
  0xfc, 0x66, 0xa6, 0x14, 0x3c, 0x66, 0x3c, 0x00, ' &
  0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x30, 0x00, ' '
  0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, ' (
  0x06, 0x0c, 0x18, 0x18, 0x18, 0x0c, 0x06, 0x00, ' )
  0x00, 0x6c, 0x38, 0xfe, 0x38, 0x6c, 0x00, 0x00, ' *
  0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, ' +
  0x06, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, ' ,
  0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, ' -
  0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ' .
  0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, ' /
  0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, ' 0
  0x7e, 0x18, 0x18, 0x18, 0x1c, 0x18, 0x18, 0x00, ' 1
  0x7e, 0x06, 0x0c, 0x30, 0x60, 0x66, 0x3c, 0x00, ' 2
  0x3c, 0x66, 0x60,0x38, 0x60, 0x66, 0x3c, 0x00, ' 3
  0x30, 0x30, 0x7e, 0x32, 0x34, 0x38, 0x30, 0x00, ' 4
  0x3c, 0x66, 0x60, 0x60, 0x3e, 0x06, 0x7e, 0x00, ' 5
  0x3c, 0x66, 0x66, 0x3e, 0x06, 0x66, 0x3c, 0x00, ' 6
  0x18, 0x18, 0x18, 0x30, 0x30, 0x66, 0x7e, 0x00, ' 7
  0x3c, 0x66, 0x66, 0x3c, 0x66, 0x66, 0x3c, 0x00, ' 8
  0x3c, 0x66, 0x60, 0x7c, 0x66, 0x66, 0x3c, 0x00, ' 9
  0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, ' :
  0x0c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, ' ;
  0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, ' <
  0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, ' =
  0x06, 0x0c, 0x18, 0x30, 0x18, 0x0c, 0x06, 0x00, ' >
  0x18, 0x00, 0x18, 0x38, 0x60, 0x66, 0x3c, 0x00, ' ?
  0x00, 0x3c, 0x42, 0x1a, 0x3a, 0x22, 0x1c, 0x00, ' @
  0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x3c, 0x00, ' A
  0x3e, 0x66, 0x66, 0x3e, 0x66, 0x66, 0x3e, 0x00, ' B
  0x3c, 0x66, 0x06, 0x06, 0x06, 0x66, 0x3c, 0x00, ' C
  0x3e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x00, ' D
  0x7e, 0x06, 0x06, 0x3e, 0x06, 0x06, 0x7e, 0x00, ' E
  0x06, 0x06, 0x06, 0x3e, 0x06, 0x06, 0x7e, 0x00, ' F
  0x3c, 0x66, 0x76, 0x06, 0x06, 0x66, 0x3c, 0x00, ' G
  0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x00, ' H
  0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, ' I
  0x1c, 0x36, 0x36, 0x30, 0x30, 0x30, 0x78, 0x00, ' J
  0x66, 0x36, 0x1e, 0x0e, 0x1e, 0x36, 0x66, 0x00, ' K
  0x7e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, ' L
  0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00, ' M
  0xc6, 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0x00, ' N
  0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, ' O
  0x06, 0x06, 0x3e, 0x66, 0x66, 0x66, 0x3e, 0x00, ' P
  0x60, 0x3c, 0x76, 0x66, 0x66, 0x66, 0x3c, 0x00, ' Q
  0x66, 0x36, 0x1e, 0x3e, 0x66, 0x66, 0x3e, 0x00, ' R
  0x3c, 0x66, 0x60, 0x3c, 0x06, 0x66, 0x3c, 0x00, ' S
  0x18, 0x18, 0x18, 0x18, 0x18, 0x5a, 0x7e, 0x00, ' T
  0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, ' U
  0x18, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, ' V
  0x63, 0x77, 0x7f, 0x6b, 0x63, 0x63, 0x63, 0x00, ' W
  0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x00, ' X
  0x18, 0x18, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x00, ' Y
  0x7e, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x7e, 0x00, ' Z
  0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, ' [
  0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, ' \
  0x1e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1e, 0x00, ' ]
  0x00, 0x00, 0x00, 0x82, 0x44, 0x28, 0x10, 0x00, ' ^
  0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ' _
  0x00, 0x00, 0x00, 0x0c, 0x18, 0x18, 0x18, 0x00, ' '
  0x7c, 0x66, 0x7c, 0x60, 0x3c, 0x00, 0x00, 0x00, ' a
  0x3e, 0x66, 0x66, 0x3e, 0x06, 0x06, 0x06, 0x00, ' b
  0x3c, 0x66, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, ' c
  0x7c, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x00, ' d
  0x3c, 0x06, 0x7e, 0x66, 0x3c, 0x00, 0x00, 0x00, ' e
  0x0c, 0x0c, 0x3e, 0x0c, 0x0c, 0x6c, 0x38, 0x00, ' f
  0x3c, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0x00, ' g
  0x66, 0x66, 0x66, 0x3e, 0x06, 0x06, 0x06, 0x00, ' h
  0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 0x00, ' i
  0x1c, 0x36, 0x36, 0x30, 0x30, 0x00, 0x30, 0x00, ' j
  0x66, 0x36, 0x1e, 0x36, 0x66, 0x06, 0x06, 0x00, ' k
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, ' l
  0xd6, 0xd6, 0xfe, 0xee, 0xc6, 0x00, 0x00, 0x00, ' m
  0x66, 0x66, 0x66, 0x7e, 0x3e, 0x00, 0x00, 0x00, ' n
  0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, ' o
  0x06, 0x06, 0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, ' p
  0xf0, 0xb0, 0x3c, 0x36, 0x36, 0x3c, 0x00, 0x00, ' q
  0x06, 0x06, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, ' r
  0x3e, 0x40, 0x3c, 0x02, 0x7c, 0x00, 0x00, 0x00, ' s
  0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, ' t
  0x7c, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, ' u
  0x18, 0x3c, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, ' v
  0x7c, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, ' w
  0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, ' x
  0x3c, 0x60, 0x7c, 0x66, 0x66, 0x00, 0x00, 0x00, ' y
  0x3c, 0x0c, 0x18, 0x30, 0x3c, 0x00, 0x00, 0x00, ' z
  0x70, 0x18, 0x18, 0x0c, 0x18, 0x18, 0x70, 0x00, ' {
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, ' |
  0x0e, 0x18, 0x18, 0x30, 0x18, 0x18, 0x0e, 0x00, ' }
  0x00, 0x00, 0x00, 0x36, 0x5c, 0x00, 0x00, 0x00  ' ~
  )

  Dim
  Latch      As sbit at LATB.3        'pin 9
  Datapin    As sbit at LATB.2        'pin 8
  TestLed    As sbit at LATA.2        'pin 1

  Row        As Byte
  Col        As Byte
  Dis        As Byte
  i1         As Byte
  j1         As Byte
  x1         As Byte
  y1         As Byte
  TmrCnt     As Word

  Index      As Byte
  BufferIn   As Byte[5][8]

  Buffer     As Byte[4]
  CharX      As Char
  Flags      As Byte
  fFont      As sBit At Flags.0
  fIndChange As sBit At Flags.1
  BufferDis  As Char[32]
  Str        As Char[32]
  BufConv    As Byte[8]

'=========================================================================================
Sub Procedure Max_Write(Dim pRow, pDig0, pDig1, pDig2, pDig3 As Byte)
'=========================================================================================
 Latch = 0
 SPI1_Write(pRow)
 SPI1_Write(pDig0)
 SPI1_Write(pRow)
 SPI1_Write(pDig1)
 SPI1_Write(pRow)
 SPI1_Write(pDig2)
 SPI1_Write(pRow)
 SPI1_Write(pDig3)
 Latch = 1
End sub

'=========================================================================================
Sub Procedure Max7219_Init()
'=========================================================================================
Max_Write(0x09, 0x00, 0x00, 0x00, 0x00)
Max_Write(0x0B, 0x07, 0x07, 0x07, 0x07)
Max_Write(0x0C, 0x01, 0x01, 0x01, 0x01)
Max_Write(0x0A, 0x01, 0x01, 0x01, 0x01)
End sub

'=========================================================================================
Sub Procedure Clear_Leds()                                          'Turn all Leds off
'=========================================================================================
For Row = 1 TO 8
   Max_Write(Row, 0x00, 0x00, 0x00, 0x00)
   Delay_Ms(1)
Next Row
End sub

'====================================================================================================
Sub Procedure Blink (Dim pAant As Byte)
'====================================================================================================
 Dim q As byte
 For q = 1 to pAant
   TestLed = 1
   Delay_ms(500)
   TestLed = 0
   Delay_ms(500)
 Next q
End Sub

'=========================================================================================
Sub Function Read_Str() As Byte
'=========================================================================================
 Result = Str[Index]
 Inc(Index)
 If Index > Length(str) - 1 Then Index = 0 End If
End Sub

'=========================================================================================
Sub Procedure Write_Text()
'=========================================================================================
   For Row = 0 to 7                                                 'CharX is new character
        BufferIn[0][Row] = Font1[((CharX - 0x20) <<3) + Row]
   Next Row

   For Col = 0 to 7                                                 'Each column to write
      For Dis = 4 to 0 step -1                                      'ShIft characters
         For Row = 0 to 7
           BufferIn[Dis][Row].0 = BufferIn[Dis][Row].1
           BufferIn[Dis][Row].1 = BufferIn[Dis][Row].2
           BufferIn[Dis][Row].2 = BufferIn[Dis][Row].3
           BufferIn[Dis][Row].3 = BufferIn[Dis][Row].4
           BufferIn[Dis][Row].4 = BufferIn[Dis][Row].5
           BufferIn[Dis][Row].5 = BufferIn[Dis][Row].6
           BufferIn[Dis][Row].6 = BufferIn[Dis][Row].7
           If Dis > 0 Then BufferIn[Dis][Row].7 = BufferIn[Dis-1][Row].0 else BufferIn[0][Row].7 = 0  End If
         Next Row
      Next Dis

      For Row = 0 to 7
        Buffer[0] = BufferIn[1] [Row]                         'Write each Row to Buffer (display)
        Buffer[1] = BufferIn[2] [Row]
        Buffer[2] = BufferIn[3] [Row]
        Buffer[3] = BufferIn[4] [Row]
        Max_Write(Row + 1, Buffer[0], Buffer[1], Buffer[2], Buffer[3])
      Next Row

      While fIndChange = 0 Wend
      FIndchange = 0
   Next Col
 End Sub
 
 '====================================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'====================================================================================================
 If TMR2If_bit Then                                           'Timer interrupt?
  If (TmrCnt < 399) Then
      Inc(TmrCnt)
  Else
      TmrCnt = 0
      fIndChange = 1
  End If
  TMR2If_bit = 0
 End If
End Sub

'=========================================================================================
Main:

'=========================================================================================
  ANSELB     = %00000000                                     'Port A digital
  ANSELB     = %00000000                                     'Port B digital
  TRISB      = %00100001                                     'Port B.0, B.5 Input
  TRISA      = %11111011                                     'Port A.2 Output  (Test led)
  
  Index      = 0
  Str        = "TEST LICHTKRANT "                            'Initialize String
  SPI1_Init()                                                'Initialize SPI
  Max7219_Init()
  Delay_Ms(10)

  Clear_Leds()
  Delay_Ms(10)
  T2CON      = %00011100
  PR2        = 124
  GIE_bit    = 1
  PEIE_bit   = 1

  TMR2IE_bit = 1                                             'Enable Timer1 overflow interrupt
  TMR2IF_bit = 0                                             'Clear Timer1 overflow interrupt flag bit
  fIndChange = 0

While True

 For j1 = 0 to Length(str) - 1
    CharX = Read_Str()                                      'Read Character From Str into buffer
    Write_Text()                                            'to display the text
 Next j1

Wend

End.
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

-

[Bericht gewijzigd door Bavelt op dinsdag 15 maart 2022 11:47:46 (100%)

Fouten zijn het bewijs dat je het probeert..
buckfast_beekeeper

Golden Member

Gelieve je code tussen code tags te zetten. Net zoals Henry S deed bij je startpost.

Van Lambiek wordt goede geuze gemaakt.
Arco

Special Member

Heb je er een filmpje van? (als daar tenminste het effect in te zien is)
Het is me niet helemaal duidelijk wat je met schokkerig exact bedoelt...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 15 maart 2022 12:27:23 schreef buckfast_beekeeper:
Gelieve je code tussen code tags te zetten. Net zoals Henry S deed bij je startpost.

Done.. :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 15 maart 2022 12:30:00 schreef Arco:
Heb je er een filmpje van? (als daar tenminste het effect in te zien is)
Het is me niet helemaal duidelijk wat je met schokkerig exact bedoelt...

Het is heel moeilijk om te omschrijven. Op een filmpje (via smartphone) is het lastig te zien.

Hoe verder je ervan afstaat, hoe minder het effect is.
En als je de tekst snel laat lopen, wordt het ook minder.

Het effect lijkt er een beetje op, stel dat je bv de I weergeeft, die dan wordt getoond op kolom 4-5 van een matrix, het net lijkt of hij even wordt getoond op 5-6, dan 4-5 en dan 4-3. Dat bedoel ik met "bibberen".

Wellicht dat het idd is dat de matrixen niet synchroon worden gemultiplexed.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Als de tekst stil staat, zijn er dan ook vreemde effecten? (als het een synchronisatieprobleem is zou het dan ook op moeten treden)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik zou een proef kunnen nemen door geen MAX7219 te gebruiken, maar het via schuifregister 74HC495 te doen.
En met bv een Decade Counter als de 4016 de kolommen aan te sturen.
Maar ik vraag me af als je 32 kolommen 1 voor 1 aan- en uitzet, of je dat niet gaat zien.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 15 maart 2022 16:44:10 schreef Arco:
Als de tekst stil staat, zijn er dan ook vreemde effecten? (als het een synchronisatieprobleem is zou het dan ook op moeten treden)

Als de tekst stil staat, dan zie je zo nu en dan 'ergens' een of meerdere ledjes héél eventjes uitgaan (als een fonkelende ster). Onvoorspelbaar wanneer en ook qua aantal leds.

Dat was ook één van mijn grieven van het MAX7219 gebruik.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Met stilstaande tekst bedoel ik dat er dan totaal niets naar de MAX7219 wordt gestuurd via SPI...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com