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.

Reply via email to