EEprom

Op 14 mei 2021 01:48:06 schreef Bavelt:
Waarom mag dit wel:

Omdat de compiler je wil pesten.

Volgens mij zegt de wet niets over programma-regels, dus volgens mij mag het wel.

Of geeft de compiler een foutmelding? Ohhhh. Is dat het? Wat is die foutmelding dan?

In sommige gevallen, als je iets "duidelijk verkeerd" doet, dan kunnen wij doen alsof we de compiler zijn, de foutmelding reproduceren en uitleggen wat er mis is. Zodra dat niet lukt is de werkelijke foutmelding erg nuttig om er bij te hebben.

Ik denk dat het probleem buiten het stukje ligt wat je laat zien.

@arco : Ik laat mijn ADC 10 samples nemen van vier input kanalen en dan rapporteren dat ie klaar is. Totaal 40 samples. Dat doet ie helemaal zelf. En dan zitten m'n samples dus in een 2D array short samples[10][4] ...

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bavelt

Golden Member

Rew heeft gelijk. Ik moet het beter uitleggen. Maar na een lange tijd lopen te zoeken, staren en uiteindelijk heel laat maar een berichtje op het Forum geplaatst... ;(

En ik ben er nog niet uit. Soms kan ik gruwelijk over iets heen kijken vrees ik...

Het probleem wat ik heb zit hem eigenlijk niet zozeer in de 2-dimensionale tabel, maar in het veld TstBit.

Die is gedefiniëerd als bit:

pic basic code:


Dim TstBit       As Bit

Ik wil van een LED Matrix rij voor rij ieder ledje aanzetten en daarna weer uit. Het aanzetten gaat prima.

Maar als ik ze wil uitzetten gaat het mis. Ik krijg geen foutmelding o.i.d, maar op de een of andere manier blijft hij hangen op rij 7 (terwijl ik toch echt Rw = 0 to 7 opgeef.

pic basic code:

While True

  TstBit = 1
  For Rw = 0 to 7 
    For i1 = 0 to 7
      Inh[Rw][0].i1 = TstBit
      Write_Matrix()
    Next i1
  Next Rw
 
  Delay_Ms(1000)

  TstBit = 0
  For Rw = 0 to 7
    For i1 = 0 to 7
      Inh[Rw][0].i1 = TstBit     '<=== Dit werkt niet
      Write_Matrix()
    Next i1
  Next Rw

 ' TstBit = 0
 ' For Rw = 0 to 7
 '   For i1 = 0 to 7
 '     Inh[Rw][0].i1 = 0         '<=== Dit werkt wel
 '     Write_Matrix()
 '   Next i1
 ' Next Rw 


 Delay_Ms(1000)

 Wend

Het gaat dus wel goed als ik i.p.v

pic basic code:


TstBit = 0
Inh[Rw][0].i1 = TstBit

Opgeef:

pic basic code:


Inh[Rw][0].i1 = 0

Er is dus iets 'raars' met dat TstBit.
In mijn veronderstelling is dit een bit die op 1 of 0 kan worden gezet. En als zodanig ook kan worden afgevraagd of gebruikt om een ander bit op zijn waarde te zetten.

Waar zit nu mijn fout? :?

Fouten zijn het bewijs dat je het probeert..

Sorry. Ik heb al 30 jaar niet meer met basic gewerkt.... Laat staan zo'n moderne basic die twee dimensionale arrays snapt... In ieder geval heb ik je zo ver gekregen meer code te posten zodat mensen die wel recenter nog met basic gewerkt hebben er naar kunnen kijken.

Je code snap ik trouwens ook niet.

Ik zou iets verwachten als

code:


Dim leds[0..7][0..7] As Bit
Dim OnOff As Bit

OnOff = 1
While True
  COM dit kan vast beter: 
  OnOff = 1 - OnOff   

  For Rw = 0 to 7
    for Col = 0 to 7
       leds[Rw][Col] = OnOff
       Write_Leds ()
    next Col
  next Rw
Wend

Hmm. de .i1 notatie is mogelijk verkeerd.... Ik kan me voorstellen dat ie .1 als bitnummer 1 kan handlen, en .<variabele> niet.

Er gaat dat NOG iets fout, omdat ie geen syntax fout geeft.

Vergelijk met de beroemde fout in fortran:
DO5K=1,3
herhaal tot regel vijf met k van 1 tot 3.... hetgeen perongeluk geschreven werd als:
DO5K=1.3
hetgeen de compiler prima vond. Float variable DO5K krijgt de waarde 1.3 prima, watnu?

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bavelt

Golden Member

Er zit idd wel iets heel mafs hier..

Als ik

pic basic code:


TstBst = 0
For Rw = 0 to 7
   Inh[Rw][0].4 = TstBt
   Write_Matrix()
   Delay_ms(50)

   Inh[Rw][0].5 = TstBt
   Write_Matrix()
   Delay_ms(50)
Next Rw

Wat werkt, vervang door:

pic basic code:



TstBt = 0
For Rw = 0 to 7
  For i1 = 4 to 5
    Inh[Rw][0].i1 = TstBt
    Write_Matrix()
  Next i1
  Delay_ms(50)
Next Rw

M.a.w. ipv een 'harde' waarde 4 en 5 maar via een variabele, gaat het de mist in.
Maar ook TstBt speelt hier een rol in. Vervang ik die door een harde 0, dan gaat het weer wél goed... :?

Rara

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

In het 1e voorbeeld staat wel Tstbst i.p.v. Tstbt, typo?

Dit werkt allebei hier:

code:


  TstBit = 0
  For Cnt = 0 to 7
    Inh[2][0].4 = TstBit
    Inh[2][0].5 = TstBit
  Next Cnt

code:


  For Cnt = 2 to 4
    For lTmp = 2 to 4
      Inh[Cnt][0].lTmp = TstBit
    Next lTmp
    Delay_ms(50)
  Next Cnt

Anders werken stukje code plaatsen wat wel/niet werkt. (declaratie van alle variabelen in nu ook niet bekend)

[Bericht gewijzigd door Arco op vrijdag 14 mei 2021 13:28:22 (76%)

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

Golden Member

Ik heb de code zoveel mogelijk overgenomen. Cnt had ik al, is nu Cnt1

Toch gaat het fout:

pic basic code:

 Clear_Leds()
While True

  TstBt = 1
    For Cnt1 = 0 to 7
      For lTmp = 0 to 7
        Inh[Cnt1][0].lTmp = TstBt
        Write_Matrix()
        Next lTmp
    Next Cnt1
  
  Delay_Ms(1000)

  TstBt = 0
    For Cnt1 = 0 to 7
      For lTmp = 0 to 7
        Inh[Cnt1][0].lTmp = TstBt         '<< dit gaat fout
        Write_Matrix()
        Next lTmp
    Next Cnt1

  Clrwdt()
  Delay_Ms(1000)
  
 Wend

Filmpje: Nadat de leds stuk voor stuk zijn gezet, blijft hij bij het uitzetten op rij 7 hangen. (zou van 0 - 7 moeten zijn):

Fout.mp4

Als ik Inh[Cnt1][0].lTmp = TstBt Vervang door Inh[Cnt1][0].lTmp = 0 dan gaat het wel goed:

pic basic code:


Clear_Leds()
  While True

  TstBt = 1
    For Cnt1 = 0 to 7
      For lTmp = 0 to 7
        Inh[Cnt1][0].lTmp = TstBt
        Write_Matrix()
        Next lTmp
    Next Cnt1
  
  Delay_Ms(1000)

  TstBt = 0
    For Cnt1 = 0 to 7
      For lTmp = 0 to 7
        Inh[Cnt1][0].lTmp = 0           '<< dit gaat wel goed
        Write_Matrix()
        Next lTmp
    Next Cnt1

  Clrwdt()
  Delay_Ms(1000)
  
  Wend

Goed.mp4

:?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Hoe zijn alle variabelen gedeclareerd?

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

Golden Member

De variabelen:

pic basic code:


 Dim
    Rw           As Byte
    Inh          As Byte [8][8]
    Cnt1         As Byte
    TstBt        As Bit
    Ltmp         As Byte
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Al sBit geprobeerd? (ik gebruik dat altijd)

Verschil tussen sBit en Bit is qua uitleg nogal vaag (ook bij andere compilers zoals Keil).
Ik heb er al ontelbare posts over gelezen (van mensen die 't ook niet begrepen), en het is me niet veel duidelijker geworden, eerder onduidelijker.

Grootste verschil is dat met sBit jij bepaalt waar het bit komt, en met Bit bepaalt de compiler dat.
Ik heb andere applicaties gezien waar Bit niet werkte, en sBit wel...

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

Golden Member

Op 14 mei 2021 16:28:27 schreef Arco:
Al sBit geprobeerd? (ik gebruik dat altijd)

Verschil tussen sBit en Bit is qua uitleg nogal vaag (ook bij andere compilers zoals Keil).
Ik heb er al ontelbare posts over gelezen (van mensen die 't ook niet begrepen), en het is me niet veel duidelijker geworden, eerder onduidelijker.

Grootste verschil is dat met sBit jij bepaalt waar het bit komt, en met Bit bepaalt de compiler dat.
Ik heb andere applicaties gezien waar Bit niet werkte, en sBit wel...

Ga ik proberen, ik heb er idd zelf al aan gedacht.

Ondertussen kan ik het wel oplossen met de onderstaande routine. Maar ik wil natuurlijk wel graag onderzoeken hoe het nu zit. :)

pic basic code:

'========================================================================================
Sub Procedure Test_Panels()                                   'Turn all Leds on Test
'========================================================================================
 If IndTest = 0 then
    Inh[i1][x1].z1 = 0
 Else
    Inh[i1][x1].z1 = 1
 End If
 Inc(z1)
 If z1 > 7 Then
    z1 = 0
    Inc(i1)
    If i1 > 7 Then
       i1 = 0
       Inc(x1)
       If x1 > 7 Then
          x1 = 0
          IndTest = Not IndTest
       End If
    End If
 End If
End sub
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Sbit werkt ook niet.

Ik trek de voorzichtige conclusie dat wat ik doe dus niet mag.

De Help functie van MB toont ook al wat restricties. Ik weet niet of wat ik doe hier onder valt:

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 14 mei 2021 11:59:51 schreef rew:
Sorry. Ik heb al 30 jaar niet meer met basic gewerkt.... Laat staan zo'n moderne basic die twee dimensionale arrays snapt... In ieder geval heb ik je zo ver gekregen meer code te posten zodat mensen die wel recenter nog met basic gewerkt hebben er naar kunnen kijken.

Je code snap ik trouwens ook niet.

Ik zou iets verwachten als

code:


Dim leds[0..7][0..7] As Bit
Dim OnOff As Bit

OnOff = 1
While True
  COM dit kan vast beter: 
  OnOff = 1 - OnOff   

  For Rw = 0 to 7
    for Col = 0 to 7
       leds[Rw][Col] = OnOff
       Write_Leds ()
    next Col
  next Rw
Wend

Hmm. de .i1 notatie is mogelijk verkeerd.... Ik kan me voorstellen dat ie .1 als bitnummer 1 kan handlen, en .<variabele> niet.

Er gaat dat NOG iets fout, omdat ie geen syntax fout geeft.

Vergelijk met de beroemde fout in fortran:
DO5K=1,3
herhaal tot regel vijf met k van 1 tot 3.... hetgeen perongeluk geschreven werd als:
DO5K=1.3
hetgeen de compiler prima vond. Float variable DO5K krijgt de waarde 1.3 prima, watnu?

Hieronder De volledige werkende code (in feite het hele project):

Sterrenhemel.zip

Fouten zijn het bewijs dat je het probeert..