Sterrenhemel

Dit topic is gesloten

Bavelt

Golden Member

Dan kan nu het grote monteren beginnen...
Wanneer ik 8 segmenten heb van 8 * 8 dan betekent dat dus 8 * 16 = 128 draden van de MAX7219's naar de leds

Ik ben aan het puzzelen hoe ik dat het beste kan doen. Zelf 8 7219's solderen op een gaatjesboard en dan met Dupont female of male connectoren naar de LEDS?

Kan ik dat wellicht slimmer doen? Want het is me nogal een bos touw...
;(

Ik heb al 2 boardjes met 4* een Max7219 voorgemnoteerd er op. Die zijn bedoeld om daar een Led Matix in te steken. De pinnetjes van een LED matrix zijn echter een stuk dunner dan de normale dupont pinnetjes.
Die passen er dus niet in. Zijn daar wellicht ook kleine connectoren voor die daar wel in passen?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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

Golden Member

https://nl.aliexpress.com/item/32892386779.html?spm=a2g0o.productlist.…

Grappig, dus te gebruiken als 'verloopstukjes': van 0,7 naar 0,5 mm. Deze had ik er niet zo snel uitgevist.

Je hebt dan wel een 'extra' connector er tussen zitten.
(van de leds via een draden met Dupont-male headers naar deze verloop, die ja dan weer in de boardjes prikt.

Fouten zijn het bewijs dat je het probeert..

Dupont male headers passen niet in die female headers zoals afgebeeld.

Je zou wel die female header op de print kunnen solderen (i.p.v. de led matrix) en vervolgens zo'n zelfde header gebruiken als connector aan je draad (draad in / aan het gat solderen).

Je stapelt er dan dus 2 op elkaar.

Arco

Special Member

In de link zijn gewoon standaard gedraaide contacten. Die kun je toch i.p.v. de bestaande monteren (niet dubbel)

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

Golden Member

Even kijken of ik het nog begrijp:

Dit is zo'n printje (in dit geval maar voor 1 Led, maar ik heb ze dus ook met 4 in een rij).
De connectors waar de Matrix Leds in kunnen, zitten er vast op gesoldeerd.
Die moet ik er dus niet afhalen.
Van deze connectors wil ik naar de LEDS op het zachtboard-panel (ipv een matrix led er in te prikken).

Het zijn dus per panel 16 draden die ik via een connector in de pinnen wil stoppen. Alleen kunnen daar enkel dingen in die maar 0,5 mm2 diameter hebben.

De dupont met draden zijn ca 0,7mm2 en passen daar niet in.

Ik dacht dat de link die Arco stuurde, een verloop was van 0,5 naar 0,7...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Nee, dat zijn standaard gedraaide buscontacten van 0.5mm...

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

Golden Member

Ik zou zelf nieuwe printjes maken met de MAX7219 ic erop en dan met een goede stekker verbinding. Bij de 'print chinees' zijn 10 printjes meestal niet duurder dan 5 stuks.
Ik zou niet lopen 'rommelen' met gaatjes print en fragile stekkers. Het moet wal de komen 5 top 10 jaar aan een plafond zitten.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Kan ik dat wellicht slimmer doen? Want het is me nogal een bos touw...

En mede daarom stelde ik reeds eerder de WS2811 voor...

Op 27 oktober 2020 14:50:06 schreef Roland van Leusden:
100 Stks/pak DC5V Ws2811 Ic Led Printplaat €8.51

https://nl.aliexpress.com/item/32821263233.html

Per printje kun je vervolgens 3 witte leds aansluiten

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Bavelt

Golden Member

Ik worstel nog steeds wel om een delay in te brengen met een Timer.

In deze routine:

pic basic code:


'========================================================================================
 Sub Procedure Orion_Shift()
'========================================================================================

  For y1 = 0 to 3
     For x1 = 0 to 7
        For Rw = 0 to 7
           For m1 = 4 to 7
              Inh[Rw][m1].7 = Inh[Rw][m1].6
              Inh[Rw][m1].6 = Inh[Rw][m1].5
              Inh[Rw][m1].5 = Inh[Rw][m1].4
              Inh[Rw][m1].4 = Inh[Rw][m1].3
              Inh[Rw][m1].3 = Inh[Rw][m1].2
              Inh[Rw][m1].2 = Inh[Rw][m1].1
              Inh[Rw][m1].1 = Inh[Rw][m1].0
              if m1 < 7 Then Inh[Rw][m1].0 = Inh[Rw][(m1+1)].7  else Inh[Rw][m1].0 = 0x00 End if
           Next m1
           
           For m1a = 3 to 0 step -1
              Inh[Rw][m1a].0 = Inh[Rw][m1a].1
              Inh[Rw][m1a].1 = Inh[Rw][m1a].2
              Inh[Rw][m1a].2 = Inh[Rw][m1a].3
              Inh[Rw][m1a].3 = Inh[Rw][m1a].4
              Inh[Rw][m1a].4 = Inh[Rw][m1a].5
              Inh[Rw][m1a].5 = Inh[Rw][m1a].6
              Inh[Rw][m1a].6 = Inh[Rw][m1a].7
              if m1a = 0 Then Inh[Rw][m1a].7 = 0x00 else Inh[Rw][m1a].7 = Inh[Rw][(m1a-1)].0  End if
           next m1a
        Next Rw
             Write_Matrix()
             Delay_Ms(5000)
     Next x1
  Next y1

 End Sub

Zit na de Write_Matrix() een Delay van 5 Sec. Deze write zit midden tussen een for-next loop, dus niet aan het einde of begin van de routine.
Maar eigenlijk wil ik die delay vervangen door een Timer Counter, om zo te bewerkstelligen dat met een interupt van de IR daar meteen naar wordt geluisterd.

In de interrupt routine zitten al wel couters:

pic basic code:

 If TmrCnt > 0 Then                                         'TmrCnt is 25mS timer
      Dec(TmrCnt)
      If TmrCnt = 0 Then
         TmrCnt = 250
         If Tmr1Cnt > 0 Then Dec(Tmr1Cnt) End If              'Timer * 25mS
         If Tmr2Cnt > 0 Then Dec(Tmr2Cnt) End If              'Timer * 25mS
         If Tmr3Cnt > 0 Then Dec(Tmr3Cnt) End If              'Timer * 25mS
      End If
    End If

En in de main zit de hoofdttimer (Tmr1Cnt):

pic basic code:

While True

  If fIRFound = 1 Then
     LatA.7 = 1
     Delay_Ms(250)
     LatA.7 = 0
     Control_IRCode()
     fIRFound = 0
   End If

If (fOr_Sh > 0) then
       Orion_Shift()
   End if


----
----

 Tmr1Cnt = 200   '200 * 25ms= 5 Sec)



Maar ik weet niet goed hoe ik met de counter Tmr3Cnt nu in de routine Orion_Shift moet plaatsen om het zelfde effect (delay) te krijgen, maar dat een interrupt van de IR direct wordt uitgevoerd....

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Wat bedoel je precies? Om op een timer te wachten kun je zoiets doen:

pic basic code:


Tmr1Cnt = 200        '200 * 25ms= 5 Sec)
While Tmr1Cnt  Wend  'Wait
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

While Tmr1Cnt Wend 'Wait

Dat had ik dus gedaan. Maar dan blijft hij wachten totdat die tijd voorbij is.

Stel dat dat 5 seconden is, dan reageert de IR interrupt (bv aan/uit, sneller, helderder) etc pas na 5 seconden.

Wat ik in feite wil is dat de module steeds terugkeert naar de main, en dan pas verder gaat als de counter op 0 staat.
In de main wordt nl de IR-sensor afgevangen en kan die voorgang krijgen op de wachtende routine.
Als die delay aan het einde van de routine had gezeten, was het goed te doen. Maar nu zit hij midden in een for-next loop (de lichtjes schuiven nl 1 positie op).

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik begrijp het nog steeds niet erg. Als je alleen iets uit wilt voeren als de timer op 0 staat kun je toch dit doen:

pic basic code:


If Tmr1Cnt = 0 Then
  ...
End If
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dat dacht ik ook, maar dat werkt niet in dit geval.

De module Orion_Shift wordt aangeroepen vanuit de main. Iedere keer opnieuw. In de main zit de centrale besturing waar wordt afgevangen of er een interrupt is, of er op de AB is gedrukt, de snelheid(Tmr1Cnt), etc..
En hij roept de routine Orion_Shift(0 aan.

Maar in die routine zit een for-next (x1) die een vertraging moet ondergaan, om alle ledjes in een rij van iedere matrix 1 positie te verschuiven in een heel langzaam tempo.

Maar je wilt dat gedurende die tijd dat er wordt gewacht, kan worden ingegrepen vanuit de IR-control.

Als ik de delay (of While Tmr3Cnt <> 0 Wend) in de routine Orion_Shift() stop, zul ik moeten wachten tot de delay is afgelopen.

Stop ik de delay in het begin of einde van de routine, dan begint hij weer helemaal van voren af aan opnieuw met de For Y, Rw, etc. Dat is ook niet goed, want je wilt maar 1 postie opschuiven.

Er zit dus gewoon iets niet goed in deze timer-main constructie.

Concreet zou ik dus willen om de delay NA de Write_Matrix() te kunnen onderbreken...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Zo wordt het alleen uitgevoerd als tmr3 '0' is...

pic basic code:


Sub Orion_Shift()
  If Tmr3Cnt = 0 Then
    ...
    ...
  End If
End Sub
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dat wel, maar dan zit de delay niet op de goede plek.
Die delay moet optreden na de Write_Matrix() en niet aan het begin van de routine. (waarmee alles opnieuw wordt gestart)

Lastig probleem dit, niet?

Ik zou natuurlijk in de interrupt routine een vlaggetje kunnen opzetten en dat 'ergens' verwerken in de routine Orion_Shift() om de delay te onderbreken..
Zoiets van een 'goto einde - stop maar met de routine - te midden in een for-next loop. Dat wordt dan vreselijke boerenkool-spaghetti programmeren.

Lijkt me niet fraai..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb al wel dit kunnen vereenvoudigen:

pic basic code:


For y1 = 0 to 3
   For x1 = 0 to 7

in

pic basic code:


    For x1 = 0 to 31

Dat wordt nu:

pic basic code:

'========================================================================================
 Sub Procedure Orion_Shift()
'========================================================================================
     For x1 = 0 to 31
        For Rw = 0 to 7
           For m1 = 4 to 7
              Inh[Rw][m1].7 = Inh[Rw][m1].6
              Inh[Rw][m1].6 = Inh[Rw][m1].5
              Inh[Rw][m1].5 = Inh[Rw][m1].4
              Inh[Rw][m1].4 = Inh[Rw][m1].3
              Inh[Rw][m1].3 = Inh[Rw][m1].2
              Inh[Rw][m1].2 = Inh[Rw][m1].1
              Inh[Rw][m1].1 = Inh[Rw][m1].0
              if m1 < 7 Then Inh[Rw][m1].0 = Inh[Rw][(m1+1)].7  else Inh[Rw][m1].0 = 0x00 End if
           Next m1
           
           For m1a = 3 to 0 step -1
              Inh[Rw][m1a].0 = Inh[Rw][m1a].1
              Inh[Rw][m1a].1 = Inh[Rw][m1a].2
              Inh[Rw][m1a].2 = Inh[Rw][m1a].3
              Inh[Rw][m1a].3 = Inh[Rw][m1a].4
              Inh[Rw][m1a].4 = Inh[Rw][m1a].5
              Inh[Rw][m1a].5 = Inh[Rw][m1a].6
              Inh[Rw][m1a].6 = Inh[Rw][m1a].7
              if m1a = 0 Then Inh[Rw][m1a].7 = 0x00 else Inh[Rw][m1a].7 = Inh[Rw][(m1a-1)].0  End if
           next m1a
        Next Rw
             Write_Matrix()
     Next x1
 End Sub

De Write_Matrix() zit net voor de Next x1. En daartussen moet dan die onderbreekbare 'Delay' komen...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik zie het probleem niet?

pic basic code:


'========================================================================================
Sub Procedure Orion_Shift()
'========================================================================================
  If Tmr3Cnt = 0 Then
    If x1 < 31 Then inc(yx1)Else x1 = 0 End If
    For Rw = 0 to 7
      For m1 = 4 to 7
        Inh[Rw][m1].7 = Inh[Rw][m1].6
        Inh[Rw][m1].6 = Inh[Rw][m1].5
        Inh[Rw][m1].5 = Inh[Rw][m1].4
        Inh[Rw][m1].4 = Inh[Rw][m1].3
        Inh[Rw][m1].3 = Inh[Rw][m1].2
        Inh[Rw][m1].2 = Inh[Rw][m1].1
        Inh[Rw][m1].1 = Inh[Rw][m1].0
        if m1 < 7 Then Inh[Rw][m1].0 = Inh[Rw][(m1+1)].7  else Inh[Rw][m1].0 = 0x00 End if
     Next m1
           
     For m1a = 3 to 0 step -1
       Inh[Rw][m1a].0 = Inh[Rw][m1a].1
       Inh[Rw][m1a].1 = Inh[Rw][m1a].2
       Inh[Rw][m1a].2 = Inh[Rw][m1a].3
       Inh[Rw][m1a].3 = Inh[Rw][m1a].4
       Inh[Rw][m1a].4 = Inh[Rw][m1a].5
       Inh[Rw][m1a].5 = Inh[Rw][m1a].6
       Inh[Rw][m1a].6 = Inh[Rw][m1a].7
       If m1a = 0 Then Inh[Rw][m1a].7 = 0x00 else Inh[Rw][m1a].7 = Inh[Rw][(m1a-1)].0  End if
     Next m1a
   Next Rw
   Write_Matrix()
   Tmr3Cnt = 200   
End Sub
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Is er in MikroBasic trouwens een 'nette' manier om uit een for-next lus te stappen, of naar de end sub te gaan?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Break: uit een loop
Exit: uit een routine

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

Golden Member

Nou, na wat puzzelen heb ik het programma inmiddels zoals ik het hebben wilde.
En nog zonder rare dingen ook volgens mij. De code is zelfs eenvoudiger geworden! :)

Ik zal hem publiceren als alles klaar is. Ik wil nl nog wat leuke functies bedenken.

Ook heb ik een oplossing bedacht voor de bedrading: hiervoor gebruik ik straks UTP-kabels! Ik heb hier nog een rol liggen. In een UTP zitten 8 draden, dus prima geschikt voor het aansturen van de rijen (anodes) en kolommen (kathodes) van de matrixen. Dan is de kabelboom te overzien en goed te fatsoeneren. Ik voorzie ieder kabeltje van een RJ45-plug en op het printplaatje plaats ik een RJ45 chassisdeeltje. Dan is het makkelijk aan te sluiten en los te koppelen.
Dan heb ik ook geen Dupont-gedoe meer... :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

In MikroBasic ben ik de hulplijntjes kwijt geraakt waarmee je keurig kon zien of de If - End If, For- Next, etc netjes onder elkaar komen te staan.
Misschien dat Arco weet waar ik dat moet zoeken? (In de editor hulpmiddelen heb ik al van alles bekeken, maar wellicht zit het ergens verstopt?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

'Show indent guides' aanvinken.

Ook als dat is gedaan kan het nog wel eens misgaan.
Wordt meestal veroorzaakt doordat er 'iets' in de code staat waar de editor niet blij mee is. Soms helpt file opnieuw aanmaken.

Ik ben bijv. regelmatig de rode golflijntjes kwijt onder onbekende woorden. Gebeurt bijv. als ik DWord als symbol gebruik.
Is wat duidelijker als Longword. Mag wel en werkt, maar de editor raakt overstuur erdoor... ;)
De Indent guides zijn dan ook weg...

pic basic code:


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

Golden Member

De IR-TSOP sensor komt straks met relatief lange draden naar het printje met de uc.
Op sommige publicaties lees ik dat de ontstorings condenstor tussen de voeding van de IR persé een tantaalelco moet zijn.
Ik heb nu een 'gewoon' elcootje van 10uF er tussen.

Is dat echt zo kritisch?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

'Show indent guides' aanvinken.

Ja, dat was hem..
Mijn hulplijntjes zijn weer terug... ;)

Fouten zijn het bewijs dat je het probeert..

Dit topic is gesloten