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!
Code:
'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"
Gruß Dirk
Lesezeichen