SX/B Example: Sony IRCS Decoding | Examples Index |
' ========================================================================= ' ' File...... SIRCS.SXB ' Purpose... Sony IRCS decoder ' Author.... (c) Parallax, Inc. -- All Rights Reserved ' E-mail.... support@parallax.com ' Started... ' Updated... 05 JUL 2006 ' ' ========================================================================= ' ------------------------------------------------------------------------- ' Program Description ' ------------------------------------------------------------------------- ' ' Receives and decodes Sony IR Control System stream from IR demodulator. ' Decodes 12 bits, displays lower seven on LEDs. ' ' References: ' -- http://www.parallax.com/dl/docs/cols/nv/vol3/col/nv76.pdf ' -- http://www.parallax.com/dl/docs/books/edu/IRRemoteBoebot.pdf ' ------------------------------------------------------------------------- ' Device Settings ' ------------------------------------------------------------------------- DEVICE SX28, OSCXT2, TURBO, STACKX, OPTIONX FREQ 4_000_000 ID "SIRCS" ' ------------------------------------------------------------------------- ' IO Pins ' ------------------------------------------------------------------------- IR VAR RA.0 ' IR input Leds VAR RBC ' LEDs on RB/RC ' ------------------------------------------------------------------------- ' Constants ' ------------------------------------------------------------------------- StartBit CON 216 ' 90% of 2400 uS OneBit CON 108 ' 90% of 1200 uS ZeroBit CON 54 ' 90% of 600 uS ' ------------------------------------------------------------------------- ' Variables ' ------------------------------------------------------------------------- irCode VAR Word ' entire code cmdCode VAR irCode_LSB ' IR command code (7 bits) devCode VAR irCode_MSB ' IR device code (5 bits) tmpB1 VAR Byte ' subroutine work vars tmpB2 VAR Byte tmpB3 VAR Byte tmpW1 VAR Word ' ========================================================================= PROGRAM Start ' ========================================================================= ' ------------------------------------------------------------------------- ' Subroutine Declarations ' ------------------------------------------------------------------------- GET_IR_PULSE SUB 0 ' get pulse from IR pin GET_SIRCS FUNC 2 ' get code from SIRCS ' ------------------------------------------------------------------------- ' Program Code ' ------------------------------------------------------------------------- Start: PLP_A = %0001 ' pull-up unused pins TRIS_B = %00000000 ' make LED pins outputs TRIS_C = %00000000 Main: DO Leds = GET_SIRCS ' get and show IR code LOOP END ' ------------------------------------------------------------------------- ' Subroutine Code ' ------------------------------------------------------------------------- ' pulseWidth = GET_IR_PULSE ' -- waits for and measures 1-0-1 pulse on IR pin ' -- return value (0 to 255) is in 10 uS units GET_IR_PULSE: PULSIN IR, 0, tmpB1 ' wait for pulse RETURN tmpB1 ' return to caller ' ------------------------------------------------------------------------- ' GET_SIRCS ' -- waits for Sony IRCS input stream ' -- puts 7-bit command into LSB of return value ' -- puts 5-bit device code into MSB of return value GET_SIRCS: tmpW1 = 0 ' clear working output DO tmpB2 = GET_IR_PULSE ' get bit from IR LOOP UNTIL tmpB2 >= StartBit ' loop until valid start bit FOR tmpB3 = 0 TO 6 ' get 7-bit code tmpW1_LSB = tmpW1_LSB >> 1 ' prep for LSB tmpB2 = GET_IR_PULSE ' measure data bit IF tmpB2 >= OneBit THEN ' valid "1" bit tmpW1_LSB.6 = 1 ' yes, set the bit ENDIF NEXT FOR tmpB3 = 0 TO 4 ' get 5-bit code tmpW1_MSB = tmpW1_MSB >> 1 ' prep for LSB tmpB2 = GET_IR_PULSE ' measure data bit IF tmpB2 >= OneBit THEN ' valid "1" bit tmpW1_MSB.4 = 1 ' yes, set the bit ENDIF NEXT RETURN tmpW1