On Sat, Jun 18, 2011 at 2:22 AM, Sebastien Lelong <[email protected]> wrote: > 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 ?
With a good scope and any IR analog receiver you must see differences in modulation. The only problem you may have is that the ambient light is blinding your receiver. That's why any good IR receiver, analog or digital, has a dark plastic case, which is transparent to IR and is cutting a part of the visible radiation. > 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. > -- 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.
