PIC16F690, skriva till EEPROM

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

Hej igen!

Ja då var det dags för mina dumma frågor igen.....

Jag har testat att försöka få skriva (och läsa men skrivningen behöver ju fungera först så jag ser att jag får ut annat än FF (då jag tittar på en byte)) till EEPROM att fungera. Jag satt och simulerade det hela via MPLAB SIM och när jag där tittar på resultatet i EEPROM så innehåller det hela tiden FF på alla adresser, ja även efter mina skrivförsök till EEPROM.

Efter mycket felsökande så hittade jag något fel i koden men ändå fick jag det inte att fungera, då valde jag att skicka ut det till min krets som jag har uppkopplat på labbplattan och döm om min förvåning när jag där får det resultatet som jag vill ha på mina dioder. Jag har kopplat upp 8 dioder som representerar den byte data på den adress jag försöker skriva och läsa till. Det borde ju betyda att min skrivning (och läsning) till EEPROM fungera.

Jag provade i ett tidigare skede att lägga ut koden på dioderna men då var det alltid alla 8 dioder som lös (FF hex) så då fungerade det som sagt inte, men sedan hittade jag några misstag av mig i koden och när jag nu ändrar vad jag skriver in för data och sedan läser ut och matar ut resultatet på dioderna så ändras det vilka dioder som lyser så den biten "måste" ju stämma.

Jag borde ju göra något fel, antingen när jag simulerar eller om det finns grodor i min kod, är det någon som känner igen fenomenet?
Koden kommer här (det är lite expriment-kod och ja jag vet att jag inte skall köra goto $-2 till exempel men jag plankade det som stog i databladet för microchip för att få det att fungera, men jag skall snygga till det nu när det fungerar på min platta) (jag har lagt 5 minuter på att snygga till indragningen då jag alltid kör tab i MPLAB, lär mig aldrig att köra mellanslag där, men ser att det inte är helt snyggt här.....):

Kod: Markera allt

  list      p=16f690
#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

my_vars        udata_shr
Display	  	res 1					; Variabel för att tända LED'arna
Data_ee_addr	res 1
Data_ee_data	res 1

		org		0000
		goto  	Init

		org		0004
		goto	  Inter

Init:
		movlw		0x0f
		movwf		Data_ee_data
		movlw		0x00
		movwf		Data_ee_addr


		clrf	   	Display			; Nollställer Display
		banksel		TRISA			; Gör det möjligt att ställa in TRISX
		movlw	  	b'00110100'		; RA2 = Interrupt, RA4 = Högerknapp (uppväxling), RA5 = Vänsterknapp (nedväxling), resten utgångar
		movwf	  	TRISA
		clrf	   	TRISB			; Alla RBx är utgångar
		clrf	   	TRISC			; Alla RCx är utgångar
		banksel		ANSEL
		clrf	   	ANSEL
		clrf	   	ANSELH

		banksel		OPTION_REG
		bsf		 	OPTION_REG, INTEDG	; Interrupt på rising edge
;		bcf			OPTION_REG, INTEDG	; Interrupt på falling edge

		banksel		INTCON
		bcf		 	INTCON, INTF	; Nollställer External Interrupt Flaggan
		bsf		 	INTCON, GIE		; Enablar GIE
		bsf		 	INTCON, INTE	; Enablar External Interrupts

		call	   	Skriv_ee

Start:
		goto	   	Start

Skriv_ee:
		banksel		PIR2
		bcf	 		PIR2, EEIF
		movf	   	Data_ee_addr, w
		banksel		EEADR
		movwf	  	EEADR
		clrf	   	EEADRH
		movf	   	Data_ee_data, w
		banksel		EEDAT
		movwf	  	EEDAT
		clrf	   	EEDATH
		banksel		EECON1
		bcf	 		EECON1, EEPGD
		bsf	 		EECON1, WREN
		banksel		INTCON
		bcf	 		INTCON, GIE
		btfsc	  	INTCON, GIE
		goto	   	$-2
		banksel		EECON2
		movlw	  	0x55
		movwf	  	EECON2
		movlw	  	0xAA
		movwf	  	EECON2
		bsf	 		EECON1, WR
		nop
		nop
		nop
		nop
		nop
		banksel		INTCON
		bsf		 	INTCON, GIE
		nop
		nop
		nop
		nop
		banksel		EECON1
		bcf		 	EECON1, WREN
		return

