Sida 1 av 3
variabel utan ström
Postat: 9 april 2007, 17:47:42
av squiz3r
Hej jag skulle behöva lagra en variabel till en PIC12F629 så att den inte försvinner om strömmen försvinner. Kan man göra det med en PIC eller måste jag ha något externt minne?
//Daniel A
Postat: 9 april 2007, 17:53:39
av Icecap
Till detta använder man den inbyggda EEPROM.
Postat: 9 april 2007, 17:53:40
av thepirateboy
Den verkar ha eeprom minne så då ska det inte vara nåt problem.
Exempel finns i databladet.
Postat: 9 april 2007, 17:56:11
av Rocky_AL
men EEPROM kan väl bara skrivas på en gång, sen går det aldrig att radera igen?
Postat: 9 april 2007, 17:57:16
av squiz3r
VA?

Då funkar det inte för mig... Men jag har ett extern eeprom det går att skriva över
Edit: Från databladet "A byte write automatically erases the location and
writes the new data (erase before write)."
Postat: 9 april 2007, 17:59:27
av Kezo
EEPROM = Electronically Eraseable bla bla bla...
Troro jag iaf, det går iaf att skriva över
Postat: 9 april 2007, 18:07:16
av Icecap
Går att skriva över det antal gg som specas i databladet, oftast ett tiofald gg mer än programmeringsomgångar.
Postat: 9 april 2007, 18:14:20
av squiz3r
Okej, nu har jag läst det kappitlet i data bladet, så när man ska skriva gör man ungefär såhär(?):
*Byt till bank 1
*lägg 8bitars data i "eedata" registret
*vad för addres ska man sen lägga i "eeadr" registret?? är alla platser i eepromet ledigt från börjag så att man kan skriva tex. 1 i bin format?
*sätt bit 1 i eecon1 hög för att skriva
*sätt bit 3 i eecon hög för att kuna skriva
och sen?
//Daniel A
Postat: 9 april 2007, 18:31:47
av Icecap
Sen gör man precis som databladet beskriver: väntar till det är sparat klar, om du har fler bytes sparar du dom en efter en.
När du ska kalla fram dom efter power-on/reset är det samma sak fast inte skriva men LÄSA till RAM, sedan är det bara att köra.
Postat: 9 april 2007, 18:31:54
av Marta
Läs databladet en gång till, det krävs lite mer för att kunna skriva. Dessutom verkar Du ha fått det lite bakvänt med bitarna i EECON1
Postat: 9 april 2007, 23:19:31
av sodjan
> är alla platser i eepromet ledigt från början... ?
Ja.
> så att man kan skriva tex. 1 i bin format?
Vad är "bin format" ??
Du kan naturligtsvis välja att ange dina värden
i *koden* i vilket format du vill. För en *PIC* är dock
alla värden *ALLTID* binära, så det är inte så tydligt
vad du menar...
> *sätt bit 1 i eecon1 hög för att skriva
> *sätt bit 3 i eecon hög för att kuna skriva
Ganska ointressant vilka *nummer* bitarna har!
Använd *namnen* på bitarna så blir det färre missförstånd!
T.ex med "bit 1", menar du då andra eller första biten?
Notera också intervallen för EEPROM refresh, om du kommer ett
skriva många gånger. Det är ofta lite svårt att förstå i början hur
det hänger ihop.
Dessutom bör man komma ihåg att hela EEPROM minnet raderas
när man programmerar om programmet och där det görs en
erase all samtidigt (vilket är det normala).
Postat: 18 mars 2008, 12:54:06
av squiz3r
Hej igen.. Jag skulle använda EEprom minnet i en PIC12F629 nu och det vill inte fungera.. Jag har fått det att fungera med en 16F877A sen har jag ändrat koden lite så att den stämmer med databladet för 629.
Koden:
Kod: Markera allt
list p=12F629
radix dec
include "p12f629.inc"
__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ;Internal osc.
;globals
;this is the first available file (20h)
delay_var1 equ 20h
delay_var2 equ 21h
delay_var3 equ 22h
flags equ 23h
pos_1 equ 24h
pos_2 equ 25h
servo_pos equ 26h
speed equ 27h
counter1 equ 28h
; define flags
#DEFINE flag1 flags, 0 ;**************************
#DEFINE var2 flags, 1 ;
#DEFINE var3 flags, 2 ;
#DEFINE var4 flags, 3 ;Define a name on each flag.
#DEFINE FLAG5 flags, 4 ;
#DEFINE FLAG6 flags, 5 ;
#DEFINE FLAG7 flags, 6 ;
#DEFINE FLAG8 flags, 7 ;**************************
; bits on GPIO
#define LED1 GPIO,5 ;GP0
#define LED2 GPIO,4 ;GP1
#define ____ GPIO,3 ;GP2
#define servo GPIO,2 ;GP3
#define sw2 GPIO,1 ;GP4
#define sw1 GPIO,0 ;GP5
Start org 0x0000 ;program starts at location 000
nop
nop
nop
nop ;NOPs to get past reset vector address
nop
nop
movlw 07h ;sett IO's to digital pinns.
movwf CMCON
SetUp bsf STATUS, RP0 ;Bank 1
movlw b'10000110' ;Turn off T0CKI, prescale for TMR0 = 1:128
movwf OPTION_REG
movlw b'00000011' ;Set GP0, GP1 (sw1, sw2) to input, all other to outputs.
movwf TRISIO
;calibrating the internal oscillator
call 0x3ff ;get the calibration value
movwf OSCCAL ;calibrate oscillator
bcf STATUS, RP0 ;bank 0
clrf GPIO ;Clear GPIO of junk
; Write pos_2 to EEprom
banksel EEDATA
movlw d'40'
movwf EEDATA
banksel EEADR
movlw d'2'
movwf EEADR
banksel GPIO
call write_EEprom
banksel GPIO
call pause
; Read pos_2 from EEprom
banksel EEADR
movlw d'2'
movwf EEADR
call read_EEprom
banksel EEDATA
movfw EEDATA
banksel GPIO
movwf pos_2
; Write pos_1 to EEprom
banksel EEDATA
movlw d'20'
movwf EEDATA
banksel EEADR
movlw d'56'
movwf EEADR
banksel GPIO
call write_EEprom
banksel GPIO
call pause
; Read pos_1 from EEprom
banksel EEADR
movlw d'56'
movwf EEADR
call read_EEprom
banksel EEDATA
movfw EEDATA
banksel GPIO
movwf pos_1
goto main
;*********************** START OF PROGRAM ****************
main
movfw pos_1
addlw -d'20'
btfsc STATUS,Z
bsf LED1
goto main
write_EEprom
banksel EECON1
test_EE BTFSC EECON1,WR ;Wait for write
GOTO test_EE ;to complete
BSF EECON1,WREN ;Enable writes
banksel INTCON
BCF INTCON,GIE ;Disable INTs.
banksel EECON2
MOVLW h'55' ;
MOVWF EECON2 ;Write 55h
MOVLW h'AA' ;
MOVWF EECON2 ;Write AAh
BSF EECON1,WR ;Set WR bit to begin write
BCF EECON1,WREN ;Disable writes
banksel GPIO
return
read_EEprom
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movfw EEDATA
banksel GPIO
return
;***********************************************
pause movlw d'20' ;*************************************
movwf delay_var1 ;gör en kort pause
pause2 decfsz delay_var1,d'1' ;
goto pause2 ;
return
END
Det jag ska göra är att spara d'40' till platts 2 i EEprom'et och sedan läsa det och lägga i variabeln pos_2. Sen lägger jag d'20' på platts 56 och läser det och sparar i variabeln pos_1. (onödigt, men det är bara för att jag ska få igång EEpromet).
I main kollar jag sedan vilket värde det ligger i de två variablerna och visar på en LED. Resultatet blir att jag får d'40' i båda variablerna.. Antar att det är något logiskt fel jag har gjort för jag har testat med ett antal processorer och det är samma på alla.. Men jag har försökt i ca. 4timmar nu utan framgång..
Är det någon som kan se om jag har gjort fel någonstans?
Mvh.
Postat: 18 mars 2008, 16:21:33
av sodjan
> Det jag ska göra är att spara d'40' till platts 2 i EEprom'et...
OK, gör ett litet testprogram som *bara* gör det. Nu är det så mycket kod
så få orkar sannolikt att läsa igenom det. Hur du ska göra för att skriva till
EEPROM framgår av kapitlet om EEPROM i databladet. Det finns kompletta
kodexempel, om jag inte minns fel.
Postat: 18 mars 2008, 16:57:58
av squiz3r
Sodjan: Jo.. Jag har läst igenom det kapptilet ett par ggr, och detta är mer eller mindre deras exempel rakt av..
Här är förkortad kod som bara skriver d'40' på platts 2 och sedan läser det. (bättre komenterad)
Kod: Markera allt
; Write pos_2 to EEprom
banksel EEDATA ;Flytta d'40' till EEDATA registret.
movlw d'40'
movwf EEDATA
banksel EEADR ;Flytta d'2' till EEADR (d'40' ska sparas till platts 2)
movlw d'2'
movwf EEADR
banksel GPIO
call write_EEprom ;Ropa på subrutin som skriver till EEprom'et.
banksel GPIO
call pause ;En kort pause på några uS..
; Read pos_2 from EEprom
banksel EEADR ;Flytta d'2' till EEADR (läs platts 2)
movlw d'2'
movwf EEADR
call read_EEprom ;Ropa på subrutin som läser EEprom'et.
banksel EEDATA
movfw EEDATA ;flytta till variabeln "pos_2".
banksel GPIO
movwf pos_2
;****** Subrutiner ************************
write_EEprom
banksel EECON1
test_EE BTFSC EECON1,WR ;Wait for write
GOTO test_EE ;to complete
BSF EECON1,WREN ;Enable writes
banksel INTCON
BCF INTCON,GIE ;Disable INTs.
banksel EECON2
MOVLW h'55' ;
MOVWF EECON2 ;Write 55h
MOVLW h'AA' ;
MOVWF EECON2 ;Write AAh
BSF EECON1,WR ;Set WR bit to begin write
BCF EECON1,WREN ;Disable writes
banksel GPIO
return
read_EEprom
banksel EECON1
bsf EECON1,RD ;Läs av adress som ligger i EEADR registret.
banksel EEDATA
movfw EEDATA ;Plocka upp datan som lästes och lägg i w-registret.
banksel GPIO
return
(Men om jag bara gör såhär så fungerar det. Det är när jag ska skriva ett till värde så blir det man skriver sisst samma som det man skrev först..)
Mvh.
Postat: 18 mars 2008, 17:52:56
av sodjan
> (Men om jag bara gör såhär så fungerar det. Det är när jag ska skriva ett till värde så blir det man skriver sisst samma som det man skrev först..)
OK.
Du får jämföra koderna, speciellt där du skriver till EEDATA.
Och också se till att du gör rätt då du läser från EEPROM,
så du inte lurar dig själv på något sätt. Hur vet du att
båda värderna blir lika ?