PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geradeaus und dann nach links fahren



Terabyte
16.05.2004, 10:57
Hallo,

ich hab ein Programm geschrieben, wo Robby erst vorwärts fährt, und sich dann nach links dreht. Aber wenn ich es rauflade, fährt er nur die Geradeaus-Strecke, und bleibt dann stehen. Wisst ihr, wo der Fehler ist?

'------ 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]
'--------------------------
'------ SENSORS ---------
'--------------------------
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 GP byte[6]
define MAXLIGHT byte[7]
define GP1 byte[8]
'--- 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---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50

gosub NO_ACS_INT:beep 368,10,0:SYS ACS_MAX

'------------ ANTRIEB -------------------------
REV_L=on:REV_R=on:SYS PLM_SLOW
'--------------------------------------------
'--- WEGSTRECKENZÄHLER ---
'--------------------------------------------
gosub CLR_DISTANCE:gosub LEDSOFF:gosub move_fwd
#NO_TASK
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE=5 then gosub LED1ON
if LBYTE=20 then gosub LED2ON
if LBYTE=45 then gosub LED3ON
if LBYTE=60 then goto links
goto NO_TASK
'--------------------------------------------
#links
gosub CLR_DISTANCE:gosub LEDSOFF:gosub MOVELINKS
#NO_TASK2
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE=2 then gosub LED1ON
if LBYTE=10 then gosub LED2ON
if LBYTE=20 then gosub LED3ON
if LBYTE=30 then gosub MOVERECHTS:goto stop
goto NO_TASK2
'-------------------------------------------
#MOVELINKS
SYS FWDR:SYS FWDL:SPEED_L=70:SPEED_R=155:return
#stop
gosub LED4ON:SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:end
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:return
'---------------------------------------------





'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
#EXTPORT_WRITE
SYS SYSTEM:pulse STROBE:RETURN


'IIIIII SYSTEMROUTINEN IIIIIIIII
#NO_ACS_INT
SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFB
HBYTE=00: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

Ich hab den meisten Code einfach vom Beispiel "Wegstreckenzähler" genommen.

MfG

Terabyte
26.05.2004, 19:36
Ich dachte ihr seid hier die Robby-Freaks?! Da müsstet ihr doch eigentlich so'ne Frage beantworten können, oder?

Könnt ihr mir wenigstens ein anderes Forum nennen, wo ich fragen kann?

MfG

ZaphodBeeblebrox
26.05.2004, 20:23
ich halte es für unhöflich eine halbe meile quellcode zu posten, der dazu noch größtenteils unkommentiert ist. nicht darauf hinzuweisen an welcher stelle der fehler auftritt und keine angaben zu machen was du bisher probiert hast um den fehler zu finden.
du kannst doch nicht ernsthaft erwarten, dass sich jemand mit deinen problemen rumschlägt ohne dass du ihm auch nur die geringste hilfestellung gibst.
ich werde mir unter diesen umständen jedenfalls nicht die mühe machen zu gucken was du da fabriziert hast. du bekommst hier hilfe aber keine komplettlösung, ein wenig musst du schon selber tun. das wird in anderen foren auch nicht anders gehandhabt.
einen tip bekommst du: benutz einen debugger
zudem hättest du, da es sich offensichtlich um ein softwareproblem handelt, im c-control forum wahrscheinlich mehr antworten bekommen.

Mit freundlichen Grüßen
Zaphod

art-hightech
26.05.2004, 22:15
da sag ich nur: probieren geht über studieren.
Wenn du deinen Quellcode kennst, kannst du auch das was du willst programmieren, bzw. das programmieren was dein Roboter machen soll.

recycle
26.05.2004, 23:46
ich halte es für unhöflich eine halbe meile quellcode zu posten, der dazu noch größtenteils unkommentiert ist. nicht darauf hinzuweisen an welcher stelle der fehler auftritt und keine angaben zu machen was du bisher probiert hast um den fehler zu finden.


Da stimme ich dir im Prinzip völlig zu. ABER was Terabyte hier gepostet hat ist ein Programm für Robby CRP.
Der grösste Teil des Codes sind die Standardroutinen die in jedem Demo-Programm von Robby CRP enthalten sind.

