variabel utan ström
variabel utan ström
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
//Daniel A
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Den verkar ha eeprom minne så då ska det inte vara nåt problem.
Exempel finns i databladet.
Exempel finns i databladet.
Senast redigerad av thepirateboy 9 april 2007, 17:56:24, redigerad totalt 1 gång.
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
*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
> ä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).
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).
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:
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.
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
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.
> 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.
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.
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)
(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.
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
Mvh.
> (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 ?
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 ?