[an error occurred while processing this directive]
Программирование PCF8583 по I2C
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Игорь 04 июня 2006 г. 21:03

Уважаемые коллеги, подскажите плиз. Пытаюсь программировать 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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru