Po zapisu dat do EEPROM se 16F877 "zresetuje"

Po inicializaci procesoru nacitam data a chovavam je v promennych (treba merim aktualni teplotu a min a max ukladam do pormennych). Kdyz provedu zapis do EEPROM, procesor se zresetuje (chova se jako bych ho vypnul a zapnutl) a promenne jsou vynulovane.
Heldal jsem informace na netu k tomuto memu problemu, ale bohuzel jsem nic nenasel co by mi pomohlo vyresit muj problem.

Zkousim to na procesoru 16F877A (tento projektik dodelam jeste na tomto procesoru a prechazim na 18F4620, to stale prepinani pagesel je o nervy :-/)

Kod pro zapis dat do EEPROM (zde jen na zkousku ukladam hodnotu 0xCD na adresu 0x01)

[code] banksel PIR1
bcf PIR1,EEIF
banksel EEADR
movlw 0x01
movwf EEADR
movlw 0xCD
movwf EEDATA
banksel EECON1
bcf EECON1,EEPGD
bsf EECON1,WREN
bcF INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
btfsc EECON1,WR
goto $-1
bcf EECON1,EEIF
bcf EECON1,WREN

banksel	0x00

[/code]

inicializace

[code]INIT
banksel OPTION_REG
movlw b’00000000’
movwf OPTION_REG
;portA
; banksel TRISA ; vyber banky
; movlw b’11111111’ ; 1 vstup, 0 vystup
; movwf TRISA ; sup do TRISu
;zapnuti AD
banksel ADCON0 ; vyber banky
movlw b’01000001’ ; FRC,ADC is ON
movwf ADCON0
banksel ADCON1 ; vyber banky
movlw b’10000000’ ; vlevo, VSS, VDD
movwf ADCON1 ;
;PORTB
banksel TRISB ; vyber banky
movlw b’00001111’ ; 1 vstup, 0 vystup
movwf TRISB ; sup do TRISu
;PORTC
banksel TRISC ; vyber banky
movlw b’00011111’ ; 1 vstup, 0 vystup
movwf TRISC ; sup do TRISu
;PORTD
banksel TRISD ; vyber banky
movlw b’00000000’ ; 1 vstup, 0 vystup
movwf TRISD ; sup do TRISu
;PORTE
banksel TRISE ; vyber banky
movlw b’00000111’ ; 1 vstup, 0 vystup
movwf TRISE ; sup do TRISu
MOVLW B’01000000’ ;nastavení přerušení
MOVWF INTCON
BSF INTCON,GIE ; povolene preruseni
banksel PORTA
;********************* Konec inicializace procesoru **********************
return

[/code]

Uz se s tim trapim 3 dny, pomuze mi nekdo ?

Zkus v zápisu do eeprom povolit přerušení až na samém konci a ne před čekáním na dokončení zápisu.

Takhle to mam já a funguje to, tak to zkus.

[code];**************************************************************************
; Write EEPROM
; nastav EEADR a EEDATA
;**************************************************************************

WRITE
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 !!!
;-------------------------------
return[/code]

Moc ho neodsuzuj, na nějake “kravinky” to stačí :smiley:

Tak uz jsem prisel na pricinu problemu. Pokud ctu data z cidla 18B20, provede se “reset” po zapisu do EEPROM.
to honza3: diky, zapis funguje, preruseni je lespi mit az na konci

kde je ale problem ?
Zde ctu data z teplotniho cidla

