[ dejan5 @ 28.02.2008. 00:30 ] @
Upis u eeprom za Pic16F628A

Evo deo listinga, tj. poziva za upis u eeprom i samog ciklusa upisa u isti:


UpisEEprom
call Wait
movf podatak1,0 ;podatak u W
MOVWF CONFIG_DATA ;priprema podatak1 za upis
movf BROJEE,0
MOVWF CONFIG_ADDR ;adresa u eepromu na koju se snima
call Upis

movf podatak2,0
MOVWF CONFIG_DATA
incf BROJEE,1 ;priprema podatak2 za upis
movf BROJEE,0
MOVWF CONFIG_ADDR
call Upis

incf BROJEE,1
movlw d'112' ;provera lokacije EEproma
xorwf BROJEE,0 ;ukupno za upis 112(0-111)
btfsc STATUS,2
clrf BROJEE
return



;DATA EEPROM WRITE
; podesi adresu i podatak
Upis
MOVF CONFIG_ADDR,W ;priprema adrese u EEprom za upis
BSF STATUS, RP0 ; Bank 1

MOVWF EEADR ; ADRESA EEPROM LOKACIJE
BCF STATUS, RP0 ; Bank 0
MOVF CONFIG_DATA,W ; Podatak koji se upisuje(podatak1...)
BSF STATUS, RP0 ; Bank 1
MOVWF EEDATA ; PODATAK ZA UPIS

BSF EECON1,WREN ; Dozvola Upisa
BCF INTCON, GIE ; Iskljuci INTerapte
MOVLW 0X55 ;
MOVWF EECON2 ; Prvi kljuc
MOVLW 0XAA ;
MOVWF EECON2 ; Drugi kljuc

BSF EECON1,WR ; Set WR bit - UPISI

btfsc EECON1,WR
goto $-1
nop ;probano i bez ovoga

BCF EECON1, WREN ; Zabrana Upisa

BSF INTCON,GIE ; Dozvoli INTerapte.

;PROVERA UPISA

MOVF EEDATA, W ; last written value in 'W'
BSF EECON1, RD ; start read at current address
SUBWF EEDATA, W ; subtract W from EEDATA
BTFSS STATUS, Z ; ZERO flag set?
GOTO write_error ; No, there was a write-error
BCF STATUS, RP0 ; Bank0

return ; continue program


write_error
NOP
GOTO INIT ;ovo je test


Dakle, ne verujem da postoji greška u ovim potprogramima (jer su rutine iz datascheet-a), ali u MPLAB-u 7.62 i na pločici(u praksi) nema upisa u eeprom. Prilikom simulacije korak po korak u MPLAB-u dolazim na labelu write_error, znači nema upisa.
Potprogram UpisEEprom lepo puni registre, dok u potprogramu Upis registar, EECON2 se ne puni ključem, a EECON1 lepo setuje bitove WREN i WR. Ipak upis u zadatu lokaciju CONFIG_ADDR - EEADR ne postoji.
Gde je greška?????
Da li postoji mogućnost da PLC prebaci zbog dužine celog programa (kao sa tabelom)? Program zauzima preko 500 bajta.
programske memorije.
[ Seme @ 28.02.2008. 11:21 ] @
A sto ne b taj upis odradeos u c mnogo je jednostavnije
Ako se resis reci da ti posaljem neki primer
[ dejan5 @ 29.02.2008. 22:38 ] @
Iako još nisam prešao na C, ili možda PBP , požalji pa da vidim.
Mada bi mi više odgovaralo objašnjenje za ovaj asm.
[ sander @ 01.03.2008. 10:21 ] @
Prvo, da li si pogledao errata dokument za taj mcu, koliko se secam bilo je nekih problema kod upisa u eeprom.

Drugo, kao sto ti je neko predlozio, zar nije lakse sve te stvari raditi u nekom c, basicu, pascali itd. usput mozes da pogledas kako funkcije, komande iz istih izgledaju u asembleru.

U CCS C kompajleru to izgleda ovako (verovatno i za druge c kompajlere):

vrednost = read_eeprom (adresa);

odnosno:

write_eeprom (adresa, vrednost);

e sad ti vidi vredili se muciti sa 50-tak linija koda u asembleru.
[ dejan5 @ 01.03.2008. 16:50 ] @
Problem sam resio inicijalizacijom eeproma:
de 0x00