Тема: Atmega88 + IR
#define IR_IN PC3
#include <avr/io.h>
#include <util/delay.h>
#include <Wire_low.h> // http://forum.rcl-radio.ru/viewtopic.php?pid=5521#p5521
#include <Lcd1602_i2c_low.h> // http://rcl-radio.ru/wp-content/uploads/2022/03/Lcd1602_i2c_low.zip
Lcd1602_i2c_low lcd(0x27);// адрес I2C
bool data[96],st,st1,raz;
uint32_t cod;
byte i1,i2,s;
unsigned long data_ir;
int main(){
wire_set(12000000,100000); // тактовая частота контроллера, частота шины I2C
lcd.setInit();
lcd.Clear(); // очистка экрана
lcd.led(1); // включение и отключение подсветки экрана
////////// TIMER_1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (12000000/((6749+1)x1)) = 562.5 mks
OCR1A = 6749;
TCCR1B |= (1 << WGM12);
// Prescaler 1
TCCR1B |= (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
sei();
while(1){
lcd.Curs(0,0);
lcd.PrintString("IR_CODE");
if(raz==1){
lcd.Clear();
data_ir = IR();
String stringVar = String(data_ir, HEX);
char charVar[10];
stringVar.toCharArray(charVar, 10);
lcd.Curs(1,0);
lcd.PrintString(charVar);
_delay_ms(200);
}
}}
ISR(TIMER1_COMPA_vect){
if(((PINC >> IR_IN) & 1)==0&&st==0&&raz==0){st=1;OCR1A = 6749;}
if(st==1){s++;}
if(s>20&&((PINC >> IR_IN) & 1)==0){st1=1;}
if(st1==1){data[i1]=((PINC >> IR_IN) & 1);i1++;}
if(i1>96){i1=0;s=0;st=0;raz=1;st1=0;TCCR1B &= ~(1 << CS10); }
}
uint32_t IR(){
_delay_ms(100);
cod=0;i2=0;
for(int ai=0;ai<96;ai++){
if(data[ai] + data[ai+2] == 2){cod += ((uint32_t)0 << 31-i2);i2++;ai=ai+1;}
if(data[ai] + data[ai+2] == 1){cod += ((uint32_t)1 << 31-i2);i2++;ai=ai+3;}}
raz=0;
TCCR1B |= (1 << CS10);OCR1A = 239;//50000 kHz
if(cod==1||cod>0x7fffffff){cod=0xFFFFFFFF;}
return cod;}