Chyba v programu - obcasny zapis spatnych hodnot do EEPROM

Ac nerad, mel bych zase dotaz… fakt uz nevim, co s tim…
Pisu program (budik) do PIC16F877A, uz je to skoro hotovy, jen bych chtel neco zapsat do EEPROM.
To, co se zapsalo uvadim na konci postu jako vypis programu “UP v2.42” pri verifikaci EEPROM.

Nejdriv teda kod:
Tenhle podprogram by mel akorat nastavit ci otestovat vse potrebne a pripadne nechat zapsat.[code]ZapsatBudik ; otestuje, ci je moznost zapsat aktualne nastavenej budik a pokud jo, tak ho to i zapise (svine!)
bcf STATUS, IRP ; radsi smazat i toto, ac by to melo byt 0
movf SELDISP, f ; otestovani na nulu
btfss STATUS, Z ; pokud to neni nula
return ; tak konec

movf	MODE, w			; presunout do W
xorlw	.2				; testnout, ci sem v modu 2 (nastaveni budiku)
btfss	STATUS, Z		; a pokud jsem i ve spravnym modu
return					; pokud nejsem tak skoncim

; ted by se snad i siklo zaridit cekani na preruseni - abych zbytecne nekurvil ten cas, i kdyz 1/400 sekundy... 

movlw	CURBUD			; presunout do FSR
movwf	FSR				; adresu prave upravovanyho budiku
call ZapsatEEprom		; nechat zapsat budik do EEPROM
return					; a vratit se[/code]

Nasledujici by melo zapsat tri bajty do EEPROM podle cisla v registru CURBUD. Podprogram “EEWrite” je napsan podle PDFka. [code]ZapsatEEprom
; v FSR se ocekava adresa cehosi jako CURBUD = adresa v EEPROM / 3

bcf		STATUS, C	; vynulovat C, pro jistotu...
rlf		INDF, w	; nejdriv vynasobit dvema
addwf	INDF, w	; a potom pricist jednou - a huraaa, mame trojnasobek


bcf		STATUS, RP0
bsf		STATUS, RP1	; protoze tady se nastavej banky a uz k tomu asi nebude pristup... debilni...


;	===		ZAPIS MINUT		===
movwf	EEADR		; presunout do adresy 
incf	FSR, f		; inkrementovat ukazatel
movf	INDF, w			; presunout minuty
movwf	EEDATA		; do EEDATA
call EEWrite		; zapsat minuty

;	===		ZAPIS HODIN		===
incf	EEADR, f	; inkrementovat adresu v EEPROM
incf	FSR, f		; ale i v FSR - na hodiny
movf	INDF, w			; hodiny
movwf	EEDATA		; do
call EEWrite		; EEPROM

;	===		ZAPIS DNU		===
incf	EEADR, f
incf	FSR, f
movf	INDF, w			; dny
movwf	EEDATA
call EEWrite


bcf	STATUS, RP1
bcf STATUS, RP0

return

EEWrite
bsf STATUS, RP0 ; Bank 3
bcf EECON1, EEPGD ; Point to DATA
bsf EECON1, WREN ; Enable writes

bcf 	INTCON,GIE ;Disable INTs.
movlw 	0x55 
movwf 	EECON2 ; Write 55h
movlw 	0xAA
movwf 	EECON2 ; Write AAh
bsf		EECON1, WR
bsf		INTCON, GIE
bcf		EECON1, WREN


btfsc	EECON1, WR     ; cekani na dozapsani
goto 	$-1

bcf		STATUS, RP0
return[/code]Vzhledem k tomu, ze tu vyuzivam neprimeho adresovani (je to jednodussi, predevsim kvuli odpadle nutnosti neustale prepinat mezi bankami), bude asi dulezite ukazat i organizaci pameti:[code]; pro mod nastavovani budiku:

