Revenant
05.12.2010, 18:49
Hallo,
das ist mein erster Beitrag in diesem Forum :) Da ich noch keinerlei Elektronik-Kenntnisse habe, habe ich den Tip in einem Einsteiger-Tutorial in eurem Portal beherzigt und mir den Conrad CCRP5 gekauft.
Leider habe ich ein Problem beim Auslesen der Wegstreckensensoren. Ziel ist es den Roboter eine längere Strecke geradeaus fahren zu lassen. Da der Robby jedoch eine leichte Kurve fährt, dachte ich mir ich frage die gefahrene Strecke für den linken und den rechten Motor ab und passe dann deren Geschwindigkeiten an um dem Links- oder Rechtsdrall entgegenzuwirken. Ich kann zwar auf das LBYTE und das HBYTE zugreifen, jedoch scheitere ich daran beide in einem WORD zu speichern.
Ich will letztendlich zwei WORDs miteinander vergleichen (wie gesagt er soll eine relativ große Strecke geradeaus fahren können).
Hier der relevante Code:
'============== CONSTANTS =============
define SPEED_SLOW 50
define SPEED_NORMAL 100
define SPEED_FAST 150
'======================================
'============== VARIABLES =============
define DIST_LEFT WORD
define DIST_RIGHT WORD
'======================================
'============= SYSTEM INIT ============
gosub SUBSYS_PWR_ON ' Subsysteme an
beep 368,10,0:pause 50 ' Programmstart signalisieren
gosub NO_ACS_INT:beep 368,10,0:SYS ACS_HI ' Systemmodus (kein Interrupt)
REV_L=on:REV_R=on:SYS PLM_SLOW ' Sicherheitseinstellungen für Antrieb
'======================================
'================ START OF MAIN ===============
GOSUB CLR_DISTANCE
#Loop
' Pause zwischen den Abfragen der Entfernungssensoren
' ist notwendig, da sonst falsche Werte ausgelesen werden
PAUSE 10 : SYS COMNAV_STATUS
GOSUB GetDistances
IF DIST_LEFT < 170 THEN GOSUB Forward
IF DIST_LEFT > 170 THEN GOSUB StopMotor
GOTO Loop
'==============================================
#GetDistances
GOSUB L_DISTANCE
DIST_LEFT = 0
DIST_LEFT = HBYTE SHL 8
DIST_LEFT = DIST_LEFT + LBYTE
GOSUB R_DISTANCE
DIST_RIGHT = 0
DIST_RIGHT = HBYTE SHL 8
DIST_RIGHT = DIST_RIGHT + LBYTE
RETURN
#SetSpeedSlow
SPEED_L = SPEED_SLOW
SPEED_R = SPEED_SLOW
RETURN
#SetSpeedNormal
SPEED_L = SPEED_NORMAL
SPEED_R = SPEED_NORMAL
RETURN
#StopMotor
GOSUB LED4ON
SPEED_L=0
SPEED_R=0
RETURN
#TurnLeft
'GOSUB LED4ON
'GOSUB LED1OFF
SPEED_R = SPEED_NORMAL + 50
RETURN
#TurnRight
'GOSUB LED1ON
'GOSUB LED4OFF
SPEED_L = SPEED_NORMAL + 50
RETURN
#Forward
IF (NOT ACSL_F) AND (NOT ACSR_F) THEN GOSUB SetSpeedNormal ELSE GOSUB StopMotor
IF (DIST_LEFT > (DIST_RIGHT+3)) THEN GOSUB TurnRight
IF (DIST_RIGHT > (DIST_LEFT+3)) THEN GOSUB TurnLeft
RETURN
'================================================= =================================
'================================================= =================================
'================================================= =================================
Das Problem liegt irgendwie in '#GetDistances'. Wenn man das Programm startet, fährt der Roboter nur ein kleines Stück und bleibt dann stehen.
Im Endeffekt will ich einfach beide Werte, also von LBYTE und HBYTE in einem Word haben um sie vergleichen zu können..
Wenn ich auf das Auslesen der "rechten" Wegstrecke verzichte, also
GOSUB R_DISTANCE
DIST_RIGHT = 0
DIST_RIGHT = HBYTE SHL 8
DIST_RIGHT = DIST_RIGHT + LBYTE
einfach auskommentiere, passiert das nicht. Ich kann mir das Verhalten nicht erklären. Leider kann ich das Verhalten so schlecht debuggen (habe kein Display zur Anzeige von Infos).
Robotik ist super interessant, aber wenn ich mir überlege dass ich schon bei so einfachen Problemen Schwierigkeiten habe... oje!
Gruß
Rev
das ist mein erster Beitrag in diesem Forum :) Da ich noch keinerlei Elektronik-Kenntnisse habe, habe ich den Tip in einem Einsteiger-Tutorial in eurem Portal beherzigt und mir den Conrad CCRP5 gekauft.
Leider habe ich ein Problem beim Auslesen der Wegstreckensensoren. Ziel ist es den Roboter eine längere Strecke geradeaus fahren zu lassen. Da der Robby jedoch eine leichte Kurve fährt, dachte ich mir ich frage die gefahrene Strecke für den linken und den rechten Motor ab und passe dann deren Geschwindigkeiten an um dem Links- oder Rechtsdrall entgegenzuwirken. Ich kann zwar auf das LBYTE und das HBYTE zugreifen, jedoch scheitere ich daran beide in einem WORD zu speichern.
Ich will letztendlich zwei WORDs miteinander vergleichen (wie gesagt er soll eine relativ große Strecke geradeaus fahren können).
Hier der relevante Code:
'============== CONSTANTS =============
define SPEED_SLOW 50
define SPEED_NORMAL 100
define SPEED_FAST 150
'======================================
'============== VARIABLES =============
define DIST_LEFT WORD
define DIST_RIGHT WORD
'======================================
'============= SYSTEM INIT ============
gosub SUBSYS_PWR_ON ' Subsysteme an
beep 368,10,0:pause 50 ' Programmstart signalisieren
gosub NO_ACS_INT:beep 368,10,0:SYS ACS_HI ' Systemmodus (kein Interrupt)
REV_L=on:REV_R=on:SYS PLM_SLOW ' Sicherheitseinstellungen für Antrieb
'======================================
'================ START OF MAIN ===============
GOSUB CLR_DISTANCE
#Loop
' Pause zwischen den Abfragen der Entfernungssensoren
' ist notwendig, da sonst falsche Werte ausgelesen werden
PAUSE 10 : SYS COMNAV_STATUS
GOSUB GetDistances
IF DIST_LEFT < 170 THEN GOSUB Forward
IF DIST_LEFT > 170 THEN GOSUB StopMotor
GOTO Loop
'==============================================
#GetDistances
GOSUB L_DISTANCE
DIST_LEFT = 0
DIST_LEFT = HBYTE SHL 8
DIST_LEFT = DIST_LEFT + LBYTE
GOSUB R_DISTANCE
DIST_RIGHT = 0
DIST_RIGHT = HBYTE SHL 8
DIST_RIGHT = DIST_RIGHT + LBYTE
RETURN
#SetSpeedSlow
SPEED_L = SPEED_SLOW
SPEED_R = SPEED_SLOW
RETURN
#SetSpeedNormal
SPEED_L = SPEED_NORMAL
SPEED_R = SPEED_NORMAL
RETURN
#StopMotor
GOSUB LED4ON
SPEED_L=0
SPEED_R=0
RETURN
#TurnLeft
'GOSUB LED4ON
'GOSUB LED1OFF
SPEED_R = SPEED_NORMAL + 50
RETURN
#TurnRight
'GOSUB LED1ON
'GOSUB LED4OFF
SPEED_L = SPEED_NORMAL + 50
RETURN
#Forward
IF (NOT ACSL_F) AND (NOT ACSR_F) THEN GOSUB SetSpeedNormal ELSE GOSUB StopMotor
IF (DIST_LEFT > (DIST_RIGHT+3)) THEN GOSUB TurnRight
IF (DIST_RIGHT > (DIST_LEFT+3)) THEN GOSUB TurnLeft
RETURN
'================================================= =================================
'================================================= =================================
'================================================= =================================
Das Problem liegt irgendwie in '#GetDistances'. Wenn man das Programm startet, fährt der Roboter nur ein kleines Stück und bleibt dann stehen.
Im Endeffekt will ich einfach beide Werte, also von LBYTE und HBYTE in einem Word haben um sie vergleichen zu können..
Wenn ich auf das Auslesen der "rechten" Wegstrecke verzichte, also
GOSUB R_DISTANCE
DIST_RIGHT = 0
DIST_RIGHT = HBYTE SHL 8
DIST_RIGHT = DIST_RIGHT + LBYTE
einfach auskommentiere, passiert das nicht. Ich kann mir das Verhalten nicht erklären. Leider kann ich das Verhalten so schlecht debuggen (habe kein Display zur Anzeige von Infos).
Robotik ist super interessant, aber wenn ich mir überlege dass ich schon bei so einfachen Problemen Schwierigkeiten habe... oje!
Gruß
Rev