variabel utan ström

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

variabel utan ström

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Till detta använder man den inbyggda EEPROM.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Den verkar ha eeprom minne så då ska det inte vara nåt problem.
Exempel finns i databladet.
Senast redigerad av thepirateboy 9 april 2007, 17:56:24, redigerad totalt 1 gång.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg av Rocky_AL »

men EEPROM kan väl bara skrivas på en gång, sen går det aldrig att radera igen?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

VA? :shock: 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)."
Användarvisningsbild
Kezo
Inlägg: 711
Blev medlem: 28 november 2005, 19:53:12
Ort: Linköping

Inlägg av Kezo »

EEPROM = Electronically Eraseable bla bla bla...
Troro jag iaf, det går iaf att skriva över
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Går att skriva över det antal gg som specas i databladet, oftast ett tiofald gg mer än programmeringsomgångar.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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).
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
Skriv svar