Infrared alıcı kodu

Başlatan Kevinlomax, 25 Mart 2019, 22:30:34

Kevinlomax

Merhaba,
PIC hakkında sıfır bilgi ve tecrübeye sahibim. Yapmak istediğim projenin bir benzerinin PIC için yapılmışını buldum. Ancak alıcı kısmında kodların bir kısmını anlayamadım. void main() in üstünde kalan kodları açıklarsanız çok sevinirim.

unsigned int count=0,sgnal=0;  
int i=7,j=0,xr=0;  
char txt[]="........";  
char val[]="........";  
void timer_routin(){  
count++;  
  if(count>0xFF){  
  count=0;  
  TMR0L=0;  
  }  
}  

void interrupt()  
{  
if(INTCON.TMR0IF){  
  timer_routin();  
  INTCON.TMR0IF=0;  
}  
if(INTCON.INT0IF){  
  
  xr=count;  
  count=0;  
  TMR0L=0;  
  if(i<0){ i=7; }  
  if(xr==3){ // you may use if(xr==3||xr==4||xr==2){...}
  val[i]='0';  
  i--;  
  if(i<0){ i=7; }  
  }  
  else if(xr==6){  // you may use if(xr==5||xr==6||xr==7){...}
  val[i]='1';  
  i--;  
  if(i<0){ i=7; }  
  }  
  else{  
        /// For start signal or Repeat signal , i=0 and start to count  
  TMR0L=0;  
  i=7;  
  count=0;  
  }  
  INTCON.INT0IF=0;  
}  
}  
void main()  
{  
  ADCON1=0x0F;  
  CMCON=7;  
  TRISB=0x01;  
  PORTB.F6=0;  
    PORTB.F5=0;  
    PORTB.F4=0;  
    PORTB.F3=0;  
    T0CON=0xC1;  
  TMR0L=0;  
  INTCON.GIE=1;  
  INTCON.PEIE=1;  
  INTCON.TMR0IE=1;  
  INTCON.INT0IE=1;  
  INTCON.TMR0IF=0;  
  INTCON.INT0IF=0;  
  INTCON2.RBPU=1; // DISABLE PULUP REGISTER  
  INTCON2.INTEDG0=0;  
  while(1){  
  if(val[7]==val
[li]){ [/li]
  txt[7]=val[7];  
  }  
  if(val[6]==val[1]){  
  txt[6]=val[6];  
  }  
  if(val[5]==val[2]){  
  txt[5]=val[5];  
  }  
  if(val[4]==val[3]){  
  txt[4]=val[4];  
  }  
if(txt[4]=='0' && txt[5]=='0' && txt[6]=='0' && txt[7]=='1') {  
    PORTB.F6=1;  
    PORTB.F5=0;  
    PORTB.F4=0;  
    PORTB.F3=0;  
  }  
if(txt[4]=='0' && txt[5]=='0' && txt[6]=='1' && txt[7]=='0') {  
    PORTB.F6=0;  
    PORTB.F5=1;  
    PORTB.F4=0;  
    PORTB.F3=0;  
  }  
if(txt[4]=='0' && txt[5]=='0' && txt[6]=='1' && txt[7]=='1') {  
    PORTB.F6=0;  
    PORTB.F5=0;  
    PORTB.F4=1;  
    PORTB.F3=0;  
  }  
if(txt[4]=='0' && txt[5]=='1' && txt[6]=='0' && txt[7]=='0') {  
    PORTB.F6=0;  
    PORTB.F5=0;  
    PORTB.F4=0;  
    PORTB.F3=1;  
  }  
  }  
}


Bu da alıcı kodu
#define address  0xff  
  #define command_1 0xFF  
  #define command_2 0x81  
  #define command_3 0x42  
  #define command_4 0xC3  
  #define command_5 0x24  
 unsigned int i=0,j=0;  
 void repeat(){  
 PWM1_Start();  
 delay_us(8000);  
 PWM1_Stop();  
 delay_us(8000);  
 }  
  send_data_byte(unsigned char dattt){  
   PWM1_init(36000);  
 PWM1_Set_Duty(127);  
  for(j=0;j<8;j++){  
 PWM1_Start();  
 delay_us(562);  
 PWM1_Stop();  
  if(dattt & 0x01){  
  delay_us(1687);  
  dattt=dattt>>1;  
  }  
 else  
  {  
  delay_us(562);  
   dattt=dattt>>1;  
  }  
  }  
 PWM1_Stop();  
  }  
  void send_data_command(unsigned char dat){  
  PWM1_init(36000);  
 PWM1_Set_Duty(127);  
 PWM1_Start();  
 delay_us(9000);  
 PWM1_Stop();  
 delay_us(4500);  
  send_data_byte(dat);  
  repeat();  
  }  
 void main() {  
 ADCON1=0x0F;  // disable ADC converter  
 CMCON=7; // to disable comparator  
 TRISA.F0=1;  
 TRISA.F1=1;  
 TRISA.F2=1;  
 TRISA.F3=1;  
 TRISC.F2=0;  
  
  PORTC.F2=0;  
 while(1){  
  if(PORTA.F0==0){  
 send_data_command(command_2);  
 while(PORTA.F0==0){  
 repeat();  
 }  
  }  
  if(PORTA.F1==0){  
 send_data_command(command_3);  
 while(PORTA.F1==0){  
 repeat();  
 }  
  }  
   if(PORTA.F2==0){  
 send_data_command(command_4);  
 while(PORTA.F2==0){  
 repeat();  
 }  
  }  
    if(PORTA.F3==0){  
 send_data_command(command_5);  
 while(PORTA.F3==0){  
 repeat();  
 }  
  }  
 }  
 } 

volkanunal

Merhabalar ir protokolü altında bazı yapılar var. Bunlar NEC, SONY , RC5 gibi. Bana NEC protokolünü taklit etmeye çalışmış gibi geldi.  Öncesinde bir taşıyıcı sinyal oluşturuluyor pwm init ettğini fonksiyon içerisinde , bir duty cycle değeri belirleniyor  ve data gönderilirken modülasyon işlemi gerçekleştiriliyor. orada koyduğu 9000 , 4500 gibi değerler prokolün kendisinde olan değerler. Fakat bu kodun doğru çalışacağını düşünmüyorum. 36khz ayarlanmış , data gönderme işleminde mark ve space durumları gözardı edilmiş.

https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
Primum nil nocere

JOKERAS

Sıfır bilgi ile yapacağın hiç bir şey yok Reis:)
İnterrupt Rutin Alıcı koda yazılır, vericiye değil!

Kevinlomax

Alıntı yapılan: volkanunal - 26 Mart 2019, 09:26:27Merhabalar ir protokolü altında bazı yapılar var. Bunlar NEC, SONY , RC5 gibi. Bana NEC protokolünü taklit etmeye çalışmış gibi geldi.  Öncesinde bir taşıyıcı sinyal oluşturuluyor pwm init ettğini fonksiyon içerisinde , bir duty cycle değeri belirleniyor  ve data gönderilirken modülasyon işlemi gerçekleştiriliyor. orada koyduğu 9000 , 4500 gibi değerler prokolün kendisinde olan değerler. Fakat bu kodun doğru çalışacağını düşünmüyorum. 36khz ayarlanmış , data gönderme işleminde mark ve space durumları gözardı edilmiş.

https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol


Sağolun.
Verici yerine alttaki koda da alıcı yazmışım kusura bakmayın.