Arco

Special Member

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

Dit soort construkties vraagt om problemen. De write blijft nu continu uitgevoerd worden.
(na END 'rent' de MCU door het lege geheugen en begint weer van vooraf aan...)
Altijd een gestructureerd einde aan je programma maken...


 program Eeprom

' Declarations section 

main:


'   Main program 
  EEPROM_Write(0x05,0x09)
  While True Wend    'Zo blijft de processor hier rondlopen...
end. 
Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

He, dat wist ik niet.
Ik had uit de PicBasic cursus begrepen dat End ook daadwerkelijk het einde van het programma was!
Ik meen me ter herinneren dat je juist daarvoor die End moet gebruiken.
Nou, dan doe ik het voortaan zoals jij beschrijft. In feite hou je de processor dus bezig.

Arco

Special Member

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

Wat ik begrepen heb 'knoeit' Picbasic zelf een eindeloze loop in mekaar bij een END... ;)
(ik houd er totaal niet van als compilers op eigen houtje dingen gaan doen...)

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Zoiets zal het vast wel zijn.

Maar ondertussen is het nog steeds vreemd dat EEPROM_Write(0x05,0x09) niet werkt.

De Editor werkt, na de íhex file die hij aanmaakt. Bij compilatie neemt hij deze file mee en de Eeprom wordt keurig geschreven.

Als EEPROM_Write(0x05,0x09) niet werkt, had ik verwacht een foutmelding te krijgen o.i.d. Maar ogenschijnlijk lijkt er niets te gebeuren. Of kijk ik misschien toch ergens overheen?

Deze instructie is toch goed zo?

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Probleem maar even laten rusten.
Met de EEPROM Editor in MikroBasic lukt het gewoon.

Als ik een een getal hoger dan 255 wilt vastleggen, wordt het een Word.
2 bytes dus.
Ik zie dat hij bijvoorbeeld het getal 622 vastlegt als 6E 02.

m.a.w. de MSB rechts. Ik had verwacht dat het als 02 6E zou worden opgeslagen.

Ik moet hier wel rekening mee houden, want wanneer ik het wil inlezen, moet ik het weer converteren naar decimaal.
Daar is zo te zien geen standaard sub voor om weer een decimaal getal te krijgen.

Arco

Special Member

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

Tja,

Da's normaal voor little-endian processors (zoals de pic24/32 en dus ook de kleinere)

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Ik heb inmiddels een proefje genomen met het lezen van de EEprom:

 EEPROM_Read(0x02) 

Deze werkt gewoon; ik krijg de juiste waarde terug.

Alleen

