[an error occurred while processing this directive]
|
|
NAME i2c
#define __i2c_port 0x03
#define __scl_bit 2
#define __sda_bit 3
#define __i2c_dir __i2c_port-1
#define __i2c_pin __i2c_port-2
public i2c_init,i2c_start,i2c_stop,i2c_read,i2c_write
RSEG CODE
i2c_init:
cbi __i2c_port,__scl_bit
cbi __i2c_port,__sda_bit
sbi __i2c_dir,__scl_bit
cbi __i2c_dir,__sda_bit
rjmp __i2c_delay2
i2c_start:
cbi __i2c_dir,__sda_bit
cbi __i2c_dir,__scl_bit
clr r16
nop
sbis __i2c_pin,__sda_bit
ret
sbis __i2c_pin,__scl_bit
ret
rcall __i2c_delay1
sbi __i2c_dir,__sda_bit
rcall __i2c_delay1
sbi __i2c_dir,__scl_bit
ldi r16,1
__i2c_delay1:
ldi r22,10
rjmp __i2c_delay2l
i2c_stop:
sbi __i2c_dir,__sda_bit
sbi __i2c_dir,__scl_bit
rcall __i2c_delay2
cbi __i2c_dir,__scl_bit
rcall __i2c_delay1
cbi __i2c_dir,__sda_bit
__i2c_delay2:
ldi r22,20
__i2c_delay2l:
dec r22
brne __i2c_delay2l
ret
i2c_read:
ldi r23,8
clr r30
__i2c_read0:
cbi __i2c_dir,__scl_bit
rcall __i2c_delay2
clc
sbic __i2c_pin,__sda_bit
sec
sbi __i2c_dir,__scl_bit
rcall __i2c_delay2
rol r30
dec r23
brne __i2c_read0
mov r23,r16
mov r16,r30
; ld r23,y+
tst r23
brne __i2c_read1
cbi __i2c_dir,__sda_bit
rjmp __i2c_read2
__i2c_read1:
sbi __i2c_dir,__sda_bit
__i2c_read2:
rcall __i2c_delay1
cbi __i2c_dir,__scl_bit
rcall __i2c_delay2
sbi __i2c_dir,__scl_bit
rcall __i2c_delay1
cbi __i2c_dir,__sda_bit
rjmp __i2c_delay1
i2c_write:
mov r30,r16
; ld r30,y+
ldi r23,8
__i2c_write0:
lsl r30
brcc __i2c_write1
cbi __i2c_dir,__sda_bit
rjmp __i2c_write2
__i2c_write1:
sbi __i2c_dir,__sda_bit
__i2c_write2:
rcall __i2c_delay2
cbi __i2c_dir,__scl_bit
rcall __i2c_delay2
sbi __i2c_dir,__scl_bit
dec r23
brne __i2c_write0
cbi __i2c_dir,__sda_bit
rcall __i2c_delay1
cbi __i2c_dir,__scl_bit
rcall __i2c_delay2
ldi r16,1
sbic __i2c_pin,__sda_bit
clr r16
sbi __i2c_dir,__scl_bit
ret
END
E-mail: info@telesys.ru