Ср ноя 29, 2023 19:54:01
// Инициализация 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; // Сброс счетчика
}
Ср ноя 29, 2023 23:17:49
Сб дек 02, 2023 14:20:12
Вс дек 03, 2023 06:34:55
Вс дек 03, 2023 18:45:17
// Прерывание по старту
ISR(USI_START_vect){
i2c_flag = 1;
// Очистка регистра статуса
USISR |= (1<<USISIF);
// Включение прерывания по переполнению
USICR |= (1<<USIOIE);
USISR = 0;
}
// Прерывание по переполнению счетчика
ISR(USI_OVF_vect){
uint8_t i2c_byte = USIDR;
// Сверка адреса устройства с адресом во фрейме
if (i2c_flag==1) {
if (i2c_byte>1){
*pwm_0 = 250;
}
if (i2c_byte==0){
*pwm_0 = 128;
}
}
USISR |= (1<<USIOIF); // Сброс флага прерывания по переполнению
USISR = 0; // Сброс счетчика
}
Сб дек 09, 2023 20:32:28