Hallo Hunter2,
hier ein Programm, das mit den LEDs die IR-Codes binär ausgibt. Man muss ein bißchen rechnen, aber das geht nach etwas Übung.
Stör dich nicht an dem vielen Text am Anfang. Wenn du das alles kennst: Einfach Löschen!
Gruß DirkCode:'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'IIIIIIIIII ROBBY RP5 - LED-Binärausgabe-IR-Code IIIIIIIIIIII 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'PROGRAMM ZUR 4-BIT-BINÄRAUSGABE EINES IR-CODES MIT 4 LEDS ' Programm-Name: LED-Binärausgabe-IR-Code_RP5.bas ' Hardware: Robby RP5 OHNE Erweiterungsplatine, ' IR-Fernbedienung ' Treiber: P5DRIV.S19 '---------------------------------------------------------------------- ' FUNKTION DES PROGRAMMS '---------------------------------------------------------------------- ' Das Programm wartet auf Empfang eines IR-Codes von einer Fernsteuerung ' RC5 oder REC 80. ' Wenn ein gültiger Code empfangen wird, wird dies mit einem Beep bestätigt, ' dann blinkt LED1 kurz, die 4 LEDs zeigen die unteren 4 Bits der Adresse, ' es blinkt LED2, die 4 LEDs zeigen die Bits 5-8 der Adresse (ADR). ' Ein doppelter Beep zeigt an, dass jetzt der Befehlsteil (CMD) kommt. Die ' Anzeige erfolgt wie bei der Adresse als Low- und High-Nibble. ' Binär-Dezimal-Tabelle (4-Bit): ' WERT: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ' LED1-> 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ' LED2-> 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ' LED3-> 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ' LED4-> 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ' ' Der Dezimal-WERT kann in der 1. Zeile abgelesen werden, wenn ' man die zutreffende LED-Kombination aussucht (1->an, 0->aus). ' Der Wert des 2. Nibbles (high) kann genauso abgelesen werden, ' muss aber noch mit 16 multipliziert und zum 1. Nibble addiert ' werden, um den ganzen 8-Bit-Dezimalwert zu erhalten. ' ' Empfängt der Roboter keinen gültigen Code, so stellen Sie versuchsweise ' auf REC80 Format um (die entsprechende Anweisung ist bei der Initialisierung ' auskommentiert). ' Denken Sie auch daran, dass RC5 ein Toggle-Bit hat, das bei jeder Betätigung ' der Taste umgeschalten wird. Sie bekommen daher evtl. zwei verschiedene Werte ' für die Adresse. '---------------------------------------------------------------------- 'ACHTUNG: ' Der erste Schritt in der Initialisierung Ihres Programms sollte immer die Zeile ' REV_L=on:REV_R=on:SYS PLM_SLOW ' enthalten. Diese Zeile initialisiert die Ports für die Richtungsumschaltung ' des Antriebs und die PLM Frequenz. Initialisieren Sie die Ports auch, wenn der ' Antrieb nicht benutzt werden soll! ' DER BETRIEB DER MOTOREN OHNE DIESE INITIALISIERUNG FÜHRT UNWEIGERLICH ZUR ' ZERSTÖRUNG DER ANTRIEBSELEKTRONIK !! '---------------------------------------------------------------------- 'RESOURCEN: ' Sie finden hier sämtliche Systemroutinen, die zum Betrieb des Roboters ' notwendig sind. ' Folgende SYSTEMROUTINEN sind relevant: ' ' SYSTEM: ' SYS PLM_SLOW ;PLM-Frequenz für Antrieb setzen ' SYS SYSTEM ;System-Hauptroutine ' SYS COMNAV ;ACS/IR-COMM-Hauptroutine ' POWER: ' gosub SUBSYS_PWR_ON ;Schaltet die Subsysteme EIN/AUS ' gosub SUBSYS_PWR_OFF ' AUSGABE: ' gosub LEDxON ;zum Ein-/Ausschalten der LEDx (x = 1..4) ' gosub LEDxOFF ' gosub LEDSON ;schaltet alle 4 LEDs EIN/AUS ' gosub LEDSOFF ' ACS: ' gosub NO_ACS_INT ;Interruptbetrieb abgeschaltet ' gosub ACS_INT_200 ;Interruptbetrieb eingeschaltet ' SYS ACS_HI ;ACS HI POWER (SEHBEREICH ca. 30cm) ' SYS ACS_LO ;ACS LO POWER (SEHBEREICH ca. 10cm) ' SYS ACS_MAX ;ACS MAX POWER (SEHBEREICH ca. 50cm) ' SYS COMNAV_STATUS ;Abfrage des ACS ' ANTRIEB: ' SYS REVR ;Kette rückwärts laufen lassen R/L ' SYS RERL ' SYS FWDR ;Kette vorwärts laufen lassen R/L ' SYS FWDL ' SYS ROTR ;Auf der Stelle nach R/L drehen ' SYS ROTL ' SYS REV ;Rückwärts ' SYS FWD ;Vorwärts ' WEGSTRECKENZÄHLER: ' gosub CLR_DISTANCE ;Wegstreckenzähler löschen ' gosub L_DISTANCE ;Wegstreckenzähler lesen LINKS/RECHTS ' gosub R_DISTANCE ' IR-KOMMUNIKATION: ' gosub GET_IRDATA ;liefert empfangene IR-Daten in HBYTE und LBYTE ' (jeweils FF wenn nichts empfangen wurde) ' gosub SEND_IRDATA ;Sendet die Daten in HBBYTE und LBYTE ' gosub REC80 ;Stellt das Format ein ' gosub REC80_INT ;Aktiviert den Interruptbetrieb mit REC80 Format ' gosub RC5 ;Stellt das Format ein ' gosub RC5_INT ;Aktiviert den Interruptbetrieb mit RC5 Format ' SYS COMNAV_STATUS ;Abfrage des IRCOMM ' gosub ADDRESSED_MODE_ON ;IR-Kommunikation, adressierter Betrieb ' gosub ADDRESSED_MODE_OFF ' gosub WAIT_PING ;Auf Ping warten ' gosub SET_ADDRESS ;Die Adresse, welche der Roboter haben soll, wird ' in LBYTE übergeben ' gosub GET_ADDRESSED_DATA ;Empfängt einen Rahmen und isoliert die TX-Adresse ' gosub SEND_ADDRESSED_DATA ;Formatiert HBYTE entsprechend der Vereinbarung ' RX/TX-Adresse und sendet den Rahmen ' TELEMETRIE: ' SYS SEND_TLM ;Sendet die Werte in HBYTE und LBYTE ' gosub GET_TLM ;Empfängt TLM Werte und verteilt sie auf HBYTE u. LBYTE ' SYS SEND_SYSSTAT ;Sendet SYSTEMSTATUS (CH0) ' SYS SEND_SPEEDL ;Sendet die Werte der PLM D/A-Wandler ' SYS SEND_SPEEDR '-------------------------- '------ I/O PORTS --------- '-------------------------- '- INTERFACE LCD/EXTPORT -- define sdio port[1] define sclio port[3] define strobe port[4] '-- INTERFACE COM/NAV ----- define DATALINE port[1] define CLOCKLINE port[2] '---- FREIE PORTS --------- define FREIP7 port[7] define FREIP8 port[8] define FREIP9 port[9] define FREIP10 port[10] define FREIP11 port[11] define FREIP12 port[12] define FREIP13 port[13] define FREIP14 port[14] define FREIP15 port[15] define FREIP16 port[16] '-------------------------- '------ SENSORS --------- '-------------------------- define FREIAD8 ad[8] 'freier A/D-Wandler define LIGHT_L ad[7] define LIGHT_R ad[6] define SYS_VOLTS ad[3] define CHRG_CURRENT ad[2] define SYS_CURRENT ad[1] define MIC ad[4] define TOUCH ad[5] '--------------------------- '------ DRIVE ------------- '--------------------------- define SPEED_L da[1] define SPEED_R da[2] define REV_L port[6] define REV_R port[5] '-------------------------- '---- SYSTEM MEMORY ------- '-------------------------- '--- INTERFACE BUFFER ---- define LBYTE byte[1] define HBYTE byte[2] define SUBCMD byte[3] '---- OPERATION DATA ------ define EXTPORT byte[4] define LED1_F bit[29] define LED2_F bit[30] define LED3_F bit[31] define LED4_F bit[32] define SYSTEM_STATUS byte[5] define ACSL_F bit[33] define ACSR_F bit[34] define IR_F bit[35] '-------------------------- '---- USER MEMORY ------- '-------------------------- define DEVICEADDRESS byte[6] 'User Memory ab BYTE[7] frei! define WERT byte[7] '--- SYSTEMROUTINEN ----------- define PLM_SLOW &H01C4 define SYSTEM &H01C9 define COMNAV &H0154 '- ERWEITERTE SYSTEM ROUTINEN - define REVR &H0101 'ANTRIEB RECHTS RÜCKWÄRTS define REVL &H0106 'ANTRIEB LINKS RÜCKWÄRTS define FWDR &H010B 'ANTRIEG RECHTS VORWÄRTS define FWDL &H0110 'ANTRIEB LINKS VORWÄRTS define ROTR &H0115 'RECHTS DREHEN define ROTL &H0119 'LINKS DREHEN define REV &H011D 'RÜCKWÄRTS define FWD &H0121 'VORWÄRTS define COMNAV_STATUS &H0125 'UPDATED ALLE FLAGS IM STATUS-REGISTER define ACS_LO &H01E1 'ACS POWER LO define ACS_HI &H01E9 ' define ACS_MAX &H01F1 ' define SEND_TLM &H014A 'SENDET TELEMETRIE (CH=HBYTE,DATEN=LBYTE) define SEND_SPEEDR &H0134 'SENDET TLM KANAL 8,PLM RECHTS define SEND_SPEEDL &H013A 'SENDET TLM KANAL 7,PLM LINKS define SEND_SYSSTAT &H0144 'SENDET TLM KANAL 0,SYSTEM STATUS '(FLAGS für ACS, FWD/REV, ACS_LO/HI/MAX) '---------- INIT--------------- ' Freie Ports initialisieren: FREIP7=off:FREIP8=off:FREIP9=off:FREIP10=off FREIP11=off:FREIP12=off:FREIP13=off:FREIP14=off FREIP15=off:FREIP16=off ' Subsysteme einschalten: gosub SUBSYS_PWR_ON beep 368,10,0:pause 50 gosub LEDSOFF 'Alle LEDs auf Robby aus ' ACS initialisieren: 'gosub NO_ACS_INT:beep 368,10,0:SYS ACS_HI 'Kein Interrupt, Power HI '------------ ANTRIEB ------------------------- REV_L=on:REV_R=on:SYS PLM_SLOW '---------------------------------------------------------------------- ' Hier ggf. weitere Initialisierungs-Befehle!!! '------- IR-FORMAT EINSTELLEN---------------- 'gosub REC80 gosub RC5 '---------------------------------------------------------------------- ' PROGRAMM: #LOOP gosub GET_IRDATA if LBYTE and HBYTE = &HFF then goto LOOP WERT = HBYTE 'Adresse (ADR) Beep 368,50,0: pause 100 gosub LED_LONIBBLE gosub LED_HINIBBLE gosub LEDSOFF Beep 368,25,0: pause 5: Beep 368,25,0 WERT = LBYTE 'Befehl (CMD) gosub LED_LONIBBLE gosub LED_HINIBBLE gosub LEDSOFF goto LOOP '---------------------------------------------------------------------- ' UNTERPROGRAMME: 'IIIIIIIIIIIIII Binärausgabe mit den 4 LEDs IIIIIIIIIIIIIII 'Die Variable WERT muss als BYTE oder WORD definiert sein. 'Ausgabe 1. Nibble (low): #LED_LONIBBLE gosub LEDSOFF: gosub LED1FLASH: gosub LED1FLASH gosub LED1FLASH: gosub LED1FLASH: gosub LED1FLASH if (WERT and &B1) <> 0 then gosub LED1ON if (WERT and &B10) <> 0 then gosub LED2ON if (WERT and &B100) <> 0 then gosub LED3ON if (WERT and &B1000) <> 0 then gosub LED4ON pause 100: return 'Ausgabe 2. Nibble (high): #LED_HINIBBLE gosub LEDSOFF: gosub LED2FLASH: gosub LED2FLASH gosub LED2FLASH: gosub LED2FLASH: gosub LED2FLASH if (WERT and &B10000) <> 0 then gosub LED1ON if (WERT and &B100000) <> 0 then gosub LED2ON if (WERT and &B1000000) <> 0 then gosub LED3ON if (WERT and &B10000000) <> 0 then gosub LED4ON pause 100: return #LED1FLASH gosub LED1ON: pause 5: gosub LED1OFF: pause 5: return #LED2FLASH gosub LED2ON: pause 5: gosub LED2OFF: pause 5: return 'Binär-Dezimal-Tabelle (4-Bit): ' WERT: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ' LED1-> 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ' LED2-> 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ' LED3-> 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ' LED4-> 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ' ' Der Dezimal-WERT kann in der 1. Zeile abgelesen werden, wenn ' man die zutreffende LED-Kombination aussucht (1->an, 0->aus). ' Der Wert des 2. Nibbles (high) kann genauso abgelesen werden, ' muss aber noch mit 16 multipliziert und zum 1. Nibble addiert ' werden, um den ganzen 8-Bit-Dezimalwert zu erhalten. '---------------------------------------------------------------------- 'IIIIIIIIIII LED DRIVER IIIIIIIIIIIIIIIII #LED1ON LED1_F=on:goto EXTPORT_WRITE #LED1OFF LED1_F=off :goto EXTPORT_WRITE #LED2ON LED2_F=on:goto EXTPORT_WRITE #LED2OFF LED2_F=off:goto EXTPORT_WRITE #LED3ON LED3_F=on:goto EXTPORT_WRITE #LED3OFF LED3_F=off:goto EXTPORT_WRITE #LED4ON LED4_F=on:goto EXTPORT_WRITE #LED4OFF LED4_F=off:goto EXTPORT_WRITE #LEDSOFF EXTPORT=EXTPORT and &H0F:goto EXTPORT_WRITE #LEDSON EXTPORT=EXTPORT or &HF0 #EXTPORT_WRITE LBYTE=EXTPORT:SYS SYSTEM:RETURN 'IIIIII SYSTEMROUTINEN COMM/NAV SYSTEM IIIII #GET_IRDATA SUBCMD=1:sys COMNAV:return #SEND_IRDATA SUBCMD=0:sys COMNAV:return #GET_TLM SUBCMD=1:sys COMNAV:LBYTE= LBYTE or (HBYTE shl 6) HBYTE= HBYTE shr 2:return #RC5 SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFC HBYTE=00:SUBCMD=2:sys COMNAV:return #RC5_INT SUBCMD=4:sys COMNAV:LBYTE= (HBYTE and &HFE)or 2 HBYTE=00:SUBCMD=2:sys COMNAV:return #REC80 SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H01)and&HFD HBYTE=00:SUBCMD=2:sys COMNAV:return #REC80_INT SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H03) HBYTE=00:SUBCMD=2:sys COMNAV:return #ADDRESSED_MODE_ON SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H10) HBYTE=00:SUBCMD=2:sys COMNAV:return #ADDRESSED_MODE_OFF SUBCMD=4:sys COMNAV:LBYTE= (HBYTE and &HEF) HBYTE=00:SUBCMD=2:sys COMNAV:return #WAIT_PING SUBCMD=8:sys COMNAV:return #SET_ADDRESS SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H10) HBYTE=00:SUBCMD=2:sys COMNAV LBYTE=DEVICEADDRESS:SUBCMD=5:sys COMNAV:return #GET_ADDRESSED_DATA SUBCMD=1:sys COMNAV:HBYTE=HBYTE and &H7:return #SEND_ADDRESSED_DATA HBYTE=(HBYTE shl 3)or DEVICEADDRESS:SUBCMD=0:sys COMNAV:return 'IIIIII SYSTEMROUTINEN SYSTEM IIIIIIIIIIII #NO_ACS_INT SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFB HBYTE=00:SUBCMD=2:sys COMNAV:return #ACS_INT_200 SUBCMD=4:sys COMNAV:LBYTE= HBYTE or &H04 HBYTE=50:SUBCMD=2:sys COMNAV:return #SUBSYS_PWR_ON sdio=on:sclio=on:strobe=off:EXTPORT=(EXTPORT and &HFE)or 8 sys SYSTEM:return #SUBSYS_PWR_OFF EXTPORT=(EXTPORT and &HF7)or 1:sys SYSTEM deact sdio:deact sclio:return #CLR_DISTANCE SUBCMD=3:sys COMNAV:return #L_DISTANCE SUBCMD=6:sys COMNAV:return #R_DISTANCE SUBCMD=7:sys COMNAV:return '---------COM/NAV GERÄTEREIBER ------------- syscode "p5driv.s19"







Zitieren

Lesezeichen