-         
+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Geradeaus und dann nach links fahren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2004
    Ort
    Berlin
    Alter
    28
    Beiträge
    10

    Geradeaus und dann nach links fahren

    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?
    Code:
    '------ 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
    VISIT PAGE: www.terabyte.us.ms

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2004
    Ort
    Berlin
    Alter
    28
    Beiträge
    10
    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
    VISIT PAGE: www.terabyte.us.ms

  3. #3
    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
    There is no place like 127.0.0.1

  4. #4
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    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.



    Code:
    '---------- 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 
    '---------------------------------------------

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2004
    Ort
    Berlin
    Alter
    28
    Beiträge
    10
    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:
    Code:
    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
    Code:
    if LBYTE=60 then goto links
    so lauten
    Code:
    if LBYTE=60 then goto stop
    Ich hab nur die oben gezeigten Änderungen vorgenommen. Braucht ihr noch Hinweise?

    MfG
    VISIT PAGE: www.terabyte.us.ms

  7. #7
    Gast
    kkkkk

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2004
    Ort
    Fulda
    Alter
    29
    Beiträge
    183
    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.
    MfG Jonas

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    19.05.2004
    Beiträge
    41
    Hallo TeraByte,

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

    Code:
    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

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •