1

Тема: Atmega88 + IR

http://forum.rcl-radio.ru/uploads/images/2022/03/dbeb764172faabdd21bec74b8e8fc995.png


#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;}