Sterrenhemel

Dit topic is gesloten

Bavelt

Golden Member

Het is nog een heel gepuzzel om de zaak fysiek aan elkaar te breien.
Ik heb 512 Leds, verdeeld over 8 panelen ('Matrixen' van 8 * 8 = 64 leds per paneel))

Dat betekent dus wel 108 draden..(ik weet het, eigen keuze het zo te doen met losse ledjes.. ;()

Nu kan ik één print maken met de PIC er op, 8 MAX7219's en 16 RJ45 connectoren (8 pins) en UTP kabel. Daar zitten 8 draden in.
En dan van de MAX-en naar de leds.

Omdat de afmeting 240 * 240 is, betekent dat wel lange draden naar de print.
Ik kan natuurlijk ook ieder paneel voorzien van een 'eigen' printje met een MAX 7219 er op, dan hoef ik maar 6 draden tussen de printjes in te doen. Maar blijft wel de 108 fdraden van de prints naar de Leds (die dan wel een stuk korter zijn).

Ik ben hier nog over aan het prakkiseren. Ook over de connectors. Dat UTP is wel vrij stug spul. Wellicht dat flatcable een beter oplossng is?
Maar dan zit ik weer met welke connectoren daarvoor dan geschikt zijn?

De panelen (4mm MDF) zijn ieder 120 * 60 cm groot.

Wie raad weet..Alle tips welkom!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik kan kiezen uit de varianten:
- Alle electronica op 1 print, met de (lange) draden naar de LED's.

- Op elk paneel een printje met MAX7219. Maar dan zijn de lange draden voor Din, CLK en CS (en uiteraard Vcc en GND). De printjes worden dan 'doorgelust'.

Is daar nog iets zinnigs over te zeggen? Mijn gevoel zegt dat vriant 1 minder gevoelig is voor storingen.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Met de MAX7219 kan je de helderheid van de Leds instellen met het Intensity Register 0x0A in combinatie met weerstand Rset (Tussen Iset en VCC).
Ik heb daar nu 10k voor genomen. Maar de ledjes zijn eigenlijk, bij de minimum waarde van het Intensity register (PWM: 1/32), nóg te helder cq er loopt teveel stroom door).

Ik kan de weerstand verhogen, en de ledjes branden inderdaad zachter, maar vroeg me af of daar geen minimum waarde voor R moet zijn. In de datasheet kan ik dat zo niet vinden.
Kan ik bv zomaar 220K gebruiken?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Dan ben ik nog steeds aan het puzzelen hoe ik ledjes random goed kan aansturen.
Ik heb alle leds voorzien van een nummer van 1 tot 512.

Zo maak ik gebruik van Rand() in MikroBasic:

pic basic code:


Randnum = rand() / 63
if Randnum < 513 then 
---
---

Alleen treedt het verschijnsel op dat een (flink) aantal waarden nooit wordt gegenereerd. Er zit dus iets nog niet goed.
Ik heb nog wat gespeeld met Srand(x) met verschillende waarden van x, maar dat reageert vreemd.
Na bv Srand(9) doet Rand() vrijwel niks meer.

Is er toch een mooiere manier te verzinnen om een random getal te krijgen tussen 1 - 512?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik worstel met nog een probeem:

Ik wil in het programma afvangen of er binnen een halve seconde nadat op een knop van de AB is gedrukt, er op nóg een knop is gedrukt.

Hier mee kan je bijvoorbeeld 1-2 als 12 beschouwen en een functie daar aan koppelen. Dan heb je meer mogelijkheden dan 10 (alleen cijfers 0-9 op de AB)

Het lukt me niet echt:

Ik heb een Timer TmrIR die 25ms telt. BIj TMR=20 heb je dan 500ms.

Ik heb nu:

pic basic code:



While True
   If fIRFound = 1 Then            'Indicates IR-Control received
      fIRFound = 0
        Control_IRCode()           'Funcion for each button.
   End If

Maar hoe nu hier te krijgen dat wanneer je binnen 500mS een tweede toets indrukt is lastig..

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Timertje bijhouden

pic basic code:


If TimeOutCnt Then
  Dec(TimeOutCnt)
End If
If fIRFound = 1 Then
  fIRFound = 0
  If TimeOutCnt Then
    ...                 'multiple keys
  Else
    ...                 'One key
  End If
  TimeOutCnt = 20
End If
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dank Arco.

Eigenlijk waanzinnig eenvoudig. Ik was al de hele dag bezig, met vlaggetjes, een 'keyteller' die bijhield hoe vaak je had gedrukt, etc.

Wat nog even lastig is:
de byte Codebyte geeft de waarde aan van de toets die is ingedrukt. Bijvoorbeeld "1" = 69 en "2" is 70.

