So ich hab jetzt ein Prog, bei dem ich glaube, dass es funktioniert:
Code:
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'IIIIIIIIII ROBBY RP5 - Leerprogramm 1 IIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'PROGRAMM-RUMPF ZUM START EIGENER ENTWICKLUNGEN
' Programm-Name: LEERPROGRAMM_RP5.bas
' Hardware: Robby RP5 OHNE Erweiterungsplatine
' Treiber: P5DRIV.S19
'----------------------------------------------------------------------
' FUNKTION DES PROGRAMMS
'----------------------------------------------------------------------
'
'
'----------------------------------------------------------------------
'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 !!
'----------------------------------------------------------------------
'------ Konstanten --------
define V_OFFSET 0 '= CHRG_CURRENT - SYS_VOLTS (Abgleichwert)
define V_ADJUST 2 'Eichwert Spannungen (Bauteile-abhängig!)
'Hier weitere Konstanten-Definitionen!
'--------------------------
'------ 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 GP byte[6]
define MAXLIGHT byte[7]
define GP1 byte[8]
define SAMPLE byte[9]
define HSAMPLE byte[10]
'--- 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)
define INBYTE byte[7]
define OUTBYTE1 byte[8]
define OUTBYTE2 byte[9]
'---------- 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:
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
'gosub NO_ACS_INT:beep 368,10,0:sys ACS_HI 'oder: ACS_LO, ACS_MAX
' ODER ...
'---- SYSTEM OPERATION MODE (ACS INTERRUPT 200 ms) ----
'interrupt ACS_INTERRUPT:gosub ACS_INT_200:beep 368,10,0:sys ACS_HI
' IR-COMM initialisieren:
'--------- IR-DATENFORMAT -----------------
'gosub RC5 'oder: REC80
' ODER ...
'---- IRCOMM OPERATION MODE (INTERRUPT ON) ----
'interrupt IRCOMM_INTERRUPT:gosub RC5_INT 'oder: REC80_INT
'---------- SET ADDRESSED MODE -----------------
'DEVICEADDRESS=1 'oder: 2..15
'gosub SET_ADDRESS
gosub NO_ACS_INT:beep 368,10,0:SYS ACS_MAX
'------------ ANTRIEB -------------------------
REV_L=on:REV_R=on:sys PLM_SLOW
'----------------------------------------------------------------------
' Hier ggf. weitere Initialisierungs-Befehle!!!
'----------------------------------------------------------------------
' PROGRAMM:
' Hier mit dem Programm beginnen!!!
#Start
gosub CLR_distance:gosub LEDSOFF
#loop
gosub micro
if OUTBYTE1< 10 then goto loop
if OUTBYTE1> 10 then INBYTE=25:gosub fahren
goto loop
'----------------------------------------------------------------------
' UNTERPROGRAMME:
#fahren 'benötigt INBYTE für die Strecke die zurückzulegen ist und ACS
if LBYTE=INBYTE then gosub stop
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155
if (ACSL_F and ACSR_F)=on then gosub rotate
if ACSL_F=on then gosub move_right
if ACSR_F=on then gosub move_left
goto fahren
#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:gosub Start
#move_right
SPEED_R=100:SPEED_L=255:return
#move_left
SPEED_L=100:SPEED_R=255:return
#rotate
SPEED_L=150:SPEED_R=150:SYS ROTR:return
#micro
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
HSAMPLE=OUTBYTE1:return
'----------------------------------------------
'--------- ACS INTERRUPT SERVICE --------------
'----------------------------------------------
'#ACS_INTERRUPT 'Beispiel für eine Interruptroutine!
'sys COMNAV_STATUS
'if ACSL_F=on then gosub LED4ON else gosub LED4OFF
'if ACSR_F=on then gosub LED1ON else gosub LED1OFF
'pause 5:gosub LED1OFF:gosub LED4OFF:return interrupt
'---------------------------------------------
' ODER ... (ACHTUNG: Nur EINE Interrupt-Routine ist möglich!!!)
'---------------------------------------------
'-------- IR-COMM INTERRUPT SERVICE ----------
'---------------------------------------------
'#IRCOMM_INTERRUPT 'Beispiel für eine Interruptroutine!
'sys COMNAV_STATUS
'gosub GET_IRDATA
'gosub LED1ON:pause 5:gosub LED1OFF:return interrupt
'---------------------------------------------
'IIIIIIII Binärausgabe mit den 4 LEDs IIIIIIII
' Der Robby kann OHNE zusätzliche Hardware keine Werte (z.B.
' seiner Sensoren) anzeigen. Diese Routine gibt VALUE mit den
' 4 LEDs in Binärform (als 2 Nibble mit je 4 Bit) aus.
' Die Variable VALUE muss als BYTE definiert sein!
'#LEDBINOUT 'Ausgabe 1. Nibble (low)
'gosub LEDSOFF: gosub LED1FLASH: gosub LED1FLASH
'gosub LED1FLASH: gosub LED1FLASH: gosub LED1FLASH
'if (VALUE and &B1) <> 0 then gosub LED1ON
'if (VALUE and &B10) <> 0 then gosub LED2ON
'if (VALUE and &B100) <> 0 then gosub LED3ON
'if (VALUE and &B1000) <> 0 then gosub LED4ON
'pause 100 'Ausgabe 2. Nibble (high)
'gosub LEDSOFF: gosub LED2FLASH: gosub LED2FLASH
'gosub LED2FLASH: gosub LED2FLASH: gosub LED2FLASH
'if (VALUE and &B10000) <> 0 then gosub LED1ON
'if (VALUE and &B100000) <> 0 then gosub LED2ON
'if (VALUE and &B1000000) <> 0 then gosub LED3ON
'if (VALUE 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 (0..255) 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
#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
#WAIT_PING
SUBCMD=8: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"
ich habe nur ein Problem:
ich komm nicht an meinen Robby ran und kann deswegen mein Prog nicht testen.Kann es jemand für mich ausprobieren und mir dann mitteilen, wie es funtioniert hat(oder auch nicht)?
Ich fände es sehr nett.
Gruß dj
edit:Man muss bei dem Prog am Anfang Klatschen. Dann sollte Robby etwa 1m weit fahren und dann stehen bleiben.Wenn man dann wieder klatscht sollte er wieder 1m weit fahren... Wenn ein Hindernis kommt solte er ausweichen.
Gruß dj
Lesezeichen