Tonen generen met PIC16F628A

Arco

Special Member

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

pic basic code:


 program Eeprom

' Declarations section 

main:


'   Main program 
  EEPROM_Write(0x05,0x09)
  While True Wend    'Zo blijft de processor hier rondlopen...
end. 
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

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.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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

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

Golden Member

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?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

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.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Tja,

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

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

Golden Member

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

pic basic code:

 EEPROM_Read(0x02) 

Deze werkt gewoon; ik krijg de juiste waarde terug.

Alleen

pic basic code:

EEPROM_Write(0x02,0x03 

in hetzelfde programma doet het nog niet..

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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)

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

Golden Member

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

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

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

avr asm code:

  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?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat programmaatje van je werkt hier perfect...

pic basic code:


 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%)

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

Golden Member

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

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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

Golden Member

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

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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)

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

Golden Member

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.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

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

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik heb 2 eigen routines die je kunt testen:

pic asm code:


'==================================================================================================
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

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

Golden Member

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

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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

pic asm code:


 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%)

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

Golden Member

Compiler loopt stuk op

EEADRL = pAdr
EEDATL = pDat

Hij kent de identifier EEADRL en EEDATL niet.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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

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

Golden Member

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:

pic basic code:

 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. 
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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

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

Golden Member

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

Fouten zijn het bewijs dat je het probeert..