Здравствуйте. У меня есть проект на тини2313 (думаю, основной код не нужен), и я там использую I2c, то есть USI. А так как USI даёт только сдвиговый регистр данных, а всю логику I2c нужно реализовывать практически программно. Поэтому я решил не заморачиваться и использовать тяжёлую библиотеку tinywireM. И весь код занял ровно 100% памяти, 2048 байт. Но теперь мне нужно добавить отладку ввиде писка бипера, и даже на такую простую задачу памяти не хватает. Поэтому я наконец решил написать свой драйвер. Вот его код:
‘’’
#define ACK() USIDR = 0; USICR |= (1<<USITC)
#define NACK() USIDR = 255; USICR |= (1<<USITC)
inline void USI_begin(){
DDRB |= (1<<SDA)|(1<<SCL);
};
inline uint8_t USI_transmit(uint8_t addr){
PORTB |= (1<<SDA)|(1<<SCL);
PORTB &= \~(1<<SDA);
PORTB &= \~(1<<SCL);
USICR = 0x12; //USI enable
USIDR = addr;
USISR |= (1<<USIOIF);
while(!(USISR & (1<<USIOIF))){
USICR |= (1<<USITC);
};
if(PINB & (1<<SDA)) return 1; //NACK error
return 0; //success
};
void USI_send(uint8_t data){
USIDR = data;
USISR |= (1<<USIOIF);
while(!(USISR & (1<<USIOIF))){
USICR |= (1<<USITC);
};
};
uint8_t micro_buffer[4];
uint32_t USI_readbytes(uint8_t quantity){
for(uint8_t \_ = 0; \_ < quantity; \_++){
USISR |= (1<<USIOIF);
while(!(USISR & (1<<USIOIF))){
USICR |= (1<<USITC);
};
micro_buffer\[\_\] = USIDR;
ACK();
};
NACK();
};
void USI_stop(){
USICR = 0; //USI disable
PORTB &= \~((1<<SDA)|(1<<SCL));
\_delay_ms(1); //для стабилизации
PORTB |= (1<<SCL);
\_delay_us(100);
PORTB |= (1<<SDA);
};
‘’’
Пожалуйста, извините, что использую форум не по назначению, но пожалуйста, подскажите мне места, в которых есть критические ошибки. Я пробовал спросить про это у ИИ, но он то видит ошибки, где их нет, то не замечает их, поэтому приходится спросить тут, пожалуйста, извините.

