Я думал что вот это:
USISR = (0<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|(0xE<<USICNT0);
while ( !(USISR & ( (1<<USISIF)|(1<<USIOIF) )) );
должно отвечать, но как то не очень получается )))
написал вместо этого дикость типа:
DDR_USI |= (1<<PORT_USI_SDA);
PORT_USI &= ~(1<<PORT_USI_SDA);
asm volatile ("NOP" :

;
PORT_USI |= (1<<PORT_USI_SDA);
DDR_USI &= ~(1<<PORT_USI_SDA);
как ни странно стало лучше, протеус по крайней мере теперь видит этот ack, ну а дальше все равно фигня...
Вот протокол обмена с часиками
S D0 A 00 A Sr D1 A 55 A 57 A 17 A 02 A 31 A 01 A 11 N P
А вот с тинкой
S 4C N P
иногда вот так
S 4C N Sr P
и после шаманства вот так
S 4C A 41 N P
кстати в инициализации должно бы быть DDR_USI |= (1<<PORT_USI_SCL); но протеус этого вообще не переваривает (
Сообщение отредактировал AlexTech - Jan 31 2011, 15:09