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.
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...)
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?
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)
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)
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).
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%)]
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
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)
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.
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
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%)]
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...
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...
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).