Pembacaan Kode Remote TV Samsung

Beberapa waktu yang lalu saya mencoba untuk me-remote modul mikrokontroler atmega128 dengan remote TV samsung untuk suatu keperluan. Konfigurasi hardware nya adalah receiver IR biasa saya koneksikan ke PINA.0 dan kemudian membaca data yang diterima receiver tadi dari remote TV Samsung. Saya menggunakan osiloskop untuk melihat data yang diterima untuk kemudian didekodekan menurut kesimpulan saya sendiri. Berikut coretan data hasil capture menggunakan osiloskop dari tombol 1, 2, dan 3.

Dari ketiga data di atas dan dari tampilan gambar sinyal di osiloskop (gambar langsung di osiloskop jadi tidak saya post) akhirnya saya mengambil 16 bit data terakhir. Dari bentuk dan lebar perioda data, maka saya buat kesimpulan bahwa 1 bit data diwakili oleh 1 puncak (high) dan 1 lembah (low) sinyal, yang membedakan data bit 0 atau 1 adalah lebar perioda puncaknya (high). Berikut kesimpulan saya.

Dari tabel kesimpulan di atas maka saya buat code untuk meng-capture data tersebut dalam bahasa C.

#define input_ir PINA.0
unsigned int receive()
{           
unsigned char i,count;
unsigned int data_ir;        
awal:        
        count = 0;    
        while(input_ir); //tunggu sampai low
        while(~input_ir) //detek lebar low
        {
                delay_us(100);
                count++;
        }          
        if(count<40)goto awal;

        for(i=0;i<29;i++)delay_ms(1);  
        while(input_ir); //tunggu sampai low
        for(i=0;i<16;i++)
        {          
                count=0;
                while(~input_ir);  
                while(input_ir)
                {
                        count++;
                        delay_us(100);
                }       
                if(i<15)
                {          
                        if(count<8)//data 0
                        {
                                data_ir = data_ir << 1;         
                        }
                        else //data 1
                        {                              
                                data_ir++;
                                data_ir = data_ir << 1;       
                        }
                }
                else
                        data_ir++;        
        }  
        return (data_ir);    
}

Berikut adalah contoh kodingan dari aplikasi yang saya buat dengan menggunakan kodingan fungsi di atas.

/*****************************************************
Chip type           : ATmega128
Program type        : Application
Clock frequency     : 16 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 1024
*****************************************************/

#include <mega128.h>
#include <delay.h>     

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>   
#include <stdio.h>   

unsigned char kata[16]; 
unsigned int data_buff;

#define input_ir PINA.0
unsigned int receive()
{           
unsigned char i,count;
unsigned int data_ir;        
awal:        
        count = 0;    
        while(input_ir); //tunggu sampai low
        while(~input_ir) //detek lebar low
        {
                delay_us(100);
                count++;
        }          
        if(count<40)goto awal;

        for(i=0;i<29;i++)delay_ms(1);  
        while(input_ir); //tunggu sampai low
        for(i=0;i<16;i++)
        {          
                count=0;
                while(~input_ir);  
                while(input_ir)
                {
                        count++;
                        delay_us(100);
                }       
                if(i<15)
                {          
                        if(count<8)//data 0
                        {
                                data_ir = data_ir << 1;         
                        }
                        else //data 1
                        {                              
                                data_ir++;
                                data_ir = data_ir << 1;       
                        }
                }
                else
                        data_ir++;        
        }  
        return (data_ir);    
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In 
// State4=T State3=T State2=T State1=T State0=T 
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
ETIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

lcd_init(16);

lcd_gotoxy(0,0);  
lcd_putsf("tes");
delay_ms(1000);
while (1)
      {
      // Place your code here 
        data_buff = receive();
        lcd_clear();        
        lcd_gotoxy(0,0);  
        lcd_putsf("capture");
        lcd_gotoxy(0,1);  
        sprintf(kata,"%u",data_buff); 
        lcd_puts(kata);     

        switch(data_buff)
        {
                case 34935 :    DDRA.1 = 1; PORTA.1 = 0; // OFF kembang api
                                DDRA.2 = 1; PORTA.2 = 0; 
                                break;//0
                case 8415  : DDRA.1 = 1; PORTA.1 = 1; break;//1 ON kembang api 1 
                case 41055 : DDRA.2 = 1; PORTA.2 = 1; break;//2 OFF kembang api 2
                case 24735 : DDRA.4 = 1; PORTA.4 = 1;  break;//3
                case 4335  : DDRA.4 = 1; PORTA.4 = 0;  break;//4
                case 36975 : break;//5
                case 20655 : break;//6
                case 12495 : break;//7
                case 45135 : break;//8
                case 28815 : break;//9
        }

        delay_ms(500);
      };
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s