EEprom


Daarnaast HOEF je niet alles in 1x te schrijven.

Mijn processor heeft een flash-page-size van 1k. Als mijn configuratie block 20 bytes is, dan reserveer ik 32 bytes. De eerste schrijf ik "0xaa" om aan te geven: dit blok is geldig. Als ik nu afspreek met mezelf ik begin aan de onderkant en werk naar boven, dan kan ik bij iedere verandering een nieuw record met de tag en 20 config bytes en 11 lege "reserve" schrijven. Bij het opstarten moet ik van boven naar beneden zoeken naar het laatst geschreven blok. Als ik bij schrijven tegen de bovenkant vastloop moet ik het blok wissen en weer bij het begin beginnen. Zo heb ik 32x minder wis-operaties waar het ding van slijt. Zo kan ik met 10000 gegarandeerde wis-schrijf-cycli minimaal 320000 keer de config opslaan.

In de praktijk schrijf ik het op de eerste locatie en wis ik de boel iedere keer. Makkelijker en de eerste chip die kapot gesleten is moet ik nog tegenkomen.

In een Atmel CPU roepen ze dat de eeprom 100k keer gewist mag worden, terwijl de flash maar 10k keer kan. Als je dan bovenstaande truuk gebruikt zit je met de flash toch ook al boven wat je eeprom aankan. Maar ik ga er gewoon van uit dat ik toch die 10k al niet zomaar ga halen.

[Bericht gewijzigd door rew op 12 mei 2021 11:20:57 (13%)]

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

Kleine pics als de 16F1709 hebben bij flash ook 10k erase/write, maar ook een speciaal deel high endurance flash (HEF) voor parameteropslag.
(Dat is 100k erase/write)

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

Golden Member

Waarom 2 keer dezelfde (lange) tabel?

Van Lambiek wordt goede geuze gemaakt.
Bavelt

Special Member

Op 12 mei 2021 11:55:35 schreef buckfast_beekeeper:
Waarom 2 keer dezelfde (lange) tabel?

Was een kopieer foutje. Is aangepast!

Man is still the most extraordinary computer of all. JF Kennedy
Bavelt

Special Member

Ik koos voor een 24LC64. Niet echt onderbouwd, maar omdat ik het ding tegenkwam in een voorbeeld. Het is nog onwaarschijnlijk goedkoop: € 0,53 voor een DIP uitvoering bij Farnell.

Het ding is 64K groot.

Is er nog een ander populair type? Of maakt het gewoon niet uit als je geen hoge eisen stelt aan snelheid, etc?

Man is still the most extraordinary computer of all. JF Kennedy
www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook oud en exotisch
bprosman

Golden Member

Op 12 mei 2021 13:08:14 schreef fred101:
[...]
RRAM gaat nog langer mee (MRAM in het Engels) :)

Klopt maar die zijn er niet voor 3 Euro in een 8 pinnertje :-)

De jongere generatie loopt veel te vaak zijn PIC achterna.

Meestal is 100k endurance voor 'normale' toepassingen toch wel genoeg... ;)

Ik gebruik meestal de 24LC256 als ik een externe parameteropslag nodig heb. (bijna net zo duur als de 64)
Voor snelle dataopslag een SD card of een IS25 flash van ISSI.
(is in 8Mbit ook net zo duur: https://eu.mouser.com/ProductDetail/ISSI/IS25LP080D-JNLE?qs=pif5%252B9…)

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

Op 12 mei 2021 12:48:28 schreef Bavelt:
Is er nog een ander populair type?

Ik heb hier een paar w25Q32 liggen. 8Mbyte, (32Mbit) voor ongeveer de helft van wat jij voor 512x minder betaalt.... Maar goed. Dat is dan niet bij Farnell vandaan. (maar ook de betrouwbare chinese onderdelen leverancier heeft ze en daar kosten ze niet veel meer dan een halve dollar).

[Bericht gewijzigd door rew op 12 mei 2021 14:25:58 (17%)]

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

De IS25 kost ook nog geen halve euro per 100, en dat bij een 'gewone' leverancier... : https://www.arrow.com/en/products/is25lp080d-jnle/integrated-silicon-s…
Makkelijk is dat die IS25 een ingebakken uniek serienummer heeft...

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

Special Member

Raar, (voor mij althans)

Waarom mag dit wel:

pic basic code:



Inh[u1][0].i1 = 0

Maar dit niet:

pic basic code:



Dim TstBit As bit
Inh[u1][0].i1 = TstBit
Man is still the most extraordinary computer of all. JF Kennedy

Geen idee, ik gebruik ze nooit. (multidimensional arrays wordt bijna altijd een onoverzichtelijk zooitje in een programma)

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

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

Special 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? :?

Man is still the most extraordinary computer of all. JF Kennedy

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

Special 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

Man is still the most extraordinary computer of all. JF Kennedy

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 14 mei 2021 13:28:22 (76%)]

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

Special 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

:?

Man is still the most extraordinary computer of all. JF Kennedy

Hoe zijn alle variabelen gedeclareerd?

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

Special Member

De variabelen:

pic basic code:


 Dim
    Rw           As Byte
    Inh          As Byte [8][8]
    Cnt1         As Byte
    TstBt        As Bit
    Ltmp         As Byte
Man is still the most extraordinary computer of all. JF Kennedy

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 en software ontwikkeling: www.arcovox.com
Bavelt

Special 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
Man is still the most extraordinary computer of all. JF Kennedy
Bavelt

Special 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:

Man is still the most extraordinary computer of all. JF Kennedy
Bavelt

Special 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

Man is still the most extraordinary computer of all. JF Kennedy