[code]KOM_S_C_1
movlw b’00101000’ ; zakazane všechna přerušení a od přetečení TMR0
movwf INTCON
CALL A0_RESET_C ;PROCEDURA RESET
MOVLW 0xCC ;PRIKAZ ROM - SKIPROM
CALL A0_WR_DO_C ;ZAPIS PRIKAZU DO CIDLA
MOVLW 0x44 ;PRIKAZ ROM - prevod teploty
CALL A0_WR_DO_C ;ZAPIS PRIKAZU DO CIDLA
return
;******************************************************
; TEST UKONČENÍ PŘEVODU *
;*************************
; Pro zjisteni ukonceni prevodu teploty se musi vyslat “cteci casovy usek” (pekne blbej výraz :frowning: )
; toto cteni se musi provadet pokazde, kdy chceme cist stav sbernice, protoze cidlo odpovi pouze jednou na
; otazku, zda probiha prevod, takze cekaci smycka se vraci o 10 radku nahoru na nove vyslani
; cteciho casoveho useku. :wink:
namerane
g MOVLW 0X03 ;POMOCNE ZBRZDENI
MOVWF TMP2
banksel TRISC ;BANKA1
BCF ds ;PIN RA0 JAKO VYSTUP
BANKSEL PORTC ;BANKA0
BSF ds ;LOG.1 NA TCK - PRIPRAVA NA START CTENI
BCF ds ;LOG.0 NA TCK - START CTECIHO CASOVAHO USEKU
nop
;-------------------------------
banksel TRISC ;BANKA1
BSF ds ;PIN RA0 JAKO VSTUP
BANKSEL PORTC ;BANKA0

DECFSZ	TMP2,F		;DOBRZDENI NA 13us
GOTO	$-1
BTFSC	ds			;TEST UROVNE SBERNICE - VYSLANI BITU Z CIDLA
GOTO	KOM_S_C		;CIDLO POSLALO LOG.1   ukonceny prevod

; CALL BR_60us ;BRZDA 60us
goto g
;******************************************************
KOM_S_C ; TEST KOMUNIKACE (z cidla musi byt nactena hodnota +85st.C. (0550h A PO UPRAVE V TEMP_MSB bit0 =0 A V TEMP_LSB=0xAA));
;******************************************************
CALL A0_RESET_C ;PROCEDURA RESET
MOVLW 0xCC ;PRIKAZ ROM - SKIPROM
CALL A0_WR_DO_C ;ZAPIS PRIKAZU DO CIDLA
MOVLW 0xBE ;FUNKCNI PRIKAZ - READ SCRATCHPAD
CALL A0_WR_DO_C ;ZAPIS PRIKAZU DO CIDLA
CALL A0_CTI_Z_C ;CTENI DAT Z CIDLA - NACTENA DATA JSOU V TMP0 reg.
MOVF TMP0,W
MOVWF TEMP_LSB
CALL A0_CTI_Z_C ;CTENI DAT Z CIDLA - NACTENA DATA JSOU V TMP0 reg.
MOVF TMP0,W
MOVWF TEMP_MSB

;movlw b’10101000’ ; povolena všechna přerušení a od přetečení TMR0
;movwf INTCON
RETURN
;******************************************************
; Ovladaci ROUTINE pro cidlo DS18B20 a DS18S20
; Casovani je pro pouziti krystalu 4MHz
; Casova smycka je 10us, 25us, 60us, 100us, 160us, 490us
; Cidlo je napajeno pres Ucc pin
;…
;PRSENTACNI CAST;
A0_RESET_C
BANKSEL TRISC ;BANKA1
BCF ds ;PIN ds JAKO VYSTUP
BANKSEL PORTC ;BANKA0
BSF ds ;LOG.1 NA TCK
BCF ds ;LOG.0 NA TCK
CALL BR_490us ;CEKEJ CCA 490us
BANKSEL TRISC ;BANKA1
BSF ds ;PIN ds JAKO VSTUP
BANKSEL PORTC ;BANKA0
CALL BR_100us ;CEKEJ CCA 100us
chyba
BTFSC ds ;TEST PRESENTACNIHO PULSU OD CIDLA
goto A0_RESET_C; call chyba

CALL	BR_490us   ;CEKEJ CCA 490us
RETURN

