Jump to content

Attiny85 проблема с USI I2C


bepis666
 Share

Recommended Posts

Прошу помощи в реализации интерфейса I2C на Attiny85 в режиме ведомого.

Проблема в следующем:
При срабатывании прерывания по переполнению счетчика, в регистре данных USIDR оказывается полученный байт сдвинутый влево.

Код тестировал в Proteus. На скриншотах показана ячейка памяти 2F, которой соответствует регистр USIDR. 
На первом скриншоте отправляется 0x00, в USIDR оказывается 0x01; на втором скриншоте отправляется 0x01, в USIDR - 0x03.

Думал проблема в симуляции, но нет. Тестировал в железе - то же самое.

Заранее благодарю!

Код:

// Инициализация I2C интерфейса
void i2c_init()
{
        
    // Настройка интерфейса USI на режим TWI 
    USICR |= (1<<USIWM0);
    USICR |= (1<<USIWM1);
    
    // Настройка интерфейса на источник тактирования
    USICR &= ~(1<<USICLK);
    USICR &= ~(1<<USICS0);
    USICR |= (1<<USICS1);
    
    // Выставление пинов интерфейса на вход
    // SDA
    DDRB &= ~(1<<0);    
    PORTB  &= ~(1<<0);    
    // SCL
    DDRB &= ~(1<<2);    
    PORTB  &= ~(1<<2);    
    
    // Включение прерывания по старту и очистка флага прерывания
    USICR |= (1<<USISIE);
    USISR |= (1<<USISIF);
}

// Прерывание по старту 
ISR(USI_START_vect){
    
    while( (PINB & (1 << PIN_SCL)) && (!(PINB & (1 << PIN_SDA))) );
            
    // Очистка регистра статуса
    USISR |= (1<<USISIF);

    // Включение прерывания по переполнению
    USICR |= (1<<USIOIE);
    
}

// Прерывание по переполнению счетчика
ISR(USI_OVF_vect){    
    
    uint8_t i2c_byte = USIDR;
    
    *pwm_0 = 0;
        
    if (i2c_byte>=1){
        *pwm_0 = 250;
    }
        
    if (i2c_byte==1){
        *pwm_0 = 100;
    }
    
    USISR |= (1<<USIOIF);        // Сброс флага прерывания по переполнению
    USISR = 0;                // Сброс счетчика
    
}

 

1.png

2.png

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

@aitras
Пробовал, результат тот же.
Еще заметил, что после отправки байта, регистр 2E находится в значении 0100 0010, что соответствует значению счетчика 2 и выставленному флагу срабатывания прерывания по переполнению. Такое ощущение, что в регистр USIDR попадает бит NACK, который по сути и не должен генерироваться, т.к.  USIWM выставлены в 11, что значит что после срабатывания прерывания по переполнению линия SCL притягивается к нулю и в счетчик и регистр USIDR ничего писаться не должно...

3.png

Link to comment
Share on other sites

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

20 hours ago, bepis666 said:

показана ячейка памяти 2F, которой соответствует регистр USIDR

А почему 2F?

950922120_.png.bfca7408296983de4647cf9a46c94adb.png

Да и чтобы посмотреть регистры, надо в I/O лезть, а не SRAM.
Или у вас в 2F лежит i2c_byte?

С уважением, Михаил, EEP Lab

Link to comment
Share on other sites

Как измерить внутреннее сопротивление литиевого аккумулятора. Измеряем правильно

Внутреннее сопротивление – один из наиболее значимых параметров, от которого напрямую зависят другие характеристики литиевого аккумулятора. От этого параметра зависят такие характеристики источника питания, как напряжение на выходе под нагрузкой, максимальный выходной ток и коэффициент полезного действия (КПД). Рассмотрим как измерить действительное значение внутреннего сопротивления АКБ, используя определенные методики. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...