Als je de toets 1, kort gevolgd door 2 indrukt, krijg je dus 69 en 70 achter alkaar.
Ik dacht er aan beide op te tellen. Het resultaat kan ik dan mooi meenemen in de Select Case die de functies aanroept.

bijvoorbeeld:
69 = 1
70 = 2
139 = 12

Je moet dus de waarde van de eerste toets onthouden (codeByteSav) en bij de tweede toetsdruk de nieuwe waarde daarbij optellen.

Alleen: waar laat ik de waarde van de eerste toetsaanslag?

Of kan ik dat ook slimmer doen?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Zo werkt het:

pic basic code:

If fIRFound = 1 Then                                       'Indicates IR-Control received
      fIRFound = 0
      LatA.7 = 1                                              'Led shows IR Signal received
      Delay_Ms(50)
      LatA.7 = 0
      if TmrIR > 0 then
        CodeByte = CodeByte + CodeByteSav
      Else
         CodebyteSav = CodeByte
      End If
      TmrIR = 20
      Control_IRCode()
   End If

Grappig...zo weinig code..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 30 december 2020 18:40:23 schreef Arco:
Timertje bijhouden

pic basic code:


If TimeOutCnt Then
  Dec(TimeOutCnt)
End If
If fIRFound = 1 Then
  fIRFound = 0
  If TimeOutCnt Then
    ...                 'multiple keys
  Else
    ...                 'One key
  End If
  TimeOutCnt = 20
End If

Wat nog even een issue is:

De dubbele key wordt gedetecteerd. Maar óók de enkele toets wordt in dat geval gesignaleerd.
(bij dubbele key: eerst wordt de code bij one key gepakt, en vervolgens de 'multiple key'. De eerste moet niet.)

Het mooiste zou zijn om te bepalen óf de een, óf de andere....