CURBUD equ RAM+20 ; aktualne vybranej budik, zobrazovat se bude na miste sekund
CURMIN equ CURBUD+1 ; minuty RAM+22
CURHOD equ CURMIN+1 ; hodiny RAM+23
CURDEN equ CURHOD+1 ; den RAM+24[/code]Jsem si docela jistej, ze tady chyba nebude - pri nastavovani se mi to vsechno zobrazuje na displeje a tvari se to OK, pri vypnuti nastavovaciho modu se zobrazi cas tak, jak ma bejt.
Tlacitka i zapis do EEPROM jsou obsluhovany v “main-loop”, takze by teoreticky nemel byt ani problem v nejakej preruseni preruseni prerusenim…

Pokud by se tim nekdo rozhod prohrabnout a treba nasel chybu, bude mu patrit jedno moje veliky diky (snad to nebude moc narocny, kod se snazim komentovat - predevsim pro sebe). Delam se s tim fakt dlouho a nemam uz jedinou predstavu, cim by to mohlo byt. Zapis konstanty do EEPROM funguje celkem v poradku a problem v tom neni.

Jeste ten vypis z UPu:1.: Verify of data memory: 02 read instead of 00 at address 0002 2.: Verify of data memory: 03 read instead of 00 at address 0023 3.: Verify of data memory: 03 read instead of 00 at address 0026 4.: Verify of data memory: 03 read instead of 00 at address 0029 5.: Verify of data memory: 04 read instead of 00 at address 002C 6.: Verify of data memory: 04 read instead of 00 at address 002F 7.: Verify of data memory: 04 read instead of 00 at address 0037 8.: Verify of data memory: 04 read instead of 00 at address 003A 9.: Verify of data memory: 06 read instead of 00 at address 0053 10.: Verify of data memory: 06 read instead of 00 at address 0058 11.: Verify of data memory: 06 read instead of 00 at address 005B 12.: Verify of data memory: 07 read instead of 00 at address 0077 13.: Verify of data memory: 08 read instead of 00 at address 007A 14.: Verify of data memory: 08 read instead of 00 at address 007D 15.: Verify of data memory: 08 read instead of 00 at address 0088 16.: Verify of data memory: 0A read instead of 00 at address 00A4 17.: Verify of data memory: 0A read instead of 00 at address 00A7 18.: Verify of data memory: 0A read instead of 00 at address 00AF 19.: Verify of data memory: 0B read instead of 00 at address 00C5 20.: Verify of data memory: 0B read instead of 00 at address 00C8

Sice jsem nějak přesně nepochopil o co ti jde, ale teď to dělá to, že pokud je v MODE 2 a v SELDISP 0, tak CURBUD vynasobí x3 a zapíše data od CURBUD do EEPROM od adresy v CURBUD +1,+2,+3 alias CURMIN, CURHOD a CURDEN.
Tedy, pokud je v CURBUD 0, zapisuje do EEPROM od adresy 0x00, pokud je v CURBUD 1, zapisuje od adresy 0x03 atd. Ale zapisuje pořád data z registrů CURBUD +1,2,3.

Ano, a to je presne to, o co mi jde.

A to je správná funkce programu nebo špatná?

Když špatná, co je špatně?

Obsahem onech registru maji byt nuly - ty se pokusim zapsat na vsechny adresy (projedu CURBUD od nuly do 79). Jenze sem tam se tam objevi nejaka spatna hodnota (viz vypis verifikace z UPu).

No, mě to jde normálně až do 79.Zapisuje 0x00 po 3.

Ale zápis do EEPROM nemáš přesně podle datasheetu.
Nastavuješ jen ,např. bsf STATUS, RP0 a při tom někde před tím jsi mohl použít jinou banku než 0. Měl by jsi nastavit i RP1.
Používej banksel a nemusíš to hlídat.

Nastavení FSR pomocí IRP bych asi, z důvodu přehlednosti dělal tesně před tím nastavením FSR, ale zaleží případ od případu. :smiley:

banky by mely bejt nastaveny v ZapsatEEProm. Ale o to nejde, asi jsem prisel, cim to bude - v preruseni pouzivam FSR - a preruseni vypinam az po jeho nastaveni, takze se mozna vola preruseni, a tam se to zmeni…

vyzkouset to budu moct asi az v patek (skola, skola, skola :frowning: ), ale rekl bych, ze to bude ono… takze moc diky za nakopnuti :wink:

Třeba ti to pomůže. :smiley:

a

diky :wink: ale tohle uz umim :sunglasses: