' ====================================================================== ' ' File...... sircs_rx_v3.pbas ' Purpose... ' Author.... Jon McPhalen ' E-mail.... jon@jonmcphalen.com ' Started... ' Updated... 14 JAN 2009 ' ' ====================================================================== ' ---------------------------------------------------------------------- ' Program Description ' ---------------------------------------------------------------------- ' ' ---------------------------------------------------------------------- ' Device Settings ' ---------------------------------------------------------------------- DEVICE P8X32A, XTAL1, PLL16X XIN 5_000_000 ' ---------------------------------------------------------------------- ' Constants ' ---------------------------------------------------------------------- POS_DETECT CON 64 NEG_DETECT CON 96 FREE_RUN CON 248 ' timing in cnt ticks @ 80MHz MS_044 CON 3_520_000 ' 44ms BIT_START CON 172_800 ' 90% of 2.4ms BIT_1 CON 86_400 ' 90% of 1.2ms BIT_0 CON 43_200 ' 90% of 0.6ms Baud CON "T115200" HOME CON 1 BKSP CON 8 TAB CON 9 LF CON 10 CLREOL CON 11 CLRDN CON 12 CR CON 13 CLS CON 16 ' ---------------------------------------------------------------------- ' I/O Pins ' ---------------------------------------------------------------------- TX PIN 30 HIGH ' set to idle IR PIN 7 INPUT ' for Demo Board LEDs PIN 16..23 LOW DVD PIN 23 LOW ' ---------------------------------------------------------------------- ' Shared (hub) Variables (Byte, Word, Long) ' ---------------------------------------------------------------------- ' ---------------------------------------------------------------------- ' Shared (hub) Data (DATA, WDATA, LDATA, FILE) ' ---------------------------------------------------------------------- ' ---------------------------------------------------------------------- ' TASK Definitions ' ---------------------------------------------------------------------- ' ---------------------------------------------------------------------- ' Cog Variables (Long only) ' ---------------------------------------------------------------------- keyIn VAR Long keyBits VAR Long idx VAR Long bitChar VAR Long ' ---------------------------------------------------------------------- ' SUB/FUNC Definitions ' ---------------------------------------------------------------------- GET_SIRCS FUNC 0 ' SIRCS + bit count TX_STR SUB 1 TX_BYTE SUB 1 DELAY_MS SUB 1 ' shell for PAUSE DELAY_US SUB 1 ' shell for PAUSEUS ' ====================================================================== PROGRAM Start ' ====================================================================== Start: DELAY_MS 10 TX_BYTE CLS TX_STR "SIRCS Demo" TX_BYTE CR TX_BYTE CR Main: keyIn = GET_SIRCS ' get code keyBits = __param2 ' get bit count IF keyBits = 12 THEN TX_STR "12" keyIn = keyIn << 20 ' align to MSB ELSEIF keyBits = 20 THEN TX_STR "20" keyIn = keyIn << 12 ELSE TX_STR "??" ENDIF TX_BYTE CR FOR idx = 1 TO keyBits \ rol keyIn, #1 ' rotate bit31 to bit0 bitChar = keyIn & 1 ' get a bit bitChar = bitChar + "0" ' convert to ASCII TX_BYTE bitChar NEXT TX_BYTE CR TX_BYTE CR DELAY_MS 250 GOTO Main ' ---------------------------------------------------------------------- ' SUB/FUNC Code ' ---------------------------------------------------------------------- ' Use: variable = GET_SIRCS ' -- waits for and returns SIRCS code and bit count ' -- PropBASIC adaptation of my Spin/PASM object in Jan 2010 Nuts & Volts FUNC GET_SIRCS irCode VAR __param2 irBits VAR __param3 COUNTERA NEG_DETECT, IR, 0, 1 ' set for pulse timing COUNTERB FREE_RUN, 0, 0, 1 ' set for frame timing ASM waitstart waitpeq IR, IR ' wait for high mov phsa, #0 ' start bit timer waitpne IR, IR ' wait for low mov phsb, #0 ' start frame timer waitpeq IR, IR ' wait for high cmp BIT_START, phsa wc ' valid start bit? if_nc jmp #waitstart ' try again if no mov irCode, #0 mov irBits, #0 ' reset bit count checkframe cmp MS_044, phsb wc ' check frame timer if_c jmp #irdone ' abort @44ms waitbit test IR, ina wz ' look for new bit if_nz jmp #checkframe ' check for end if no bit measurebit mov phsa, #0 ' resstart bit timer waitpeq IR, IR ' wait for high (end of bit) cmp BIT_1, phsa wc ' ir bit --> C rcr irCode, #1 ' C --> irwork.31 add irBits, #1 ' inc bit count cmp irBits, #20 wc ' at max? if_b jmp #checkframe ' keep scanning if no irdone mov __temp1, #32 sub __temp1, irBits shr irCode, __temp1 ' right align ir code ENDASM RETURN irCode, irBits ENDFUNC ' ---------------------------------------------------------------------- ' Use: TX_STR pntr SUB TX_STR strAddr VAR __param2 strChar VAR __param3 strAddr = __param1 DO RDBYTE strAddr, strChar IF strChar = 0 THEN EXIT TX_BYTE strChar INC strAddr LOOP ENDSUB ' ---------------------------------------------------------------------- ' Use: TX_BYTE char ' -- shell for SEROUT SUB TX_BYTE SEROUT TX, Baud, __param1 ENDSUB ' ---------------------------------------------------------------------- ' Use: DELAY_MS milliseconds SUB DELAY_MS PAUSE __param1 ENDSUB ' ---------------------------------------------------------------------- ' Use: DELAY_MS microseconds SUB DELAY_US PAUSEUS __param1 ENDSUB ' ---------------------------------------------------------------------- ' TASK Code ' ----------------------------------------------------------------------