Есть ATtiny45 по i2c к ней в Proteus подключен i2c debuger. SDA и SCL подтянуты на питание резисторами (параметр цифровой для резисторов выставлен).
В ATtiny45 USI инициализируется как:
- Код: Выделить всё • Развернуть
void USI_init (void){
DDR_USI |= ( 1 << PORT_USI_SCL ) | ( 1 << PORT_USI_SDA );
PORT_USI |= ( 1 << PORT_USI_SCL );
PORT_USI |= ( 1 << PORT_USI_SDA );
DDR_USI &= ~( 1 << PORT_USI_SDA );
USICR =
(1 << USISIE) | (0 << USIOIE) |
(1 << USIWM1) | (0 << USIWM0) |
(1 << USICS1) | (0 << USICS0) | (0 << USICLK) |
(0 << USITC);
USISR = (1 << USISIF) | (1 << USIOIF) | (1 << USIPF) | (1 << USIDC)|(0x00 << USICNT0 );
}
В обработчик события СТАРТ
- Код: Выделить всё • Развернуть
ISR (SIG_USI_START) {
Next_Faze = 0;
DDR_USI &= ~( 1 << PORT_USI_SDA );
while ( ( PIN_USI & ( 1 << PIN_USI_SCL ) ) && !( ( PIN_USI & ( 1 << PIN_USI_SDA ) ) ) );
if ( !( PIN_USI & ( 1 << PIN_USI_SDA ) ) ) {
USICR = ( 1 << USISIE ) | ( 1 << USIOIE ) |
( 1 << USIWM1 ) | ( 1 << USIWM0 ) |
( 1 << USICS1 ) | ( 0 << USICS0 ) | ( 0 << USICLK ) |
( 0 << USITC );
}
else {
USICR = ( 1 << USISIE ) | ( 0 << USIOIE ) |
( 1 << USIWM1 ) | ( 0 << USIWM0 ) |
( 1 << USICS1 ) | ( 0 << USICS0 ) | ( 0 << USICLK ) |
( 0 << USITC );
}
USISR = (1 << USISIF) | (1 << USIOIF) | (1 << USIPF) |(1 << USIDC) |
(0x0 << USICNT0);
}
Т.е. все вроде ctrl+c ctrl+v из AVR312
Но что имеем см. картинку
Что событие СТАРТ происходит 3 раза. 1-ый как положено, а вот 2-о1 и 3-й как то не в тему. Ну и понятно что прерывание по переполнению счетчика не вызывается.
Может кто подскажет сцепку ptoteus+attiny+usi+i2c можно отладит не в железе?