Sterrenhemel

Dit topic is gesloten

Arco

Special Member

Kan zijn dat de documentatie nooit is bijgewerkt...

LongInts en Dwords zijn inderdaad een hoop meer werk voor een 8 bitter, hij moet dan 4 bytes bijhouden voor 1 variabele.
(eerst optellen bij byte1, eventueel carry naar byte2, dan naar byte3, en dan naar byte4...)

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

Golden Member

If TmrCnt Then 'TmrCnt is 25mS timer

Is

pic basic code:

If Tmrcnt then ...

hetzelfde als

pic basic code:

If TmrCnt > 0 then.....

?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ja... (eigenlijk TmrCnt <> 0)

[Bericht gewijzigd door Arco op maandag 16 november 2020 21:46:13 (71%)

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

Golden Member

Nu ik toch bezig ben om de longints, longwords, Integers, etc te vermijden...:

Om bijvooorbeeld een random getal te krijgen van 0 t/m 8 deed ik dit:

pic basic code:


Dim RandNum   As Integer
-- 
--

Randnum = Rand()
m1 = RandNum mod 8

Zou er dan ook een mogelijkheid zijn om een random getal te krijgen voor een getal onder de 10 zonder 'lange dingen' te gebruiken?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Rand() gebruikt inderdaad vrij veel geheugen (iets van 150 bytes)
Als je toch een 25ms timer gebruikt kun je TmrCnt Mod 8 proberen (of dat 'random' genoeg is)

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

Golden Member

de constructie met de timers in de interrupt werkt.

Maar het vreemde in dat

pic basic code:

Randnum = Rand()  

in de Main de boel lijkt te verstoren..

Het proces lijkt te stokken. Hier is iets vreemds mee. Is Rand() soms een cpu-vreter?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Gebruikt aardig wat ja, kun je in de assembly en listingfile (en in de statistics) zien.
Daarom zei ik dat je beter indien vordoende de timer kunt gebruiken die je toch al hebt...

Rand() wat in main loopt mag nooit invloed hebben op timers in de interrupt. (main wordt wel trager)

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

Golden Member

Als je toch een 25ms timer gebruikt kun je TmrCnt Mod 8 proberen (of dat 'random' genoeg is)

TmrCnt Mod 8 levert steeds alleen 1 op..

Dat komt natuurlijk omdat de routine in de MAin pas begint bij TmrCnt = 0

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik nam aan dat je dat met intervallen aan zou roepen, dan zal het wellicht wel goed gaan. (als je 't meteen na opstarten doet is de waarde uieraard altijd gelijk)
Misschien is vooraf een delay_ms(100) voldoende om een willekeurige waarde te krijgen.

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

Golden Member

Ik heb het nog niet voor elkaar om zonder gebruik van Rand() een random getal te krijgen van 1 t/m 8.

Als ik m1 = TmrCnt mod 9 gebruik, met een delay, dan krijg ik - afhankelijk van de delay waarde, steeds hetzelfde getal terug.

Onderstaand werkt wel, maar vertraagt de boel aanzienlijk:

pic basic code:

Randnum = Rand()                                          
 m1 = RandNum mod 9
 if m1 = 0 then m1 = 8 end if
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik ben het programma aan het vervolmaken met een aantal extra functies. Zoals een hemel die langzaam - random - per ster 'dooft'

Nu vroeg ik me af of je in MikroBasic een tabel kan definieren in de sfeer van:

- Field A
. - Field B
. - Field C

Waarbij B en C 'childs' zijn van 'parent' A.

Alleen A en B kan met bv

pic basic code:

 Matrix     As Byte [8][8]

2-dimensionaal dus.

Maar hoe nu die C erbij in?

(Ik heb het nu opgelost met twee 2-dimensionale tabellen, maar dan moet je dingen dubbel doorlopen...)

Fouten zijn het bewijs dat je het probeert..
Fan van Samsung (en repareer ook TV's). :)
Arco

Special Member

Structure kan inderdaad in Mikrobasic, maar ik weet niet of je dat bedoelt. (er is dan niks van een 'child', alleen een verzameling variabelen)

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

Golden Member

Wat lastig uit te leggen wat ik bedoel.
Het gaat om onderstaande routine:

pic basic code:



Dim Matrix     As Byte [8][8]
    UpDown     as Byte [8][8]
    Inh        As Byte [8][8]


----
----

'========================================================================================
Sub Procedure New_Heaven()
'========================================================================================
 fFade = 0
 for Row = 0 to 7                                             'Random startvalue for the matrixes
   for m1 = 0 to 7                                            'Value between 0 - 255
     Matrix[Row][m1] = rand()/128
     Delay_ms(5)
   next m1
  Next Row

  For Row = 0 to 7                                            'Initieal fill  UpDown
   For m1 = 0 to 7                                            'Even rows countUp, Odd rows count down
    Select case Row
    case 0,2,4,6
      UpDown[Row][m1] = 1
    case 1,3,5,7
      UpDown[Row][m1] = 0
    End Select
   next m1
  Next Row
                                                              'Initial fill all rows
  For Row  = 0 to 7
     For m1 = 0 to 7
        Inh[Row][m1] = GrayCode[Matrix[Row][m1]]
     Next m1
  Next Row
  
  Write_Matrix()
  
  Delay_ms(10)
End Sub

Ik heb hier 3 twee-dimensionale tabellen.

Die doorloop ik ieder afzonderlijk, terwijl de Row en m1 steeds dezelfde zijn.

Dit moet volgens mij beter kunnen...(bv 3-dimensionale tabel?)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Row en m1 zijn nergens hetzelfde??? (nou ja, alleen als beide for/next waardes gelijk zijn)
Daar beide verschillend zijn valt dat toch niet te combineren?

(ik heb sowieso al een gruwelijke hekel aan multidimensionale arrays: het wordt meestal een onoverzichtelijke spaghettiboel die moeilijk te doorgronden is)

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

Golden Member

Ik kan het idd oplossen met een 3D-tabel.
Maar inderdaad, de code wordt een stuk korter, maar goede kans dat na verloop van tijd je niet meer weet hoe het zit (tenzij heel goed gedocumenteerd in het programma). Zoals ik het nu heb is het begrijpelijk.
Dus laat ik het zo.

Dan nog iets anders: bij de PIC16F1847 kan je poort A.5 behalve MCLR ook als een gewone I/O-poort gebruiken. (bij de PIC16F628A is het input only begreep ik uit de datasheet).

Ik disable dan MCLR in de project settings. Ik begrijp dat A.5 dan een 'open collector' uitgang is?

LATA.5 = 1 werkt nl niet. Ook niet met een pullup van 10K (of is dat alleen voor input?)

Update: ik zag op een andere site dat dit blijkbaar foutief is omschreven in de datasheet: het is een I/O pin maar dan alleen input!

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik heb nog nergens gezien dat RA5 alleen input zou zijn (er staat niets over in de errata)
Ik gebruik tweedimensionale arrays ook nooit, omdat het gauw onoverzichtelijk is (en altijd beter op te lossen)

Het updown array is sowieso verspilling van geheugen: je gebruikt nu 64 bytes terwijl je maar 64 bits nodig hebt omdat je alleen 1 of 0 hebt...

pic basic code:


Dim UpDown As Byte[8]

  For Row = 0 to 7                                           'Initieal fill  UpDown
    For m1 = 0 to 7                                            'Even rows countUp, Odd rows count down
      Select case Row
        case 0,2,4,6
          UpDown[Row].m1 = 1
        case 1,3,5,7
          UpDown[Row].m1 = 0
      End Select
    Next m1
  Next Row
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Het updown array is sowieso verspilling van geheugen: je gebruikt nu 64 bytes terwijl je maar 64 bits nodig hebt omdat je alleen 1 of 0 hebt...

Dat had ik idd gezien. Het fijntunen, opmaken, niet-gebruikte (test)variabelen, etc, verwijder ik als alles werkt.

Ik zit evenwel nog met een vreemd probleem. Nog steeds met de random:

pic basic code:

If Tmr1Cnt = 0 then                                        
      Randnum = Rand() / 512  
      m1 = RandNum mod 8

      Delay_ms(3)

      Randnum = Rand() / 512
      Row = Randnum Mod 8

De timer geeft een interrupt iedere 100uS.

De waarde-combinatie m1 = 3 EN Row = 4 wordt evenwel nooit gegenereerd.

Is dit nog op een of andere manier te beredeneren?

(De deelfactor / 512 is puur op experimentele basis. Als ik die weglaat, krijg ik nog veel meer 'gemiste' combinaties).
Ik gebruik dit om de sterremhemel te 'faden' dwz één voor een moeten alle ledjes die branden uitgaan, en dan in random volgorde.
Maar hij mist er nu dus een aantal vanwege de gemiste combinatie.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb nog nergens gezien dat RA5 alleen input zou zijn (er staat niets over in de errata)

Verderop in de datasheet staat het eigenlijk wel:

en

Terwijl in het begin van de sheet iets anders wordt gesuggereerd (general purpose I/O pin)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb 8 Matrix-Leds van 8 * 8, ieder voorzien van een MAX7219 aangesloten
op de PIC16F1847.

Wanneer ik alle leds laat branden, zie je dat de ledjes niet mooi constant branden, maar er een soort flikkering doorheen gaat, wat een beetje lijkt op horizontale strepen.

Wat kan hiervan de oorzaak zijn? Is dat wellicht omdat er gebruik wordt gemaakt van mulitplexen? Of moet ik een andere oorzaak zoeken? (Het geheel is niet gesoldeerd, maar met een breadboard en een kabeltje naar de aansluiting van de MAX7219's).

Fouten zijn het bewijs dat je het probeert..

Op 23 november 2020 01:58:54 schreef Arco:
Ik heb nog nergens gezien dat RA5 alleen input zou zijn (er staat niets over in de errata)

Nochtans is dat bij alle controllers (16Fxxxx) die ik gebruik wel zo, ook bij deze van Bavelt.
Als je de MCRL uitschakelt is die pin enkel als input te gebruiken.

Staat op blz 121 in de datasheet waar oa staat " The exception is RA5, which is
input only and its TRIS bit will always read as ‘1’

LDmicro user.
Bavelt

Golden Member

Klopt, Zie update bericht hierboven

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Waarom mag dit niet in MikroBasic? Word is toch 16 bits?

Hij staat echter alleen maar 8 bits toe.

pic basic code:

Flags        As Word
      fPrev      As sBit At Flags.0
      fIRFound   As sBit At Flags.1
      fHeaven    As sBit At Flags.2
      fFade      As sBit At Flags.3
      fInc       As sBit At Flags.4
      fSw1       As sBit At Flags.5
      fWrite     As sBit At Flags.6
      fOrion     As sBit At Flags.7
      fUrsa      As sBit At Flags.8
      fTwinkle   As sBit At Flags.9
      fOnOff     As sBit At Flags.10
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Geen idee. Ik gebruik het nooit.
Bij meer als 8 bits gebruik ik meer variabelen. Da's efficienter voor de compiler en in gebruik maakt het toch niks uit...

pic basic code:


Flags        As Byte
  fPrev      As sBit At Flags.0
  fIRFound   As sBit At Flags.1
  fHeaven    As sBit At Flags.2
  fFade      As sBit At Flags.3
  fInc       As sBit At Flags.4
  fSw1       As sBit At Flags.5
  fWrite     As sBit At Flags.6
  fOrion     As sBit At Flags.7

Flags2       As Byte
  fUrsa      As sBit At Flags2.0
  fTwinkle   As sBit At Flags2.1
  fOnOff     As sBit At Flags2.2
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Bij meer als 8 bits gebruik ik meer variabelen. Da's efficienter voor de compiler en in gebruik maakt het toch niks uit...

Ik had het inderdaad ook zo opgelost. Qua ruimte maakt het niet uit. Maar nu moet je wel steeds opletten dat je zowel flags als flags2 op nul zet.

Anders had dat in één keer gekund. (In de reset-start mode heb ik de flags altijd op 0 staan).

Fouten zijn het bewijs dat je het probeert..

Dit topic is gesloten