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 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) - modified welcome message to "IR capture demo" (not "JALLIB USB serial demo") - some other changes to make it JSG compliant (style guide) - reindentation 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. 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 > > -- > 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. > > -- Sébastien Lelong http://www.sirloon.net http://sirbot.org -- 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.
