Problem polega na tym że nie moge poprawnie dogadać się z pamięcią eeprom, program odczytuje mi same wartości 255, i wygląda na to że coś nie tak jest z zapisem, tak jak by nie zapisał poprawnie zmienionych wartosci
Noga WP sciągnieta do masy, pull-up na SDA i SCL jest. pamięc poprawnie podpięta bo przy próbie odczytu (wywołanie adresu 160) nie wywala byka. Procedury działały z innymi układami na i2c i nie było problemu
Procedury do obslugi I2c
Noga WP sciągnieta do masy, pull-up na SDA i SCL jest. pamięc poprawnie podpięta bo przy próbie odczytu (wywołanie adresu 160) nie wywala byka. Procedury działały z innymi układami na i2c i nie było problemu
;*************************************************************************
LOAD:
CALL I2C_STOP ;NA WSZELKI WYPADEK, ZEBY I2C START BYLO PRAWIDŁOWE
CALL I2C_START
MOV A, #160 ;ADRES EEPROMA
CALL I2C_WRITE
MOV ERR_I2C, C
MOV A, #1 ;ADRES KOMURKI
CALL I2C_WRITE
CALL I2C_START
MOV A, #161 ;BO BEDZIEMY ODCZYTYWAC
CALL I2C_WRITE
CLR C
CALL I2C_READ
MOV V_MAX, A
CALL I2C_READ
MOV V_MIN, A
CALL I2C_READ
MOV V_MAN, A
CALL I2C_READ
MOV V_STA, A
CALL I2C_READ
MOV V_STO, A
CALL I2C_READ
MOV SERIA, A
CALL I2C_READ
MOV HAM, A
CALL I2C_READ
MOV TIMEA, A
CALL I2C_READ
MOV TIMEB, A
SETB C
CALL I2C_READ
MOV OCZKA, A
CALL I2C_STOP
RET
;*************************************************************************
SAVE:
CALL I2C_START
MOV A, #160 ;ADRES EEPROMA
CALL I2C_WRITE
MOV ERR_I2C, C
MOV A, #1 ;ADRES KOMURKI
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, V_MAX
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, V_MIN
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, V_MAN
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, V_STA
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, V_STO
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, SERIA
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, HAM
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, TIMEA
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, TIMEB
CALL I2C_WRITE
CALL WAIT_10MS
MOV A, OCZKA
CALL I2C_WRITE
CALL I2C_STOP
CALL LOAD
RET
Procedury do obslugi I2c
;*************************************************************************
I2C_WRITE: ;ZAPISUJE NA I2C ZAWARTOSC ACC. ODDAJE ACK W CY
CLR SCL ;SKASUJ SCL- BO NASTAPI WYSTAWIENIE BITU NA SDA
MOV R2, #8 ;BO OSIEM BITOW DO WYSLANIA
I2W: RLC A ;"WYSTAWIENIE" KOLEJNEGO BITU
MOV SDA, C ;USTAW LINIE SDA
CALL I2C_TAKT ;OPUZNIENIE...
SETB SCL ;\
CALL I2C_TAKT ; >IMPULS SCL
CLR SCL ;/
CALL I2C_TAKT ;OPUZNIENIE...
DJNZ R2, I2W ;JESLI WYSLANO 8 BITOW, TO ODBIERZ ACK
SETB SDA ;PO ZAKANCZENIU TANSMISJI USTAW 1 NA SDA
ACALL I2C_TAKT ;OPUZNIENIE...
SETB SCL ;WYSTAWIENIE IMPULSU ACK
MOV C, SDA ;PRZEPISANIE IMPULSU ACK DO CY->
CLR SCL ;CY=0 TO SLAVE ODPOWIEDZIAŁ
RET ;CY=1 TO SLAVE NIE ODPOWIEDZIAŁ
;****************************************************************************
I2C_READ: ;ZAPISUJE DO ACC WARTOSC Z ODEBRANA Z I2C.
SETB SDA ;Z CY WYSYLANA JEST WIADOMOSC O ACK I NACK
CLR SCL ;TAK PROFILAKTYCZNIE...
MOV R2, #8 ;BO ODBIERZEMY OSIEM BITOW
ACALL I2C_TAKT
I2R: RLC A ;PRZESUN FLAGE I "ODSLON" MSB DO ZAPISU
SETB SCL ;IMPULS SCL I ZDJECIE BITU Z I2C TUZ PRZED OPADNIECIEM
ACALL I2C_TAKT ;SYGNALU NA SCL.
MOV C, SDA ;
CLR SCL ;
ACALL I2C_TAKT ;
DJNZ R2, I2R ;JESLI ODEBRANO 8 BITOW, TO WYSLIJ ACK
RLC A ;PRZEWIN FLAGE NA SWOJE MIEJSCE
MOV SDA , C ;WYSTAW FLAGE NA LINIE SDA
SETB SCL ;\
ACALL I2C_TAKT ; > IMPULS NACK
CLR SCL ;/
RET
;***********************************************************************
I2C_START:
SETB SDA
SETB SCL ;PRZY USTAWIONYM SCL WYZRUJ LINIE SDA->
ACALL I2C_TAKT ;TO JEST WARUNEK STARTU DLA I2C
CLR SDA ;UFAKA! PROGRAM NIE KASUJE BITU SCL
ACALL I2C_TAKT ;
RET
;************************************************************************
I2C_STOP:
CLR SDA
ACALL I2C_TAKT
SETB SCL ;PRZY USTAWIONYM SCL USTAW LINIE SDA->
ACALL I2C_TAKT ;TO JEST WARUNEK STOPU DLA I2C
SETB SDA
RET
;*************************************************************************
I2C_TAKT: ;TAKT ZEGARA I2C 6us DLA KWARCA 24MHz->
NOP ;(MIN. 4us- Z APLIKACJI)
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;*************************************************************************
WAIT_10MS:
MOV R1, #40
MOV R3, #255
MS10: DJNZ R3, $
DJNZ R1, MS10
RET
;*************************************************************************