;------------------------------------------------------
;TEST KOMUNIKACE (z cidla musi byt nactena hodnota +85st.C. (0550h));
;------------------------------------------------------
;VYSLANI 8BITU DO CIDLA (DATA NEBO PRIKAZ)
;ODESILANA DATA (1 BAJT) MUSI BYT V W REGISTRU
A0_WR_DO_C
MOVWF TMP0
BANKSEL TRISC ;BANKA1
BCF ds ;PIN ds JAKO VYSTUP
BANKSEL PORTC ;BANKA0
BSF ds ;LOG.1 NA TCK
MOVLW 0X08 ;POCET BITU DO CIDLA (8)
MOVWF TMP1

A0_ZAPISS
BTFSS TMP0,0 ;TEST BITU 0 REG. TMP0
GOTO A0_ZAPIS0
GOTO A0_ZAPIS1
;-------------------------------
A0_ZAPIS0 ;TAKTO ZAPISUJE LOG.0
BSF ds ;LOG.1 NA TCK
BCF ds ;LOG.0 NA TCK
CALL BR_100us ;BRZDA 100us
BSF ds ;LOG.1 NA TCK
GOTO A0_POSUNN
;-------------------------------
A0_ZAPIS1 ;TAKTO ZAPISUJE LOG.1
BSF ds ;LOG.1 NA TCK
BCF ds ;LOG.0 NA TCK
CALL BR_10us ;BRZDA 10us
BSF ds ;LOG.1 NA TCK
CALL BR_100us ;BRZDA 100us
GOTO A0_POSUNN
;------------------------------------------------------
A0_POSUNN
RRF TMP0,F ;POSUN OBSAHU REGISTRU O JEDEN BIT DOPRAVA
DECFSZ TMP1,F ;TEST POCTU ODESLANYCH BITU
GOTO A0_ZAPISS ;JESTE NEBYLO ODESLANO 8BITU
RETURN ;ODESLANO 8BITU - VYSTUP Z PODPROGRAMU
;------------------------------------------------------
; PRIJMUTI 8BITU Z CIDLA
; (DATA Z CIDLA JSOU V REG.TMP0)
A0_CTI_Z_C
BCF STATUS,RP0 ;BANKA0
MOVLW 0X08 ;POCET BITU PRO PRIKAZ (8)
MOVWF TMP1
CLRF TMP0
A0_CTI_Z_C1
bcf STATUS,C
RRF TMP0,F
MOVLW 0X03 ;POMOCNE ZBRZDENI
MOVWF TMP2
BSF ds
BANKSEL TRISC ;BANKA1
BCF ds ;PIN ds JAKO VYSTUP
BANKSEL PORTC ;BANKA0
BSF ds ;LOG.1 NA TCK - PRIPRAVA NA START CTENI
BCF ds ;LOG.0 NA TCK - START CTECIHO CASOVAHO USEKU
nop
;-------------------------------
BSF STATUS,RP0 ;BANKA1
BSF ds ;PIN RA0 JAKO VSTUP
BCF STATUS,RP0 ;BANKA0

DECFSZ	TMP2,F      ;DOBRZDENI NA 13us
GOTO	$-1

BTFSS	ds			;TEST UROVNE SBERNICE - VYSLANI BITU Z CIDLA
GOTO	A0_CTI_0	;CIDLO POSLALO LOG.0
GOTO	A0_CTI_1	;CIDLO POSLALO LOG.1

;-------------------------------
A0_CTI_0
BCF TMP0,7 ;NASTAV BIT7 REG.TMP0 DO LOG.0
CALL BR_60us ;BRZDA 60us
DECFSZ TMP1,F ;TEST POCTU ODESLANYCH BITU
GOTO A0_CTI_Z_C1 ;JESTE NEBYLO ODESLANO/PRIJMUTO 8BITU
RETURN ;ODESLANO 8BITU - VYSTUP Z PODPROGRAMU
;-------------------------------
A0_CTI_1
BSF TMP0,7 ;NASTAV BIT7 REG.TMP0 DO LOG.0
CALL BR_60us ;BRZDA 60us
DECFSZ TMP1,F ;TEST POCTU ODESLANYCH BITU
GOTO A0_CTI_Z_C1 ;JESTE NEBYLO ODESLANO/PRIJMUTO 8BITU
RETURN ;ODESLANO 8BITU - VYSTUP Z PODPROGRAMU
;
[/code]

