Nelze zapisovat do EEPROM,přechod z 16F627 - 690/877

Prosím, potřebuji poradit.
Potřebuji v programu zapisovat do EEPROM. Dříve jsem bez problémů užíval EEPROM PIC16F627. Nyní zkouším PIC16F690 či PIC16F877A nezapíše se nic. Pokud je v adresovaném paměťovém místu jiná hodnota než FF dojde k přepsání na FF. Zkoušel jsem různý kód, ale výsledek je vždy stejný - originál z datasheetu i tento od HONZY:

LIST    P = 16F877A, R = DEC
include p16f877A.inc

__CONFIG B'11111100110001'

c1       EQU      h'20'              ;proměnné pro cykly
c2       EQU      h'21'

    ORG 0000H
    
    BSF    STATUS,RP0
    BCF    STATUS,RP1       ;nastavena banka1
    
    MOVLW  B'00000110'

    MOVLW  b'00000000'        ;binární hodnota do W ;1=input,0=output
    MOVWF  TRISB              ;nastavení portu   

    BCF    STATUS,RP0       ;Banka0
    
    MOVLW	  b'00000000' 	     ;binarni hodnota pro zhasnuti portu
	  MOVWF	  PORTB		     ;Zapsat do PORTB   
;**************************************************************************
; Write EEPROM
; nastav EEADR a EEDATA
;**************************************************************************

	banksel	EEDATA
	movlw 10		;příprava dat
	MOVWF 	EEDATA  		;
	movlw 1	 	;nastavení adresy
	MOVWF 	EEADR		;do ukazatele


   
   banksel   PIR2
   bcf      PIR2,EEIF   ; smaz bit kompletniho zapisu
   banksel   EECON1
   bcf      EECON1,EEPGD   ; nastaveni datove pameti
   bsf      EECON1,WREN   ; povolit zapis do EEPROM
   bcf      INTCON,GIE   ; !!! zakazano preruseni !!!
   ;-----------------------; aktivace zapisu
   movlw   055h      ; povinna povolovací sekvence
   movwf   EECON2
   movlw   0AAh
   movwf   EECON2
   bsf      EECON1,WR   ; spustit zapis
   ;-----------------------; konec aktivace
   banksel   PIR2
   btfss   PIR2,EEIF   ; pockat na konec zapisu
   goto   $-1
   banksel   EECON1
   bcf      EECON1,WREN   ; zakazat zapis do EEPROM
   banksel   0
   bsf      INTCON,GIE   ; !!! povoleno preruseni !!!

;---------------------------------------------------------------------
	banksel	PORTB
zacatek	BSF	  PORTB,0	     ;rozsviti rb0
	CALL	  cekej		     ;podprogram cekej
	BCF	  PORTB,0	     ;zhasne rb0
	BSF	  PORTB,1
	CALL	  cekej
	BCF	  PORTB,1
	BSF	  PORTB,2
	CALL	  cekej
	BCF	  PORTB,2
	BSF	  PORTB,3
	CALL	  cekej
	BCF	  PORTB,3
	BSF	  PORTB,4
	CALL	  cekej
	BCF	  PORTB,4
	BSF	  PORTB,5
	CALL	  cekej
	BCF	  PORTB,5
	BSF	  PORTB,6
	CALL	  cekej
	BCF	  PORTB,6
	BSF	  PORTB,7
	CALL	  cekej
	BCF	  PORTB,7
	GOTO	  zacatek	 ;skok na návěstí zacatek
;-----------------------------------------------------------------
;program pro čekání    
cekej    MOVLW    225                ;podprogram čekání 
         MOVWF    c2                 ;trvá asi 0.2s
wait2    MOVLW    255
         MOVWF    c1
wait1    DECFSZ   c1,1
         GOTO     wait1
         DECFSZ   c2,1
         GOTO     wait2
         RETURN                      ;návrat z podprogramu

         END                         ;konec programu    

Díky Martin

:arrow_right: administrator: přejmenováno z "Nelze zapisovat do EEPROM"

Nevím jak tobě, ale ta sekvence zapíše na adresu 0x01 hodnotu 0x0A. Aspoň v simulaci to funguje. A nějak jsem nepochopil, na co tam vypínáš a zapínáš přerušení, když ho stejně nevyužíváš.

Proč vypínám přerušení - protože tohle je tvuj kód HONZO3. Zkoušel jsem už vše možné i opsat kód ze zdrojáku a pořád to umí jen smazat adresu 0x01 a už tam nic neuloží!! Nevíš čím by to mohlo být? Dělá mi to tosamé u 16F877A, 16F690 i 16F677. U PIC16F84, 16F627 přepisuji EEPROM bez problémů. :frowning:

Budik: Tenhle balast jsem si napsal a používal na 16F877A

[code]
;--------------------------------------------------------------------
; ČTENÍ Z EEPROM
; PROMĚNNÉ: EADRESA, EDATA
; BITY: EEPGD, WREN, WR, RD
;
; DO REGISTRU ADRESA SE VLOŽÍ ADRESA ČTENÉ BUŇKY
; PO PŘEČTENÍ EEPROM BUDOU DATA V REGISTRU EDATA
;--------------------------------------------------------------------
#DEFINE EEPGD EECON1,7
#DEFINE WREN EECON1,2
#DEFINE WR EECON1,1
#DEFINE RD EECON1,0

