' Robby control B001, Hevawi 08-07-2004 ' ' This program uses a RC5 remote control to control Robby movement ' ' Forward = PROG+ (led1 on ) ' Reverse = PROG- (led2 on ) ' Turn left = VOL- (led3 on ) ' Turn right = VOL+ (led4 on ) ' Stop = 0 (leds off) ' ' '---some-remarks-for-readability-of-the-source-code------------------------------ ' user label/variable names look like AaaBbCcDdd (groups of 2 or 3 letters, see examples below) ' ' (examples) ' goto/gosub label names always start with 'l' (lPwrDwn) ' user byte variable names always start with 'y' (yRcvIfrCde) ' user bit variable names always start with 'b' (bLed1) ' user portnames variable always start with 'p' (pSerDat) '-------------------------------------------------------------------------------- ' '--------------------------- '------ DRIVE ------------- '--------------------------- define SPEED_L da[1] define SPEED_R da[2] define FWD_L port[6] 'REV_L changed to FWD_L define FWD_R port[5] 'REV_R changed to FWD_R '-------------------------- '--- INTERFACE BUFFER ---- '-------------------------- define LBYTE byte[1] define HBYTE byte[2] define SUBCMD byte[3] '-------------------------- '---- OPERATION DATA ------ '-------------------------- 'remember: EXTPORT, (byte 4) contents is stored into shiftregister IC I11 by executing the 'SYS SYSTEM' command define EXTPORT byte[4] 'define each individual bit in memory byte 4 (EXTPORT) define COM_NAV_PWR_F bit[25] 'IC I11 pin 4, output QP0, connected to COM/NAV PWR control signal (low = power ON!) define ACS_PWR_LO_F bit[26] 'IC I11 pin 5, output QP1, connected to AC PWR LO (low = active) define ACS_PWR_HI_F bit[27] 'IC I11 pin 6, output QP2, connected to AC PWR HI (low = active) define SNS_PWR_F bit[28] 'IC I11 pin 7, output QP3, connected to VSENSE/VMICPWR (high = power ON) define LED1_F bit[29] 'IC I11 pin 14, output QP4, connected to LED1 (high = led on) define LED2_F bit[30] 'IC I11 pin 13, output QP5, connected to LED2 (high = led on) define LED3_F bit[31] 'IC I11 pin 12, output QP6, connected to LED3 (high = led on) define LED4_F bit[32] 'IC I11 pin 11, output QP7, connected to LED4 (high = led on) define SYSTEM_STATUS byte[5] define ACSL_F bit[33] 'bit0 in SYSTEM_STATUS (memory5) define ACSR_F bit[34] 'bit1 in SYSTEM_STATUS (memory5) define IR_F bit[35] 'bit2 in SYSTEM_STATUS (memory5) '--- SYSTEMROUTINEN ----------- define SYSTEM &H01C9 define COMNAV &H0154 '- ERWEITERTE SYSTEM ROUTINEN - define COMNAV_STATUS &H0125 'UPDATED ALLE FLAGS IM STATUS-REGISTER '================================================================================ ' DEFINES '- 'pSerDat', 'pSerClk' and 'pStb', my renames for 'sdio', 'sclio', and 'strobe' '================================================================================ 'define portnumbers that control the onboard shiftregister chip define pSerDat port[1] 'UProc IC I7 pin 39, port1, (PB0), connected to IC I11 pin 2, Serial-Data-in define pSerClk port[3] 'UProc IC I7 pin 37, port3, (PB2), connected to IC I11 pin 3, Serial-Clock define pStb port[4] 'UProc IC I7 pin 36, port4, (PB3), connected to IC I11 pin 1, Strobe define yRcvIfrCde byte[6] 'Received Infrared Code 'remote control key codes define REMOTE_KEY_VOL_UP 17 define REMOTE_KEY_VOL_DW 16 define REMOTE_KEY_PRG_UP 32 define REMOTE_KEY_PRG_DW 33 define REMOTE_KEY_0 0 define ROBBY_FORWARD REMOTE_KEY_PRG_UP define ROBBY_REVERSE REMOTE_KEY_PRG_DW define ROBBY_TURN_LEFT REMOTE_KEY_VOL_UP define ROBBY_TURN_RIGHT REMOTE_KEY_VOL_DW define ROBBY_STOP REMOTE_KEY_0 '================================================================================ ' MAIN PROGRAM '================================================================================ 'avoiding multiple program starts due to start-switch bouncing pause 10 'beeb, to indicate program start beep 400,2,0 'first initialize the 'resource' (extra hardware, the IC I11 shiftregister) controlling signals gosub lIniShfRegCtlSgs 'switch all subsystem power off (controlled via IC I11 shiftregister) gosub lSbsPwrDwn 'prepair to switch com/nav power on (by setting bit to ON(!) in EXTPORT memory byte) COM_NAV_PWR_F=off 'send contents of EXTPORT (memory 4) to shiftregister IC I11 (activating power settings) sys SYSTEM 'initialise system for RC5 mode gosub lIniRc5Mod 'set received-infrared-code to dummy non-existing code value (used for compare of double transmission) yRcvIfrCde=255 'polling (requesting/testing) for infrared signal #labPolForIfrSig 'request for system status (will be send from/by subsystem) SYS COMNAV_STATUS '###now MODE will be in HBYTE (memory2) and the system-status will be in LBYTE (memory1)... '###... and LBYTE (memory1) will also be copied automatically to SYSTEM_STATUS (memory5) 'if no InfraRed signal bit set in SYSTEM_STATUS (memory5) restart polling if IR_F=off then goto labPolForIfrSig '### now an InfraRed-signal is detected 'set sub-command to prepair 'sys COMNAV' for doing a 'get system state' SUBCMD=1 'get received InfraRed signal from subsystem sys COMNAV '### now received-code is in HBYTE and received-Command is in LBYTE '### just a notation: (with Philips 0880) HBYTE toggles with each RX from &H00 to &H20 'if current received code was received before, wait for new received key ' - 1. many remote-controls send code more than one time ' - 2. repressing same key has no use with robby control if yRcvIfrCde=LBYTE then goto labPolForIfrSig 'save new received code yRcvIfrCde=LBYTE 'define robby maximum speed define SPEED_MAX 170 'define movement-change engines-off delay define ENGINES_OFF_DELAY_20MS 2 'if robby should not go forward, jump if yRcvIfrCde <> ROBBY_FORWARD then goto lNotFwd 'all leds off (because it's unknown which led is on) gosub lAllLdsOff 'led1 on gosub lLed1SwiOn 'stop robby SPEED_L=0 SPEED_R=0 'wait... pause ENGINES_OFF_DELAY_20MS 'switch robby to forward FWD_L=on FWD_R=on 'restart robby SPEED_L=SPEED_MAX SPEED_R=SPEED_MAX 'goto 'action done' goto lActDon 'robby not forward #lNotFwd 'if robby should not go reverse, jump if yRcvIfrCde<> ROBBY_REVERSE then goto lNotRev 'all leds off (because it's unknown which led is on) gosub lAllLdsOff 'led2 on gosub lLed2SwiOn 'stop robby SPEED_L=0 SPEED_R=0 'wait... pause ENGINES_OFF_DELAY_20MS 'switch robby to reverse FWD_L=off FWD_R=off 'restart robby SPEED_L=SPEED_MAX SPEED_R=SPEED_MAX 'goto 'action done' goto lActDon 'robby not reverse #lNotRev 'if robby should not turn left, jump if yRcvIfrCde<> ROBBY_TURN_LEFT then goto lNotLft 'all leds off (because it's unknown which led is on) gosub lAllLdsOff 'led3 on gosub lLed3SwiOn 'stop robby SPEED_L=0 SPEED_R=0 'wait... pause ENGINES_OFF_DELAY_20MS 'switch robby to turn left FWD_L=on FWD_R=on 'restart robby SPEED_L=0 SPEED_R=SPEED_MAX 'goto 'action done' goto lActDon 'robby not turn left #lNotLft 'if robby should not turn left, jump if yRcvIfrCde<> ROBBY_TURN_RIGHT then goto lNotRgt 'all leds off (because it's unknown which led is on) gosub lAllLdsOff 'led4 on gosub lLed4SwiOn 'stop robby SPEED_L=0 SPEED_R=0 'wait... pause ENGINES_OFF_DELAY_20MS 'switch robby to turn left FWD_L=on FWD_R=on 'restart robby SPEED_L=SPEED_MAX SPEED_R=0 'goto 'action done' goto lActDon 'robby not turn right #lNotRgt 'if robby should not stop, jump if yRcvIfrCde<> ROBBY_STOP then goto lNotSto 'all leds off gosub lAllLdsOff 'stop robby SPEED_L=0 SPEED_R=0 'goto 'action done' goto lActDon 'robby not stopped #lNotSto 'action done' #lActDon 'goto polling-for-infrared-signal goto labPolForIfrSig '================================================================================ ' MAIN PROGRAM END '================================================================================ end '================================================================================ ' Init Shift Register Control Signals ' - the 3 shiftregister control signals are connected to (bidirectional) microcontroller ports 1, 3 and 4 ' - if not set to ON or OFF they will remain high-impedance/inputs/tri-state ' - original Conrad program had pSerDat (sdio) and pSerClk (sclio) set to ON, after studying hardware it's ' unlogical to start that way. '================================================================================ #lIniShfRegCtlSgs 'set serial-data input corresponding controller-port as output and low pSerDat=off 'set serial-clock input corresponding controller-port as output and low pSerClk=off 'set strobe input corresponding controller-port as output and low pStb =off 'return return '================================================================================ ' Init Shift Register ' remember: Shift register controls power and leds '================================================================================ #lSbsPwrDwn 'switch off all subsystem power 'remember: COM_NAV power is switched OFF if corresponding bit is HIGH! (hardware is designed that way) 'set EXTPORT communication/navigation power off (by setting bit to ON!) COM_NAV_PWR_F = on 'set EXTPORT refernce-voltage-microphone-power off SNS_PWR_F = off 'send contents of EXTPORT (memory 4) to shiftregister IC I11 sys SYSTEM 'return return '================================================================================ ' Init RC5 mode ' - get system status, change some bits, and restore changed system status '================================================================================ #lIniRc5Mod 'set sub-command to prepaire 'sys COMNAV' for doing a 'get system state' SUBCMD=4 'get system state (returned in HBYTE) sys COMNAV '+-----+-----+-----+-----+-----+-----------+-----------+---------+ '| LBYTE (memory1) bits | '+-----+-----+-----+-----+-----+-----------+-----------+---------+ '| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | official bit-in-byte position numbering '+-----+-----+-----+-----+-----+-----------+-----------+---------+ '| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | C-Control/Basic bit numbering of LBYTE '+-----+-----+-----+-----+-----+-----------+-----------+---------+ '| xxx | xxx | xxx | xxx | xxx | ACS- | IR- | 0=RC5 | '| | | | | | Interrupt | Interrupt | 1=REC80 | '| | | | | | enable | enable | | '+-----+-----+-----+-----+-----+-----------+-----------+---------+ 'copy all received (by COMNAV) HBYTE bits except the IR-interrupt-enable bit (bit2) and REC80 (bit0) bit into LBYTE 'so IR-interrupts will be low/off/disabled and RC5 will be selected LBYTE=HBYTE and &HFC 'clear HBYTE HBYTE=00 'set sub-command to prepaire 'sys COMNAV' for doing a 'set system state' (from LBYTE) SUBCMD=2 'set system state sys COMNAV 'return return '================================================================================ ' Leds switch on/off (no strobe required) '================================================================================ #lLed1SwiOn LED1_F=on : sys SYSTEM : return #lLed1SwiOff LED1_F=off : sys SYSTEM : return #lLed2SwiOn LED2_F=on : sys SYSTEM : return #lLed2SwiOff LED2_F=off : sys SYSTEM : return #lLed3SwiOn LED3_F=on : sys SYSTEM : return #lLed3SwiOff LED3_F=off : sys SYSTEM : return #lLed4SwiOn LED4_F=on : sys SYSTEM : return #lLed4SwiOff LED4_F=off : sys SYSTEM : return '================================================================================ ' All Leds off '================================================================================ '+---------+---------+---------+---------+---------+---------+---------+---------+ '| EXTPORT (memory 4) bits | '+---------+---------+---------+---------+---------+---------+---------+---------+ '| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | official bit-in-byte position numbering '+---------+---------+---------+---------+---------+---------+---------+---------+ '| 32 | 31 | 30 | 29 | 28 | 27 | 26 | 25 | C-Control/Basic bit numbering of EXTPORT '+---------+---------+---------+---------+---------+---------+---------+---------+ '| LED4 | LED3 | LED2 | LED1 | SENS | ACS | ACS | COM/NAV | '| | | | | POWER | POWER | POWER | POWER | bit function '| | | | | | HI | LO | | '+---------+---------+---------+---------+---------+---------+---------+---------+ '| LED4_F | LED2_F | LED3_F | LED4_F | SNS_PWR_| ACS_PWR_| ACS_PWR_| COM_NAV_| C-Control/Basic bit name '| | | | | F | HI_F | LO_F | PWR_F | '+---------+---------+---------+---------+---------+---------+---------+---------+ #lAllLdsOff '#ledsoff1: make all led bits (bits 4-7) from EXTPORT go low/off and leave bits 0 to 3 unchanged EXTPORT=EXTPORT and &H0F '#ledsoff2: this has the same result as '#leds0ff1' but uses more memory to store and executes slower 'LED1_F=off : LED2_F=off : LED_3=off : LED4=off 'send EXTPORT byte to led/pwr control chip sys SYSTEM 'return return