a pouzivam pro zapis do EEPROM

[code]TEST_WRITE_EEPROM
banksel EEADR
movlw 0x02
movwf EEADR
movlw 0xAA
movwf EEDATA
banksel 0x00
call WRITE_EEPROM

banksel EEADR
movlw 0x01
movwf EEADR
movlw 0xA0
movwf EEDATA
banksel 0x00
call	WRITE_EEPROM

return

WRITE_EEPROM
banksel PIR1
bcf PIR1,EEIF

banksel EECON1
bcf EECON1,EEPGD 
bsf EECON1,WREN 


bcF INTCON,GIE 

movlw 0x55
movwf EECON2 

movlw 0xAA
movwf EECON2 

bsf EECON1,WR

bsf INTCON,GIE

btfsc EECON1,WR 
goto $-1

bcf EECON1,EEIF 
bcf EECON1,WREN

banksel	0x00

return

[/code]

Odpovim si sam a mozna i poradim ostatnim, stejne nezkusenym jako ja.

Trochu ot: Proc musi clovek prijit na pricinu problemu az po nekolika dnes sebetryzneni ?

Uvedu kod pro pripadne zajemce se stejnym/podobnym problemem:

KOM_S_C_1 movlw b'00101000' ; zakazane všechna přerušení a od přetečení TMR0 movwf INTCON CALL A0_RESET_C ;PROCEDURA RESET MOVLW 0xCC ;PRIKAZ ROM - SKIPROM CALL A0_WR_DO_C ;ZAPIS PRIKAZU DO CIDLA MOVLW 0x44 ;PRIKAZ ROM - prevod teploty CALL A0_WR_DO_C ;ZAPIS PRIKAZU DO CIDLA movlw b'00000000' ; povolene všechna přerušení a od přetečení TMR0 movwf INTCON return
No a kdyz jsem zde povolil vsechna preruseni, uz to funguje jak ma. Tedy doufam.

A čím povoluješ ta všechna přerušení…

vychazel jsem z toho ze

movlw b'00101000' ; zakazane všechna přerušení a od přetečení TMR0 movwf INTCON
a tak jsem to znegoval (zmenil na opacne hodnoty). Nebo je to spatne ? Ted si nejsem jisty. Ale vim jiste, ze mi to zaclo fungovat.

movlw b'00000000' ; povolene všechna přerušení a od přetečení TMR0 movwf INTCON

Já nepoužívám zápis do INTCON jako movlw něco a movwf INTCON z toho důvodu, že když zapíšu a zrovna nastane přerušení, tak se vynulují i příznaky, pokud to přerušení umožní.
Lepší, aspoň teda pro mě, je bsf a bcf INTCON,GIE,PEIE,TMR0IE,INTE,RBIE.

A to, jak to máš, se ti přerušení vypíná, z toho usuzuju, že ho zapínáš až v proceduře s EEPROM. :slight_smile: A koukám, že jsi si tu chybu neopravil :slight_smile:

nu asi největší chyba je ta že v přímo v příkladu obsluhy eeprom a flesh paměti je uvedeno striktně zakázat přerušení a také provést kontrolu zda jsou opravdu již zakázaná ! v opačné případě počkat až proběhne úspěšné zakázání ! teprve pak obsluha paměti a po ukončení obnovit ta přerušení !

Já se z tímto problémem již setkal a pokud přerušení v procesoru jsou aktivní je to nutné ! Používám přímo kopii příkladu v data listu jen z upravou adresace proměných a je klid !