Inter:
		btfsc		PORTA, 4		; kontrollerar om högerknapp är uppe
		goto	 	Knapp_oka		; nu är den nedtryckt
		btfsc		PORTA, 5		; kontrollerar om vänsterknapp är uppe
		goto	 	Knapp_minska	; nu är den nedtryckt
		goto	 	Inter

Knapp_oka:
;		incf		Display, f
;		movf		Display, w
		banksel		EEADR
		movf	   	Data_ee_addr, w
		movwf	  	EEADR
		banksel		EECON1
		bcf	 		EECON1, EEPGD
		bsf	 		EECON1, RD
		banksel		EEDAT
		movf	   	EEDAT, w

		movwf	 	 PORTC
		bcf	 		INTCON, INTF
		RETFIE

Knapp_minska:
		decf	  	Display, f
		movf	  	Display, w
		movwf	 	PORTC
		bcf			INTCON, INTF
		RETFIE		

end
//Ulf L.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690, skriva till EEPROM

Inlägg av sodjan »

Enligt MPSIM dokumentationen så ska EEPROM vara fullständigt simulerat.
Om den är skriven enligt dokumentationen så borde det fungera.
Jag har inte testkört din kod, men vad är det som går fel ?

Det var inte helt tydligt om du försöker titta direkt på EEPROM adresserna
eller om du försöker göra en vanlig EEPROM läsning och sedan tittar
på den register där det tillbakalästa ligger.
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

När jag simulerar koden och jag väljer att titta på värdena på EEPROM (jag sitter inte vid rätt dator så jag ser menyerna nu men det är där man väljer Watch etc. så kan man ju även välja att titta på EEPROM), så skrivs detr aldrig in något nytt värde på den adress som jag försöker skriva till utan alla adresser som man ser står på FF hela tiden.
Jag provade skriva in olika datavärden på olika adresser men det visade hela tiden bara FF, oavsett data och adress.

Jag skall försöka hinna snygga till koden ikväll och kommentera den så postar jag den på nytt.

//Ulf L.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690, skriva till EEPROM

Inlägg av sodjan »

OK.
Och som vanligt, gör ett minimalt test-case som enbart t.ex innehåller
en skrivning till EEPROM och simulera det. Det blir väl bara 10-12
instruktioner eller så. Det underlättar också för den som vill
kolla koden.
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

Nu har jag tagit bort i princip allt onödigt i koden, det sista jag tog bort var den del som skrev ut det till mina dioder som jag nämnde tidigare så nu ser jag inte att det fungerar på labbplattan....
Men det fungerade tills jag tog bort det sista.
Kör jag och simulerar dessa rader så ser jag som sagt inte att något händer i EEPROM fönstret, där står bara FF på alla adresspositioner hela tiden.
(MPLAB IDE 8.80.00.00)

Kod: Markera allt

  list      p=16f690
#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

my_vars     udata_shr
Data_ee_addr	res 1				; Variabel för EEPROM-adressen
Data_ee_data	res 1				; Variabel för EEPROM-datan

		org		0000
		goto	  Skriv_ee

Skriv_ee:
		movlw		  0x08
		movwf	  	Data_ee_addr
		banksel		EEADR
		movwf	  	EEADR			; Flyttar W till EEADR
		clrf	   	EEADRH			; Nollställer delar av övre byten i EEADR
		movlw	  	0x55
		movwf	  	Data_ee_data
		banksel		EEDAT
		movwf	  	EEDAT			; Flyttar W till EEDAT