[Bericht gewijzigd door Bavelt op donderdag 31 december 2020 21:59:14 (10%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb een werkende oplossing, maar het voelt nog wat 'boerenkool-achtig'...

in Control_IRCode() wordt de functie geregeld die je wilt.
CodeByte wordt in de interrupt bepaald. CodebyteSav is de eerst ingedrukte toets.

pic basic code:


If fIRFound = 1 Then                                       'Indicates IR-Control received
      fIRFound = 0
      LatA.7 = 1                                              'Led shows IR Signal received
      Delay_Ms(50)
      LatA.7 = 0
      If TmrIR  then                                          'Multiple Keys pressed
          CntPress = 2
          CodeByte = CodeByte + CodeByteSav
      Else                                                    'Single Key pressed
          CodebyteSav = CodeByte
          CntPress = 1
      End If
      TmrIR = 40
End If
if tmrIR = 0 then
   If CntPress > 0 Then
      CntPress = 0 
      Control_IRCode()
   End if
End If

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Om te kunnen 'debuggen' wilde ik een logging maken van de stream zoals die binnenkomt vanuit de TSOP. Een data-logger dus, in de interrupt-routine.

Ik wil dan de status (hoog of laag) en de duur daarvan vastleggen in een tabel, om die later te kunnen raadplegen.

Ik heb nu een timer interrupt van 100us overflow.
Dat is iets te grof.

Maar tot hoever kun je nu een timer maken die nog betrouwbaar is? Ik neem aan dat hoe dichter je bij de klokfrequentie komt, hoe moeilijker het wordt.

Bijvoorbeeld: stel ik wil een timer van 10uS ipv 100uS.
Volgens de datasheet (PIC16F1847) zou dat kunnen met freq = 32Mhz, Post = 2, Pre= 4 en Pr=49.
Dan kom ik uit op T2CON = 00001101.

Maar kan dat wel zo?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Bij 32MHz is de instructieclock 8MHz. PR wordt dus 9...
Hoe dichter je bij de clockfrequentie komt, hoe minder effectief een interrupt wordt. (steeds meer overhead en je kunt steeds minder doen in de interrupt)

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

Golden Member

Het is inmiddels gelukt een soort "data logger" te maken in de interrupt routine.
Ik heb nl nog steeds het verschijnsel dat de IR af en toe niet oplevert wat ik verwacht (i.i.g Geen foute vlaggetjes meer.. ;).

Ik bedacht me dat je in principe natuurlijk ook een eigen afstandsbediening kan maken, met een IR zend- en ontvang diode.

In mijn onschuld bedacht ik dat dat misschien wel heel simpel kan: toets 1 = 1 pulsje (wat voor lengte dan ook, 2 = 2 pulsjes, etc.

Maar dan zit je wel weer met de schakelaartjes / kastje.
Die dingen (Zoals de NEC-data) koop je voor een habbekrats.
Wellicht zijn er ook programmeerbare types?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb de Interrupt routine wat versimpeld. Voor deze toepassing werkt het (tot nu toe) prima!

Ik tel de binnenkomende pulsen. Bit 18 tot 25 is de command code

pic basic code:

 IRIn = NOT PORTB.0                                        'Signal is Inverted
     If fIRFound = 0 Then
       If IrIn <> fPrev Then
          if fPrev = 0 Then                                   'Low to high
             If (Cnt > 17) and (Cnt < 26) Then                'Bit 18 - 25 = Command Code
                 If PulsCnt < 14 then
                     CodeByte.(Cnt-18) = 0
                 Else
                     CodeByte.(Cnt-18) = 1
                 End If
              End If
              PulsCnt = 0
              Inc(Cnt)
              If Cnt > 33 Then fIrFound = 1 Cnt = 0 PulsCnt = 0 End If
           End If
          fPrev = IrIn
        Else
           Inc(PulsCnt)
        End If
     End If
    TMR2If_bit = 0
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Wat is een NEC-data? (als ik er op zoek kom ik bij beamers terecht...)

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

Golden Member

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Mijn oog viel per toeval op en NRF2401. Ik ken het niet, blijkbaar een Receiver op 2,4 GHz radiogolven.

Zou zo'n ding toepasbaar / geschikt zijn om het project (PIC) op afstand te programmeren?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Alles is eigenlijk bruikbaar daarvoor. Zoalng je maar een geschikte bootloader kunt vinden voor die toepassing...

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

Golden Member

Op 5 januari 2021 11:23:40 schreef Arco:
Alles is eigenlijk bruikbaar daarvoor. Zoalng je maar een geschikte bootloader kunt vinden voor die toepassing...

Ik ben al aan het zoeken.. :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Als ik een tijdmoduultje (bv DS3231) aan de sterrenhemel wil toevoegen, dan heb ik de I2C nodig. Voor de Leds gebruik ik de SPI.

Ik wil ze dus beide tegelijk gebruiken.

Ik lees in de datasheet dat de PIC16F1936 voor I2C en SPI klok dezelfde pin heeft. (RC3)

Kan ik ze dan wel beide (tegelijk) gebruiken?

(Ik heb het angstige vermoeden dat deze maar 1 MSSP module heeft. Net als de ogenschijnlijk uitgebreide PIC16F1939... ;()

[Bericht gewijzigd door Bavelt op dinsdag 5 januari 2021 22:00:11 (17%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Als ik kijk naar de 'Microchip product Selector' en kies mijn wensen dan zou ik uitkomen op de voor mij onbekende PIC16F18857. Dit ding is nog goed verkrijgbaar bij bv Farnell.

Is dit een beetje een gangbaar type?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Die is prima bruikbaar, is vrij nieuw. Heeft een PPS, da's heel handig. (je kunt meeste functies verplaatsen naar (bijna) elke gewenste pin)
De MikroE compilers ondersteunen hem ook. Dat moet je altijd even controleren, want ze zijn de laatste tijd erg traag met implementeren van nieuwe types.
(de nieuwe 18FxxQxx types zijn ondaks vele vragen nog steeds niet geimplementeerd... :( )

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

Golden Member

(de nieuwe 18FxxQxx types zijn ondaks vele vragen nog steeds niet geimplementeerd... :( )

Dat klopt. Ik heb wel eens een programma geprobeerd te compileren voor een PiC18Fxx.

Zit er eigenlijk wel een beetje ontwikkeling in de MB Compiler?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De gewone 18Fxx pics worden bijna allemaal ondersteund, alleen loopt alles een paar jaar achter. Storend als je een nieuw type wilt gebruiken...
Ze zetten nu meer in op hun nieuwe Necto programmeeromgeving, die veel mensen niks vinden (ik ook niet... ;) )

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

Golden Member

De PIC 16F18857 ga ik bestellen. € 1,44 ex BTW bij Farnell is gewoon goedkoop.

Undertussen lukt het zelfs nog met de 1847 (die heeft 2 MSSP's), alhoewel ik tegen de grenzen loop van RAM/ROM met de sterrenhemel, klok, I2C, SPI etc.
En dan ook nog cijfers "maken" met de LEd's.
Maar het kleurt nog niet rood...

Wat ik zelf merk is dat ik in verschillende programma's - die weliswaar werken - , de TRIS voor de I2C (SDA en CLK ) en de SPI (SCK en SDO) op verschillende standen heb.

Wat is nu het juiste? beide op Output en dan LAT gebruiken, of moet ik voor Klok en/of Data input kiezen?

Ik twijfel nl omdat voor de data je zowel schrijft als leest...

Fouten zijn het bewijs dat je het probeert..

Dit topic is gesloten