[an error occurred while processing this directive]
|
Уважаемые коллеги, подскажите плиз. Пытаюсь программировать PCF8583 на AT90S2313 по I2C. Чтение работает железно, а вот запись - очень редко срабатывает. Подскажите, что не так? Для записи памяти использую процедуру PCFPutData.
Программа:
; XTAL = 8,867
;*****************************************************
; Internal I2C
.equ SDA=PD0
.equ SCL=PD1
.equ I2C_PORT = PORTD
.equ I2C_PIN = PIND
.equ I2C_DDR = DDRD
I2CInit:
sbi I2C_DDR, SDA
sbi I2C_DDR, SCL
sbi I2C_PORT, SDA
sbi I2C_PORT, SCL
ret
I2CStart:
sbi I2C_PORT, SDA
sbi I2C_PORT, SCL
cbi I2C_PORT, SDA
cbi I2C_PORT, SCL
ret
I2CStop:
cbi I2C_PORT, SDA
sbi I2C_PORT, SCL
nop
sbi I2C_PORT, SDA
ret
I2CPutByte:
push Temp1
ldi Temp1, 0x08
l1:
clc
adc Temp, Temp
brcc l2
sbi I2C_PORT, SDA
rjmp l3
l2: cbi I2C_PORT, SDA
l3: rcall I2CPauseSCL
sbi I2C_PORT, SCL
rcall I2CPauseSCL
cbi I2C_PORT, SCL
rcall I2CPauseSCL
dec Temp1
brne l1
cbi I2C_DDR, SDA
sbi I2C_PORT, SDA
rcall I2CPauseSCL
sbi I2C_PORT, SCL
rcall I2CPauseSCL
sbi I2C_DDR, SDA
cbi I2C_PORT, SCL
rcall I2CPauseSCL
pop Temp1
ret
I2CGetByte:
push Temp1
clr Temp
cbi I2C_PORT, SDA
cbi I2C_DDR, SDA
ldi Temp1, 0x08
clc
l4:
sbi I2C_PORT, SCL
rcall I2CPauseSCL
sbic I2C_PIN, SDA
rjmp l5
clc
rjmp l6
l5:
sec
l6:
adc Temp,Temp
cbi I2C_PORT, SCL
rcall I2CPauseSCL
dec Temp1
brne l4
sbi I2C_DDR, SDA
rcall I2CPauseSCL
cbi I2C_PORT,SDA ; Acknowledge Pulse
rcall I2CPauseSCL
sbi I2C_PORT, SCL
rcall I2CPauseSCL
cbi I2C_PORT, SCL
rcall I2CPauseSCL
pop Temp1
ret
I2CPauseSCL:
push Temp
ldi Temp, 50
l7: nop
dec Temp
brne l7
pop Temp
ret
;**********************************************************
; PCF8583
;**********************************************************
; Temp - addr
; Temp1 - count
; X - address of data
PCFPutData:
push Temp
push Temp1
rcall I2CStart
push Temp
ldi Temp, PCF8583_ADDR ; Adresse des Chips senden
rcall I2CPutByte
pop Temp
rcall I2CPutByte
pcf_0:
ld Temp, X+
rcall I2CPutByte
dec Temp1
brne pcf_0
rcall I2CStop
pop Temp1
pop Temp
ret
E-mail: info@telesys.ru