Hi, I've been playing with this sample, trying to decypher a towel warmer remote control (two buttons)... I'm able to trigger INT0 interrupts, but I can't seem to find a way to differentiate buttons. I tried to capture 100 events (instead of 50 in original sample), but they all look the same, whatever button I'm pressing.
I'm using a photo transistor, not a IR receiver like TSOP4838, so I guess my troubles could come from this. Even if it can catch light from IR to visible, it may not be accurate enough ? Cheers, Seb 2011/6/13 Sebastien Lelong <[email protected]> > Hi Alexey, > > Do you have a reference schematic showing how to use TSOP IR receiver on > INT0 (pullups, etc... ?) > > TIA > Cheers, > Seb > > > 2011/5/24 stalex <[email protected]> > >> >> >> On 23 май, 22:38, Sebastien Lelong <[email protected]> wrote: >> > Hi Alexey, >> > >> > Please see revision 2669, it includes addition of your sample. This is a >> > preliminary addition, I need you to review it carefully. >> I compiled source from this revision and tested - works as usual, all >> correct with my >> remotes. >> >> > I renamed the file >> > to 18f4550_ir2serial.jal and slightly modified content: >> > >> > - corrected few typos >> > - modified header to include license, title, etc... (please confirm you >> > agree with BSD license) >> Yes, I agree with BSD license :) >> > - modified welcome message to "IR capture demo" (not "JALLIB USB serial >> > demo") >> > - some other changes to make it JSG compliant (style guide) >> > - reindentation >> Thank you, its become more beautiful :) >> >> > >> > I don't have time to review the logic, and I must admit I'm not sure >> I'll >> > have time before, well... before I actually need to do this :) >> Fortunately >> > this is one need I have, so I'll be happy to dive into this by that >> time. >> I'm glad to answer of any question about logic of work this >> program :) >> >> > Thanks >> > Cheers, >> > Seb >> > >> > 2011/5/23 stalex <[email protected]> >> > >> > >> > >> > > Unfortunately I dont know what protocol using my remotes :( >> > > But I tested on 3 remotes - works fine,stable and unique number for >> > > different keys on the same remote, >> > > only position of significant bits in train and values of TMR1H for >> > > '0' and '1' are different. >> > > If someone would like to test it on own remote it will be good :) >> > > I suspect that one of my remote is Philips RC-5(6). >> > > Later I'll try to calculate ticks to length in microseconds and answer >> > > what protocols I tested :) >> > >> > > > It looks like a great sample. You may want to make a library. What >> > > > protocol is it for? >> > >> > > > Matt. >> > >> > > > On May 21, 3:04 pm, stalex <[email protected]> wrote: >> > >> > > > > 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 >> > >> > -- Sébastien Lelong -- 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.
