Hello. I have written a program to analyze footprint of signal of keys from IR-remote and do something on pressing different keys on IR-remote. For example - play/pause winamp playing and so on :) As i cant find the finished code for JAL for different IR protocols I would like to share my code with anyone who using JAL :)
Schematic is simple - the significant detail is than IR reciever TSOPxxx connected to INT0(RB0) pin on MC and have pull up resistor on this connect The main idea of this program to measure ticks of timer1 between interrupts from INT0. Conver this intervals to 'binary' array that convert to dwrod variable and have a keycode of any key on IR-remote. -------------------- -- ----------------------------------------------------------------------------- -- Title: demo of analyze of IR-remote timing between interrupts from -- TSOP IR reciver, and so a footprint of signal of different keys from IR-remote -- Author: Alexey Studenikin [email protected] , Copyright (c) 2011, all rights reserved. ;@jallib section chipdef -- chip setup include 18f4550 -- even though the external crystal is 20 MHz, the configuration is such that -- the CPU clock is derived from the 96 Mhz PLL clock (div2), therefore set -- target frequency to 48 MHz pragma target clock 48_000_000 include delay include usb_serial include print include pic_data_eeprom alias led is pin_b6 pin_b6_direction = output led = off alias led2 is pin_b7 pin_b7_direction = output led2=off alias led3 is pin_b5 pin_b5_direction = output led3=off var bit IR_pin is pin_B0 pin_B0_direction = input -- set up interrupts INTCON_INT0IE = on -- allow interrupt from changing state on INT0 INTCON_INT0IF = off -- flush flag of interrupt from INT0 INTCON2_INTEDG0 = 1 -- setting up inerrupt INT0 from changing state 0- >1 INTCON_GIE = on -- allow interrupts -- setting up timer T1CON_T1CKPS = 0b_11 -- prescale to 8 T1CON_TMR1CS = 0 -- clock source from internal clock PIE1_TMR1IE = on -- allow interrup from TMR1 PIR1_TMR1IF = off -- flush flag of interrupt TMR1 INTCON_PEIE = on -- allow interrupt T1CON_TMR1ON = off -- stoping timer const byte len=50 ;length of array of intervals between interrupts from int0 var byte buttonnumber=0 -- if first press of button var byte trainH[len] ; array of Hight byte of TMR1 var byte trainL[len] var byte trainnum=0 ;current position in array var byte realtrainlen=0 ;real lenght of train procedure INT_ISR is pragma interrupt if INTCON_INT0IF then -- if interrupt from INT0 INTCON_INT0IF = off -- flushing flag if (buttonnumber==0) then -- if first packet in train - initialize timer and variables buttonnumber=buttonnumber+1 trainnum=0 TMR1H=0 TMR1L=0 T1CON_TMR1ON=on end if if (buttonnumber>0) then ; T1CON_TMR1ON = off ;stopping timer while writing trainH[trainnum]= TMR1H trainL[trainnum]= TMR1L trainnum=trainnum+1 TMR1H=0 ; zeroing timer TMR1L=0 T1CON_TMR1ON = on ;starting timer again end if end if if PIR1_TMR1IF then -- if we have interrupt from timer that means that train of packets have finished PIR1_TMR1IF = off -- flushing flag T1CON_TMR1ON = off ; stopping timers PIE1_TMR1IE = off ; disabling interrupt from timer realtrainlen=trainnum trainnum =len ; making 'flag' to start procedure of analyzing whole train end if end procedure -- constants const byte str_welcome[] = "JALLIB USB Serial Demo app\n" -- setup the USB serial library usb_serial_init() var bit has_shown_welcome_msg = true var byte ch var byte i=0 var byte i1=0 var dword keynum=0 -- main loop forever loop -- poll the usb ISR function on a regular base, in order to -- serve the USB requests usb_serial_flush() -- check if USB device has been configured by the HOST if ( usb_cdc_line_status() != 0x00 ) then if !has_shown_welcome_msg then has_shown_welcome_msg = true print_string( usb_serial_data, str_welcome ) end if else has_shown_welcome_msg = false end if ;if we already have len(full) 'bits' and 'ticks' var word t=0 if (trainnum>=len) then ;while thinking of data we dont need interrupts INTCON_INT0IE=off T1CON_TMR1ON = off PIE1_TMR1IE = off keynum=0 print_crlf(usb_serial_data) ;in my IR-remote the meaningful information int between 17 and 17+17 "bits" ;so lets convert from high byte of timer ticks between int0 to binary dword 'keynumber' of button of IR-transmitter for 17 using i loop i1=i+17 ;convert intervals between changes of input from IR receiver from hight timer ticks to 'bits' ;in your case there may be another values, you can see 'raw' intervals in code below if (trainH[i1]>0) then if (trainH[i1]<=7) then t=0 end if end if if (trainH[i1]>7) then if (trainH[i1]<=14) then t=1 end if end if if (trainH[i1]>14) then if (trainH[i1]<255) then t=2 end if end if ;convert from binary array to one dword if (t==1) then keynum=keynum+1 end if keynum=keynum<<1 ;lets see binary 'keynumber' print_word_dec(usb_serial_data,t) ;in need we can print whole array of numbers of timer ticks between interrupts from int0 ; print_byte_dec(usb_serial_data,trainH[i]) usb_serial_data = "_" print_byte_dec(usb_serial_data,trainL[i]) usb_serial_data = "[" print_byte_dec(usb_serial_data,i1) usb_serial_data = "]" usb_serial_data = " " end loop ;print resulting 'keynber' and real length of train usb_serial_data ="_" print_dword_binary(usb_serial_data,keynum) usb_serial_data ="_" print_dword_dec(usb_serial_data,keynum) usb_serial_data ="_" print_byte_dec(usb_serial_data, realtrainlen ) ;do something on different keynumber - optional case keynum of 249902 : block led =on _usec_delay(5000) led=off end block 168302 : block led2 =on _usec_delay(5000) led2 =off end block 184622 : block led3 =on _usec_delay(5000) led3 =off end block 205022 : ;button up block led3 =on _usec_delay(5000) led3 =off end block 225422: ;button down block led3 =on _usec_delay(5000) led3 =off end block end case _usec_delay(300000) ;getting ready to recieve another button trainnum=0 i=0 buttonnumber=0 keynum=0 INTCON_INT0IE=on PIE1_TMR1IE = on end if end loop -- You received this message because you are subscribed to the Google Groups "jallib" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/jallib?hl=en.