EEPROM_Write(0x02,0x03 

in hetzelfde programma doet het nog niet..

Arco

Special Member

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

Heb je nu wel iets als een WHILE True WEND loop aan het eind?
(anders krijgt de processor misschien de tijd niet om die write fatsoenlijk af te maken)

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Ja, die heb ik op jouw advies aangebracht.

De write opdracht doet gewoon niks. Ik heb sterk het vermoeden dat er ergens een 'write protection' aanwezig is.

Ik las in de datasheets over EECON bits. Maar ik ging ervan uit de Mikro Basic dat allemaal voor me regelt.

Het is jammer dat dit niet werkt, want aan alleen lezen heb je natuurlijk niet veel (Tenzij je altijd alles met de EEprom-Editor inbrengt).

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Ik zag in een vorige post van jou (Arco) een voorbeeld in asm.

  movf    PORTB,0
        movwf   EEDATA        ;EEDATA=poortb
        movlw   00h
        movwf   EEADR         ;EEADR=00h
 
        banksel EECON1        ;schrijven
        bcf     EECON1,EEIF   ;EE write complete flag bit gecleared
        bcf     INTCON,GIE    ;interrupts uitgeschakeld

        bsf     EECON1,WREN   ;write enable
        movlw   055h
        movwf   EECON2
        movlw   0AAh
        movwf   EECON2
        bsf     EECON1,WR     ;schrijf
ee_loop btfsc   EECON1,WR     ;Wacht tot write complete
        goto    ee_loop	
        bcf     EECON1,WREN   ;write disabled
        bsf     INTCON,GIE    ;interrupts terug ingeschakeld
        banksel 0x00          ;geheugenbank 0 

Zou het het proberen waard zijn dit ook toe te passen op mijn omgeving?

Kan ik die asm wellicht ook compileren met Mikro Basic?

Arco

Special Member

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

Dat programmaatje van je werkt hier perfect...


 program Eeprom

' Declarations section 

main:


'   Main program 
  EEPROM_Write(0x05,0x09)
end. 

[Bericht gewijzigd door Arco op woensdag 23 oktober 2019 00:26:13 (59%)]

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Dat is frappant!
Zou er dan toch iets niet goed staan in de project settings?

Arco

Special Member

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..

Ik heb deze Project settings allemaal overgenomen. Geen verschil; de write werkt nog steeds niet.
Ook geen foutmelding, er schijnt gewoon niks te gebeuren op deze instructie.
De EEProm data bijft allemaal 'FF'.

Het enige verschil is dat in jouw (Arco) voorbeeld een P16F1847 is toegepast terwijl ik met een PIC16F1826 werk.

In jouw testopstelling gebruik je waarschijnlijk een extern kristal (vanwege de Oscillator setting)?
Maar ook overschakelen op interne oscillator helpt niets.

Een hardnekkig iets...

Arco

Special Member

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

Moet gewoon werken. De 1847 is identiek aan de 1826 met alleen 4x zoveel geheugen...
Ik gebruik alleen de pickit2, de -3 zal ik eerst op moeten graven. (ik gebruik 'm nooit)

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Ik heb de 1826 even als proef vervangen door een 628A.
Exact hetzelfde verschijnsel: wel kunnen schrijven met de EEprom Editor, maar niet met EEProm_Write.

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

En die assembler codeset? Is dat nog snel te testen?

Arco

Special Member

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

Ik heb 2 eigen routines die je kunt testen:


'==================================================================================================
Sub Procedure EE_Write(Dim pAdr, pDat As Byte)
'==================================================================================================
  EEADRL    = pAdr
  EEDATL    = pDat
  CFGS_bit  = 0
  EEPGD_bit = 0
  WREN_bit  = 1
  Asm
    bcf    intcon,gie
    movlw  0x55
    movwf  eecon2
    movlw  0xAA
    movwf  eecon2
    bsf    eecon1,wr
    bsf    intcon,gie
  End Asm
  WREN_bit  = 0
  While WR_bit Wend
End Sub

'==================================================================================================
Sub Function EE_Read(Dim pAdr As Byte) As Byte
'==================================================================================================
  EEADRL    = pAdr
  CFGS_bit  = 0
  EEPGD_bit = 0
  RD_bit    = 1
  Result    = EEDATL
End Sub

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Maar hoe vertaal ik deze naar .hex?
Kan dat ook via MikroBasic?

Arco

Special Member

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

Die moet je in dat testprogrammaatje kopieeren en gebruiken i.p.v. de standaard routiness voor eeprom.
Is gewoon Mikrobasic code. Dus:


 program Eeprom

'==================================================================================================
Sub Procedure EE_Write(Dim pAdr, pDat As Byte)
'==================================================================================================
  EEADRL    = pAdr
  EEDATL    = pDat
  CFGS_bit  = 0
  EEPGD_bit = 0
  WREN_bit  = 1
  Asm
    bcf    intcon,gie
    movlw  0x55
    movwf  eecon2
    movlw  0xAA
    movwf  eecon2
    bsf    eecon1,wr
    bsf    intcon,gie
  End Asm
  WREN_bit  = 0
  While WR_bit Wend
End Sub

'==================================================================================================
Sub Function EE_Read(Dim pAdr As Byte) As Byte
'==================================================================================================
  EEADRL    = pAdr
  CFGS_bit  = 0
  EEPGD_bit = 0
  RD_bit    = 1
  Result    = EEDATL
End Sub

'==================================================================================================
main:
  EE_Write(0x05,0x09)
  While True Wend    'Zo blijft de processor hier rondlopen...
end. 

[Bericht gewijzigd door Arco op woensdag 23 oktober 2019 23:36:38 (82%)]

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Compiler loopt stuk op

EEADRL = pAdr
EEDATL = pDat

Hij kent de identifier EEADRL en EEDATL niet.

Arco

Special Member

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

Dan is er toch wel wat mis. Dat zijn standaard registers (SFR) die moeten altijd herkend worden.
Het lijkt wel of je het verkeerde processortype hebt ingesteld...

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Ik ben weer teruggegaan naar de 1826 en nu is idd de error weg.

Maar de write werkt nog niet.

Het programma ziet er nu zo uit:

 program EEprom

 '==================================================================================================
Sub Procedure EE_Write(Dim pAdr, pDat As Byte)
'==================================================================================================
  EEADRL    = pAdr
  EEDATL    = pDat
  CFGS_bit  = 0
  EEPGD_bit = 0
  WREN_bit  = 1
  Asm
    bcf    intcon,gie
    movlw  0x55
    movwf  eecon2
    movlw  0xAA
    movwf  eecon2
    bsf    eecon1,wr
    bsf    intcon,gie
  End Asm
  WREN_bit  = 0
  While WR_bit Wend
End Sub

 main:
 OSCCON = %11110000                                                             '32MHz internal
 EE_Write(0x05,0x09)
 delay_ms(20)
 
 while true wend
end. 
Arco

Special Member

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

Hoe doe je dat toch?... ;) (mij lukt 't niet...)
Je hebt toch wel het Vdd On vinkje aangezet? (of een externe voeding gebruikt?)
Anders gaat 't (zonder voedingsspanning) natuurlijk nooit werken...

Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..

Ja, het werkt nu wel!

Hoe simpel kan het zijn...

Je moet in Pickit3 de "Read" knop gebruiken om het nieuwe resultaat te zien.
Pas dan ververst hij het scherm met de inhoud.
(Met de EEPROM-Editor hoeft dat niet).