Muszę zrobić idiotycznie prosty układ odczytujący/zapisujący dane z/do at24cXX (testuję na 04). W programatorze wszystko działa, jednak po podłączeniu do pica - ni wuja :/. Napisałem na szybko prosty symulator wyjść SCL i SDA:
Adres pamięci to 10100001b
Nie dostaję bitu ack (ustawiony jest ciągle na 1). Odległość między kolejnymi bitami na wyjściach to 1ms. Oto kawałek kodu:
Inicjacja (wysłanie adresu+sprawdzenie ACK)
Wysłanie bajtu:
Wysłanie bitu:
Wiem, że na pewno było dużo takich tematów, ale nie mogę sobie poradzić z tym
. Proszę pomóżcie[/img]
![[16f84a][basic/asm] Protokół i^2c [16f84a][basic/asm] Protokół i^2c](https://obrazki.elektroda.pl/1_1289175472_thumb.png)
Adres pamięci to 10100001b
Nie dostaję bitu ack (ustawiony jest ciągle na 1). Odległość między kolejnymi bitami na wyjściach to 1ms. Oto kawałek kodu:
Inicjacja (wysłanie adresu+sprawdzenie ACK)
I2C_START
F2_000009 equ $ ; in [I2C.BAS] LOW SDPIN
Bcf PORTB,5
Bsf STATUS,5
ram_bank = 1
Bcf TRISB,5
F2_000010 equ $ ; in [I2C.BAS] LOW SCPIN
Bcf STATUS,5
ram_bank = 0
Bcf PORTB,4
Bsf STATUS,5
ram_bank = 1
Bcf TRISB,4
F2_000011 equ $ ; in [I2C.BAS] SDA_BYTE=I2C_ADDR
Bcf STATUS,5
ram_bank = 0
Movfw I2C_ADDR
Movwf SDA_BYTE
F2_000012 equ $ ; in [I2C.BAS] GOSUB I2C_SENDBYTE
Call I2C_SENDBYTE
F2_000013 equ $ ; in [I2C.BAS] GOSUB I2C_ACK
Call I2C_ACK
F2_000014 equ $ ; in [I2C.BAS] IF ACK_SUCCESS=1 THEN RETURN
Btfss _B#VR1,1
Goto bc@ll2
Return
Wysłanie bajtu:
I2C_SENDBYTE
F2_000028 equ $ ; in [I2C.BAS] BITSHIFT=%10000000
Movlw 128
Movwf BITSHIFT
F2_000029 equ $ ; in [I2C.BAS] REPEAT
bc@ll3
; Start of Inline Code.
movfw SDA_BYTE
andwf BITSHIFT
btfsc STATUS,2
goto if0
; End of Inline Code.
F2_000036 equ $ ; in [I2C.BAS] SDA_VALUE=1
Bsf _B#VR1,0
F2_000037 equ $ ; in [I2C.BAS] GOTO IFEXIT
Goto IFEXIT
IF0
F2_000039 equ $ ; in [I2C.BAS] SDA_VALUE=0
Bcf _B#VR1,0
IFEXIT
F2_000041 equ $ ; in [I2C.BAS] GOSUB I2C_SENDBIT
Call I2C_SENDBIT
F2_000042 equ $ ; in [I2C.BAS] BITSHIFT=BITSHIFT >> 1
Clrc
Rrf BITSHIFT,F
F2_000043 equ $ ; in [I2C.BAS] UNTIL BITSHIFT=0
Movfw BITSHIFT
Btfss STATUS,2
Goto bc@ll3
bc@ll4
F2_000044 equ $ ; in [I2C.BAS] RETURN
Return
Wysłanie bitu:
I2C_SENDBIT
F2_000020 equ $ ; in [I2C.BAS] SDPIN=SDA_VALUE
; Bit_Bit _B#VR1,0,PORTB,5
Bsf PORTB,5
Btfss _B#VR1,0
Bcf PORTB,5
F2_000021 equ $ ; in [I2C.BAS] DELAYMS 1
Movlw 1
Call dl@ms
F2_000022 equ $ ; in [I2C.BAS] SCPIN=1
Bsf PORTB,4
F2_000023 equ $ ; in [I2C.BAS] DELAYMS 1
Movlw 1
Call dl@ms
F2_000024 equ $ ; in [I2C.BAS] SCPIN=0
Bcf PORTB,4
F2_000025 equ $ ; in [I2C.BAS] RETURN
Return
Wiem, że na pewno było dużo takich tematów, ale nie mogę sobie poradzić z tym
