Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Microchip PIC => Konuyu başlatan: Kevinlomax - 25 Mart 2019, 22:30:34

Başlık: Infrared alıcı kodu
Gönderen: Kevinlomax - 25 Mart 2019, 22:30:34
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(); 
 } 
  } 
 } 
 } 
Başlık: Ynt: Infrared alıcı kodu
Gönderen: volkanunal - 26 Mart 2019, 09:26:27
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
Başlık: Ynt: Infrared alıcı kodu
Gönderen: JOKERAS - 26 Mart 2019, 13:25:28
Sıfır bilgi ile yapacağın hiç bir şey yok Reis:)
İnterrupt Rutin Alıcı koda yazılır, vericiye değil!
Başlık: Ynt: Infrared alıcı kodu
Gönderen: Kevinlomax - 27 Mart 2019, 23:36:58
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.