;		clrf	  	EEDATH			; osäker på om denna del används......
		banksel		EECON1
		bcf	 		EECON1, EEPGD	; Använder dataminnet
		bsf	 		EECON1, WREN	; Tillåter att man skriver till EEPROM
		banksel		INTCON
		bcf	 		INTCON, GIE		; Stänger av interrupt
		btfsc	  	INTCON, GIE		; Testar att det är avstängt
		goto	   	$-2				; Hoppar tillbaka ifall det inte är avstängt
		banksel		EECON2			; Säkerställer att jag är i rätt bank
		movlw	  	0x55			; Sekvensen som måste användas enligt databladet
		movwf	  	EECON2			; Sekvensen som måste användas enligt databladet
		movlw	  	0xAA			; Sekvensen som måste användas enligt databladet
		movwf		  EECON2			; Sekvensen som måste användas enligt databladet
		bsf		 	EECON1, WR		; Sekvensen som måste användas enligt databladet
		banksel		INTCON
		bsf	 		INTCON, GIE		; Slår på interrupten igen
		banksel		EECON1			
		bcf		 	EECON1, WREN	; Tillåter ej längre skrivning till EEPROM

Las_ee:
		movf	   	Data_ee_addr, w	; Lägger min EEPROM-adress i W
		banksel		EEADR
		movwf	  	EEADR			; Flyttar W till EEADR
		banksel		EECON1
		bcf		 	EECON1, EEPGD	; Använder dataminnet
		bsf		 	EECON1, RD		; Initierar läsning
		banksel		EEDAT
		movf	   	EEDAT, w		; Flyttar värdet jag läst ut till W

end
//Ulf L.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690, skriva till EEPROM

Inlägg av sodjan »

Få se om jag hinner lyfta in det i MPLAB senare i kväll och testa lite...
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

Jag läste igenom databladet igen och upptäckte ett fel jag hade i koden rörande EEADRH, det skall jag ju inte använda till dataminnet.
(EEDATH hade jag sedan tidigare kommenterat bort)
Tyvärr gjorde det ingen skillnad när jag tog bort EEADRH-raden.

Måste rusa till träningen nu men senaste koden är följande:

Kod: Markera allt

  list      p=16f690
#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

my_vars     udata_shr
Data_ee_addr   res 1            ; Variabel för EEPROM-adressen
Data_ee_data   res 1            ; Variabel för EEPROM-datan

      org      0000
      goto     Skriv_ee

Skriv_ee:
      movlw        0x08
      movwf        Data_ee_addr
      banksel      EEADR
      movwf        EEADR         ; Flyttar W till EEADR
      movlw        0x55
      movwf        Data_ee_data
      banksel      EEDAT
      movwf        EEDAT         ; Flyttar W till EEDAT
      banksel      EECON1
      bcf          EECON1, EEPGD   ; Använder dataminnet
      bsf          EECON1, WREN   ; Tillåter att man skriver till EEPROM
      banksel      INTCON
      bcf          INTCON, GIE      ; Stänger av interrupt
      btfsc        INTCON, GIE      ; Testar att det är avstängt
      goto         $-2            ; Hoppar tillbaka ifall det inte är avstängt
      banksel      EECON2         ; Säkerställer att jag är i rätt bank
      movlw        0x55         ; Sekvensen som måste användas enligt databladet
      movwf        EECON2         ; Sekvensen som måste användas enligt databladet
      movlw        0xAA         ; Sekvensen som måste användas enligt databladet
      movwf        EECON2         ; Sekvensen som måste användas enligt databladet
      bsf          EECON1, WR      ; Sekvensen som måste användas enligt databladet
      banksel      INTCON
      bsf          INTCON, GIE      ; Slår på interrupten igen
      banksel      EECON1         
      bcf          EECON1, WREN   ; Tillåter ej längre skrivning till EEPROM

