rhf-admin писал(а):Да-а-а. Вроде должно работать... но это только при условии, что в момент, когда мы пытаемся читать PCF-ка уже успела запуститься.
Итак, я предлагаю, во-первых сделать проверку Ack от PCF-ки после того как мастер выдал в шину адрес микрухи и ячейки памяти. И если Ack не получен - стоп на шину, пауза и потом следующая попытка.
Второе. Я в проге вижу, где устанавливается что Ack после последнего байта не нужен. Но не вижу где устанавливается, что до этого он нужен. Если конечно в ответ на установку адреса микрухи и адреса ячейки памяти от слэйва получены Ack, то во флагах так и останется ноль и при считывании будет считаться что мастеру нужно посылать Ack... Так, опять упёрлись в то, что нужно проверять, что отвечает слэйв на адресацию...
Код: Выделить всё
; подпрограма считывания времени из pcf8583 НАЧАЛО
GetTimeI2C:
cbr I2C_flags,0b00000001 ; ack - НУЖЕН. НЕ последний байт
rcall Start_uslovie ; старт шины
ldi BTS, 0xA0 ; выдали адрес часов на запись
rcall Send_Byte
ldi BTS, 0x02 ; выдали адрес ячейки памяти байт
rcall Send_Byte
rcall Start_uslovie ; повторный старт
ldi BTS, 0xA1 ; выдали адрес часов на чтение
rcall Recieve_Byte ; забрали байт секунд
mov tmp2,RDB ; сохранили байт в буфере
rcall Load_Buff_TX
rcall Recieve_Byte ; забрали байт минут
mov tmp2,RDB ; сохранили байт в буфере
rcall Load_Buff_TX
sbr I2C_flags,0b00000001 ; ack - НЕ нужен. ПОСЛЕДНИЙ байт
rcall Recieve_Byte ; забрали байт часов
mov tmp2,RDB ; сохранили байт в буфере
rcall Load_Buff_TX
rcall Stop_uslovie ; Стоп шины
TX_RUN ; отправили результат работы
проверить бит регистра I2C_flags на предмет поднят или нет, после адресации?
ещё как быть с мультимастерным режимом? проверять есть ли нули на шине перед началом карусели с адресацией/записью/считыванием?
просто помимо тини2313 у меня будет ещё 3 мастера минимум, и каждый из них будет обращаться к pcf8583. каждый из них будет уже с аппаратным и2ц (тиньку использую как случайный памятник своей жмотистости)
з.ы. и чё я мегу8 пожмотил(