Sida 1 av 1
Skriva till eeprom fungerar ej
Postat: 29 oktober 2007, 13:42:25
av Rocky_AL
Försöker skriva till det inbyggda eepromet i min pic16f887 men det fungerar inte.
Jag har kopierat koden från databladet men får det ej att fungera.
Kod: Markera allt
BANKSEL EEADR
movlw 0x04
movwf EEADR
movlw 0x23
movwf EEDAT ;skriver 0x23 till adress 0x04
BANKSEL EECON1
bcf EECON1,EEPGD ;pekar till dataminne
bsf EECON1,WREN ;tillåter skrivningar till eeprom
bcf INTCON,GIE ;stänger av interrupts
btfsc INTCON,GIE
goto $-2
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR ;Startar skrivningen
bsf INTCON,GIE ; tillåter interrupts
sleep
bcf EECON1,WREN ;skrivning till epprom inte längre tillåtet
bcf INTCON,GIE ;stänger av interrupts igen (använder inga interrupts i programmet)
Programmet fastnar på sleep. Jag har även i mplabs simulator kollat på eepromet men inget händer där heller, alla adresser innehåller bara värdet 0xFF.
Vad kan vara felet?
Postat: 29 oktober 2007, 14:01:41
av sodjan
> Programmet fastnar på sleep.
Hur vet du att den fastnar just där ?
> Jag har även i mplabs simulator kollat på eepromet
Jag skulle i och för sig gissa att EEPROM skrivningar kan simuleras,
men jag är inte 100% säker...
Du skulle även kunna prova med att polla EEIF istället för att
köra med SLEEP, ifall det faktiskt är något problem med "uppvaknandet"...
Postat: 29 oktober 2007, 14:10:57
av Rocky_AL
Hittills har jag bara kört programmet i mplabs simulator. Anledningen till att jag vet att den fastnar på sleep är för att när jag låtit programmet köra en stund och sedan trycker på pause så är den gröna pilen, som visar var i programmet man är, fortfarande kvar på sleep.
Jag tog för givet att man kunde simulera eeprom skrivningar eftersom det finns en tabell med detta under "view"
Postat: 29 oktober 2007, 14:21:48
av sodjan
OK, jag förstår.
Som sagt, jag är inte 100% säker att EEPROM fungerar i MPSIM, men
jag skulle förvänta mig att deet gör det...
Dessutom, när du säger "programmet fastnar på sleep", så *tala om*
att det är i MPSIM, och inte "på riktigt"...
Men kör in det på en PIC och kolla !
Postat: 29 oktober 2007, 14:47:23
av Rocky_AL
Provade att lägga in koden på picen och mycket riktigt så fryser den med. Jag vet för att direkt efter den har skrivit till eepromet så startar jag en display. (Displayen fungerade aldeles utmärkt innan jag lade in eepromskrivningen)
Postat: 29 oktober 2007, 15:12:33
av sodjan
OK, bra (eller inte bra kanske...

)
Jag skulle tetsa med en loop istället för sleep...
Postat: 29 oktober 2007, 15:47:52
av Rocky_AL
Provade med en loop som kollade EEIF istället för att köra med sleep. Det var mycket bättre. Men nu har jag fått ett nytt problem istället. När jag läser av eepromet så får jag bara värdet 0x00.

vilket är mycket märkligt eftersom jag har eeprom tabellen uppe i simulatorn och ser att värdet minsan inte alls är noll.
så här ser koden ut:
Kod: Markera allt
movf NUM_POS,W ;num_pos är vilken adress som skall läsas av.
BANKSEL EEADR
movwf EEADR
BANKSEL EECON1
bcf EECON1,EEPGD
bsf EECON1,RD ;läs...
BANKSEL EEDAT
movf EEDAT,W ;lägg datan i w-reg.
incf NUM_POS,F
Postat: 29 oktober 2007, 16:58:32
av v-g
Den gången jag skulle testa att använda EPROM körde jag exemplet rakt ur manualen och det fungerade direkt. Kanske du skulle kolla i manualen om inte manualen för just din har så kan du kolla på en annan i serien.
Postat: 29 oktober 2007, 18:06:58
av Rocky_AL
Jo man kan ju alltid kolla i en annan manual men jag har ju faktiskt tagit read delen rakt ur databladet och skrivdelen har jag tagit där ifrån också (utom sleep delen).
När jag kör programmet i simulatorn så ser jag ju i eeprom tabellen att värdena ändrar sig till det jag satt dem till, så skrivdelen verkar iaf fungera.
Kan det vara något med min config?
Kod: Markera allt
__CONFIG _CONFIG1, _CP_OFF & _LVP_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _WRT_OFF
Edit: Nu blir jag arg på mig själv! Efter ett otal simuleringar så upptäckte jag att allt eepromskrivande/läsande fungerade aldeles utmärkt. Problemet var att jag nästan direkt efter att ha sparat eepromdatan i w-reg, sparade något annat i w-reg... En liten rad hade försvunnit där datan skulle sparas i en variabel. Men eftersom den variabeln var 0x00 från början och inget sparades i den så blev resultatet alltid 0x00.
Här är en bild på eländet:
http://img113.imageshack.us/img113/7673/disp2iz6.jpg
Sodjan: Har du något datablad till displayen på bilden. Det var 4x20 LCDn som jag köpte av dig för några dagar sen. Vet inte riktigt vilken spänning jag ska köra på bakrundsbelysningen (kör med 4,2V nu)
Postat: 29 oktober 2007, 19:02:25
av sodjan
> Vet inte riktigt vilken spänning jag ska köra på bakrundsbelysningen
Inge alls. Precis som för *ALLA* lysdioder !
Öka strömmen tills du får en behaglig bakgrund.
Det brukar ligga på ett par 100 mA på de flesta displayer.
Postat: 30 oktober 2007, 16:31:01
av PHermansson
Är väl bara att koppla som vanligt? Bilden visar parallellport men det har ingen betydelse här.

Postat: 30 oktober 2007, 16:35:56
av sodjan
Jo, med reservation för att ett par hundra mA kan vara lite
väl mycket för en vanlig pot. Dessutom, som det är kopplat, så
kan man vrida potten i botten och i princip kortsluta backlighten...