Las_ee:
      movf         Data_ee_addr, w   ; Lägger min EEPROM-adress i W
      banksel      EEADR
      movwf        EEADR         ; Flyttar W till EEADR
      banksel      EECON1
      bcf          EECON1, EEPGD   ; Använder dataminnet
      bsf          EECON1, RD      ; Initierar läsning
      banksel      EEDAT
      movf         EEDAT, w      ; Flyttar värdet jag läst ut till W

end

//Ulf L.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690, skriva till EEPROM

Inlägg av sodjan »

> Måste rusa till träningen nu...

Gör det, så slipper du träna sen... :-)
Som sagt, får se om jag hinner testköra lite i kväll...
ToPNoTCH
Inlägg: 5152
Blev medlem: 21 december 2009, 17:59:48

Re: PIC16F690, skriva till EEPROM

Inlägg av ToPNoTCH »

Koden skriver 55 till adress 8 så "Skriv EE" delen funkar.

Däremot raden

Kod: Markera allt

bcf          EECON1, EEPGD   ; Använder dataminnet
I "Las_ee" rutinen ger:
"Cannot set EECON1<WR> without first setting EECON1<WREN> in a previous instruction."

och raden efter

Kod: Markera allt

bsf          EECON1, RD      ; Initierar läsning
ger "Write to EECON1 sets both EECON1<RD> and EECON1<WR> simultaneously. This is ambiguous - both bits will be considered clear."

Har själv inte ens tänkt på vad du gör för fel, men dessa felmeddelanden kan nog vara till hjälp.
ToPNoTCH
Inlägg: 5152
Blev medlem: 21 december 2009, 17:59:48

Re: PIC16F690, skriva till EEPROM

Inlägg av ToPNoTCH »

Gah..

Det hela störde mig lite för jag tyckte det såg rätt ut.

Ett skitfel...

Du försöker läsa innan bakgrundsskrivningen är klar.

Lägg in en delay mellan läs och skriv så rockar det. :wink:
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

Ja då var man åter vid datorn.

Jag får faktiskt inte ihop det du säger ToPNoTCH.....
Hur ser du att jag skriver 55 till adress 08? Jag ser inte det när jag tittar i mitt EEPROM-fönster så att säga.

Så jag ser inte att min Skriv_ee fungerar....

Sedan tänkte jag på detta:
I "Las_ee" rutinen ger:
"Cannot set EECON1<WR> without first setting EECON1<WREN> in a previous instruction."

Jag har ju ingen write enable i läsrutinen så jag får inte riktigt ihop det.

M.v.h.
Ulf L.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690, skriva till EEPROM

Inlägg av sodjan »

Märkligt att du inte kommenterar det sista inlägget från ToPNoTCH alls...
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

Jag kommenterade inte det för jag försökte förstå första inlägget.

Jag la in en lång delay (1 sekund), innan jag nollar WREN och ja visst fungerade det då.
Jag såg då att WR biten på EECON1 hade blivit 0.
Innan jag skrev inlägget så hade jag en loop för att kolla just den biten men jag stegade bara mig fram och efter att kört animate på den utan att den kom ur (jag väntade inte tillräckligt länge + att jag borde lagt en brakepoint efter och kört run) och då såg jag att WR låg kvar på 1 så jag misstänkte att det var felet.

Nåväl, tack skall ni ha för att ni står ut med mina nybörjarfrågor och misstag :)

M.v.h.
Ulf L. - som nu skall snygga till sin kod lite
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: PIC16F690, skriva till EEPROM

Inlägg av MrIzoard »

Ja nu fungerar det ju bra när jag testar WR-biten och loopar tillbaka tills den blir 0.

Då slipper man ligga och klura på det inatt :)

M.v.h.
Ulf L.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690, skriva till EEPROM

Inlägg av sodjan »

Från kapitel "10.1.3 WRITING TO THE DATA EEPROM MEMORY" sidan 122.
At the completion of the write cycle, the WR bit is cleared in hardware
and the EE Write Complete Interrupt Flag bit (EEIF) is set.
The user can either enable this interrupt or poll this bit.
Du gjorde alltså ingendera av detta (?).
Skriv svar