Sida 1 av 1
PIC: Skriva till EEPROM
Postat: 17 oktober 2008, 22:16:40
av persika
Får inte det att funka att skriva till EEPROM i PIC16f688
Någon som har falkögon o ser vad jag gör för fel.
Har hämtat mesta av nedanstående kod från databladet.
Kod: Markera allt
Lagra_EEPROM ; PIC 16f688
;
; indata:
; (FSR), data
; rgE, adress
;
; utdata:
;
; register som ändras:
;
; PC-stackanvändning: 0
;
movf rgE, w
banksel eeadr
movwf eeadr ; data memory address to write
movf INDF, w
movwf eedat ; data memory value to write
banksel eecon1
bcf eecon1, eepgd ; point to data memory
bsf eecon1, wren ; enable writes
see_ioff
bcf intcon, gie ; disable ints. see an576
btfsc intcon, gie
goto see_ioff
movlw 055h
movwf eecon2 ; write 55h
movlw 0aah
movwf eecon2 ; write aah
see_vnt
bsf eecon1, wr ; set wr bit to begin write
btfsc eecon1, wr ; när bit=0 då är skrivning klar
goto see_vnt
bsf intcon, gie ; enable ints.
bcf eecon1, wren ; disable writes
bcf status, RP0 ; bank 0
return
Postat: 17 oktober 2008, 23:51:28
av sodjan
Vad händer och vad händer inte ?
Hur vet du att det inte fungerar ?
Sen så är det tveksamt om du ska sätta WR hela tiden.
Flytta ner labeln see_vnt en rad...
Postat: 18 oktober 2008, 08:50:16
av persika
> Flytta ner labeln see_vnt en rad...
Det var min mening att bara läsa av biten WR i den lilla slingan, inte 1-ställa den hela tiden, men det blev fel nattens sena timma.
Har ändrat det nu, men funkar ändå inte.
Hur vet jag det ?
Jag lägger in data i eepromet via källkoden så här:
Kod: Markera allt
;------------------------------------------------------
; initialize eeprom locations
ORG 02100h
; eeUppDatTid,
DE 00Ah, 000h
; eeStegMotorVarv
DE 0C8h, 000h
; eeDistTempFaktor
DE 0E8h, 003h, 000h
END ; directive 'end of program'
Sedan läser jag av det med hjälp av denna rutin:
Kod: Markera allt
;-------------------------------------------------------------
Läs_EEPROM
;
; indata:
; rgE, EEadress
; utdata:
; w=EEdata
;
; register som ändras:
;
; PC-stackanvändning: 0
;
;{
movf rgE, w
banksel EEADR
movwf EEADR ;Data Memory Address to read
bcf EECON1, EEPGD ;Point to DATA memory
bsf EECON1, RD ;EE Read
movf EEDAT, w ;W := EEDAT
bcf status, RP0 ; bank 0
return
;}
;-------------------------------------------------------------
De hämtade datana skickar jag sedan vidare seriellt, och kan se i hyper terminalen:
Kod: Markera allt
S T C -01
Temp : 207 x0.1 deg.C
Pos : -2098243 um
1: Update time 10 sec
2: Motor 200 step/turn
3: MoveTemp coeff 1000 um/deg.C
4: Move to ??? um
Select 1-4 <enter>
Funkar fortfarande inte att skriva till eepromet, vad jag kan se, fattar inte varför..
Fick en tanke, om config har betydelse,
så jag ändrade _CPD_ON till _CPD_OFF
Kod: Markera allt
errorlevel -203, -204, -205, -206, -207, -302
list p=16f688 ; list directive to define processor
#include <p16f688.inc> ; processor specific variable definitions
__CONFIG _CP_ON & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _EC_OSC
Samma sak funkar forfarande inte.
Känns som jag provat allt snart....
Postat: 18 oktober 2008, 09:52:28
av persika
Har meckat vidare här..
Ändring av _CPD_OFF hade ingen inverkan.
Jag gjorde en liten fuling och lade in i rutinen Lagra_EEPROM att sända ut innehållet i eeadr och eedat på serieport, så kunde jag se det verkliga innehållet. Det visade sig att de gamla värdena lagrades igen, inte de nya, därför såg det ut som att rutinen Lagra_EEPROM inte funkade, nu har jag rättat till indata o nu funkar allt så fint, så här långt i programmet.
Lätt hänt att snöa in o tro att felet är på ett visst ställe.
Men, kanske bra ändå med det här problemet, det gav ju en databladsläsande som kan vara nyttigt. Bla om att stänga av interrupt.
Postat: 18 oktober 2008, 10:31:09
av sodjan
> kanske bra ändå med det här problemet, det gav ju en databladsläsande som kan vara nyttigt.
Det där är i fel ordning. Bättre att läsa på först...
Postat: 18 oktober 2008, 11:16:47
av vfr
Japp, självklart är det det! Men det gav ändå en del nyttiga insikter i sista änden. Bra att du hittade felet, Persika! Speciellt på egen hand och med hjälp av databladen.

Postat: 30 oktober 2008, 11:59:07
av persika
Ofta läser jag för snabbt i databladen, lätt att hoppa över nån detalj, borde sätta sig "ner", men då skulle man haft det utskrivet på papper
Postat: 30 oktober 2008, 15:02:39
av wombat
Definitivt bäst att ha på papper!
Jag skriver ut (dubbelsidigt) och ringbinder.
Lite über kanske, men sjukt praktiskt.
Jag tror jag läst 10F2XX-häftet 3-4 gånger från pärm till pärm.
Gjort hundöron på var och varannan sida och gått på med rödpenna
på allt som verkar kritiskt/viktigt. (Ändå fanns/finns det små saker jag missat.)
Guld att ha vid sin sida när man sitter och kodar, eller när man inte kan somna på naturlig väg!
/Wombat
Postat: 30 oktober 2008, 15:15:32
av sodjan
På papper är bra när man måste läsa på något nytt.
T.ex de 1-2 första PIC som man använder alls. Eller
när man switchar till en ny arktiektur PIC16->PIC18 t.ex.
Sedan är det väldigt mycket upprepningar och när man
vet vad man ska leta efter och vad man kan förvänta sig
att hitta i databladet så fungerar PDF på skärmen utmärkt.
Jag har nog inte printat något datablad på flera år. Kanske
att man skiver ut ett visst *kapitel* (t.ex USB om man tänker
börja me det) och läser det lite mer i lugn och ro...