Jemanden der sich mit Robby CRP auskennt - das ist vermutlich die Zielgruppe der Frage - wird die paar Zeilen die Terabyte da selber geschrieben, bzw. geändert hat sicherlich auch ohne Kommentierung sofort herausfinden.

Leider gehöre ich nicht zu denen die sich besonders gut damit auskennen und sehe nicht wo der Fehler ist.

Ich habe aber mal den Teil extrahiert in dem der Fehler meiner Meinung nach versteckt sein muss.




'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50

gosub NO_ACS_INT:beep 368,10,0:SYS ACS_MAX

'------------ ANTRIEB -------------------------
REV_L=on:REV_R=on:SYS PLM_SLOW
'--------------------------------------------
'--- WEGSTRECKENZÄHLER ---
'--------------------------------------------
gosub CLR_DISTANCE:gosub LEDSOFF:gosub move_fwd
#NO_TASK
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE=5 then gosub LED1ON
if LBYTE=20 then gosub LED2ON
if LBYTE=45 then gosub LED3ON
if LBYTE=60 then goto links
goto NO_TASK
'--------------------------------------------
#links
gosub CLR_DISTANCE:gosub LEDSOFF:gosub MOVELINKS
#NO_TASK2
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE=2 then gosub LED1ON
if LBYTE=10 then gosub LED2ON
if LBYTE=20 then gosub LED3ON
if LBYTE=30 then gosub MOVERECHTS:goto stop
goto NO_TASK2
'-------------------------------------------
#MOVELINKS
SYS FWDR:SYS FWDL:SPEED_L=70:SPEED_R=155:return
#stop
gosub LED4ON:SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:end
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:return
'---------------------------------------------

Terabyte
27.05.2004, 20:35
Also ich entschuldige mich hier für meinen kleinen Ausraster.

Wie schon gesagt, hab ich den meisten Code aus dem mitgeleifertem Beispielcode "Wegstreckenzähler" übernommen, deshalb ist er auch kaum kommentiert.

Der Teil, den ich geändert hab, ist der:

if LBYTE=60 then goto links
'--------------------------------------------
#links
gosub CLR_DISTANCE:gosub LEDSOFF:gosub MOVELINKS
#NO_TASK2
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE=2 then gosub LED1ON
if LBYTE=10 then gosub LED2ON
if LBYTE=20 then gosub LED3ON
if LBYTE=30 then goto stop
goto NO_TASK2
'-------------------------------------------
#MOVELINKS
SYS FWDR:SYS FWDL:SPEED_L=70:SPEED_R=155:return


normalerweise würde der code anstatt

if LBYTE=60 then goto links
so lauten

if LBYTE=60 then goto stop

Ich hab nur die oben gezeigten Änderungen vorgenommen. Braucht ihr noch Hinweise?

MfG

10.06.2004, 18:38
kkkkk

jonas
16.07.2004, 10:02
willst du das unbedingt mit dem wegstreckenzähler machen? machs doch einfach so, dass der Roboter n paar sekunden geradeaus fahren und dann ne kurve machen soll.

rnhvw
16.07.2004, 18:06
Hallo TeraByte,

(wenn's noch Aktuell ist....)



01 if LBYTE=60 then goto links '<--------hier soll's NICHT stehen
02
03 '--------------------------------------------
04 #links
05 gosub CLR_DISTANCE:gosub LEDSOFF:gosub MOVELINKS
06 #NO_TASK2
07 pause 5:SYS COMNAV_STATUS
08 gosub L_DISTANCE '<----------------------hier bekommt LBYTE sein wert
09 if LBYTE=2 then gosub LED1ON
10 if LBYTE=10 then gosub LED2ON
11 if LBYTE=20 then gosub LED3ON
12 if LBYTE=30 then goto stop '<-------------Motor stopt bei 30
13 |
14 if LBYTE=25 then goto links '<------------ hier SOLL's stehen, (oder irgendwo zwischen Zeile 08 und 16)
15 'und kleiner als 30 (Motor stop) sein
16 goto NO_TASK2
18 '-------------------------------------------
19 #MOVELINKS
20 SYS FWDR:SYS FWDL:SPEED_L=70:SPEED_R=155:return


Gruss

Henk