EADRESA EQU OFFSET+.n ;POTŘEBA NASTAVIT OFFSET
EDATA EQU OFFSET+.n+1

CTI_EEPROM BANKA2
MOVF EADRESA,W
MOVWF EEADR
MOVF EDATA,W
MOVWF EEDATA
BANKA3
BSF RD
BTFSC RD
GOTO $-1
BANKA2
MOVF EEDATA,W
BANKA0
MOVWF EDATA
RETURN

;____________________________________________________________________

;--------------------------------------------------------------------
; ZÁPIS DO EEPROM
; PROMĚNNÉ: EADRESA, EDATA
; BITY: EEPGD, WREN, WR, RD
;
; DO REGISTRU ADRESA SE VLOŽÍ ADRESA BUŇKY, KAM SE BUDE ZAPISOVAT
; ZAPISOVANÁ DATA SE VOLŽÍ DO REGISTRU EDATA
;--------------------------------------------------------------------
#DEFINE EEPGD EECON1,7
#DEFINE WREN EECON1,2
#DEFINE WR EECON1,1
#DEFINE RD EECON1,0

EADRESA EQU OFFSET+.n ;POTŘEBA NASTAVIT OFFSET
EDATA EQU OFFSET+.n+1

ZAPIS_EEPROM BCF GIE
BANKA2
MOVF EDATA,W
MOVWF EEDATA
MOVF EADRESA,W
MOVWF EEADR
BANKA3
BSF WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF WR
BTFSC WR
GOTO $-1
BANKA0
; BSF GIE ;POKUD SE VYUŽÍVÁ PŘERUŠENÍ JE POTŘEBA ODKOMENTOVAT!
RETURN

;____________________________________________________________________

;--------------------------------------------------------------------
; MAKRA PRO ZMĚNU BANK REGISTRŮ
; POUŽITÍ - STAČÍ NAPSAT BANKA0 A PIC SE PŘEHODÍ DO BANKY 0
;--------------------------------------------------------------------

STATUS EQU 0x03

#DEFINE RP0 STATUS,5
#DEFINE RP1 STATUS,6

BANKA0 MACRO ;PŘEPNE NA BANKU 0
BCF RP0
BCF RP1
ENDM

BANKA1 MACRO ;PREPNE NA BANKU 1
BSF RP0
BCF RP1
ENDM

BANKA2 MACRO ;PŘEPNE NA BANKU 2
BCF RP0
BSF RP1
ENDM

BANKA3 MACRO ;PŘEPNE NA BANKU 3
BSF RP0
BSF RP1
ENDM

;____________________________________________________________________[/code]
Máš to s komplet omáčkou a pokecem.

:laughing:
Tak jsem na to přišel!!!
Jde o to, že ta rutina pro zápis do EEPROM musí být v podprogramu, jinak to jen maže paměťová místa a nezapisuje do nich data.
Ale i tak děkuji za pomoc.
Martin

Blbost, zapis funguje v simulatoru + praxe, jen sem poupravil vkladani dat + adresi ,ostatniho sem se nedotkl, beha to jen v hlavni smycce
EE_TEST.zip (212 KB)

Tak jsem to zkusil v hlavní smyčce (trochu upravil pro 690, soubor k nahlédnutí) a výsledek přečtených dat přikládám - nechce to zapisovat při prvním proběhu. Tuším - to je jen můj názor - ten původní i následující program bude dobře. Pokud začnu číst procesor programátorem, dojde k resetu a krátkodobému běhu programu. V tomto okamžiku se již zapsaná hodnota v buňce vymaže. Než však dojde k opětovnému zapsání hodnoty běh programu v procesoru se násilně programátorem zastaví a následuje čtení pamětí. Proto byla vždy buňka jen vymazaná a chyběla zapsaná hodnota.
Pokud se pletu, tak mne opravte.
Děkuji Martin
eprom7.asm (3.52 KB)

Tady je obrázek paměti EEPROM
eeprom3.GIF

upravil jsem jenom hlavicku pro 887 (eprom7.asm) a v simulatoru funguje, odpoledne to jeste skusim nazivo, ten muj upravenej program sem na poprvi nahral,spustil,precet a vse v poradku, jeste muzes skusit dat pred program cekaci smycku 1s k zamezeni toho kratkodobeho běhu programu

pokud pouzivas sdileny adresy pro promeny tak se to da skratit LOOP NOP movF HODNOTA,W ;příprava dat banksel EEDATA MOVWF EEDATA ; movF ADRESA,W ;nastavení adresy MOVWF EEADR ;do ukazatele

pri prekladu zadny hlaseni ? error ? verze MPLABU ?

Jo je to tak, dal jsem tam to zpoždění a už to zapisuje i na první pozici.
Kluci jste moc hodní, že se o mne tak staráte.
Díky Martin
eeprom4.GIF