Перейти к содержанию

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


bepis666

Рекомендуемые сообщения

Прошу помощи в реализации интерфейса 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

Ссылка на комментарий
Поделиться на другие сайты

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

3.png

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

20 hours ago, bepis666 said:

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

А почему 2F?

950922120_.png.bfca7408296983de4647cf9a46c94adb.png

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

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...