PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wegstreckenzähler: Entfernug einstellen?



dj
25.08.2006, 12:32
Hallo,
wie kann ich einstellen, dass der Robby eine bestimmte Entfernung zurück legt und dann stehen bleibt?
Ich denke mal, dass das mit dem Wegstreckenzähler möglich ist(oder??).
Aber wie?
Ich danke euch schonmal im Vorraus für Antworten.

Gruß dj

Jon
25.08.2006, 19:10
Schau mal auf der CD bei den Beispielprogrammen nach. Da ist irgendwo ein Programm zum Thema Wegstrecke in cm messen. Ich weiß nur nicht genau wo.

jon

dj
26.08.2006, 10:28
Hallo,Jon
Ich hab auf der CD nachgeschaut aber nix gefunden.
Meinst du eine .pdf oder eine .bas Datei?
Kannst du vielleicht selbst nachschauen und dann das Verzeichnis posten?

Gruß dj

C1B1
26.08.2006, 16:20
Es ist eine .bas-Datei. Der Pfad: /install/Einführung_CCRP5/6_Einführung_Wegstreckenzähler.bas

dj
26.08.2006, 16:37
Das ist ja alles schön und gut aber wie kann ich Robby sagen, dass er z.B.
1m weitfahren soll?
Das beispielprog. hab ich mir schon durchgelesen aber da steht nix drin wie ich andere Werte einstellen kann.

Gruß dj

Jon
26.08.2006, 18:04
Ich werde mal schauen, dass ich dir noch heute Abend einen Code zu schreibe oder spätestens morgen früh.

jon

robby-fant
26.08.2006, 18:56
Ganz einfach, du schaust nach, wieviel cm der Robby von einem Messpunkt zum anderen Messpunkt zurück legt. Wenn du dir das Zahnrad anschauen tust, welche als Messung genommen werden, wirst du sehen , das es 2 Löcher hat.
Diese Übersetzung kannst du dann umrechnen bis zum Kettenantriebsrad. So einfach ist da.


Fazit: du baust die Platine ab, und schaust, wie oft die löcher am Nehmer vorbeigehen und misst die zurückgelegte Strecke.

Jon
26.08.2006, 19:17
Geht einfacher!!
Mein 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
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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 'Mit CLR_DISTANCE setzt du die Strecke auf 0cm zurück.
#NO_TASK
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE 'Liest die Variable mit der Strecke von links aus
gosub R_Distance 'Liest die Variable mit der Strecke von rechts aus
if LBYTE=25 then gosub stop 'LBYTE ist der linke Wegstreckenzähler
'if RBYTE=25 then gosub stop 'RBYTE ist der rechte Wegstreckenzähler
'Mit den Zahlen hinter L- und RBYTE= gibst du die Strecke in cm an, die er zurück legen soll.
goto NO_TASK
'--------------------------------------------
#stop
gosub LED4ON:SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

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

Im Treiber, den du normalerweise Lädst, ist schon ein Teil zum Umrechnen der Zählungen der Hardware in cm. Das heißt, dass du nur noch die cm abfragen musst.
Ich habe im Programm mal alles zur Wegstreckenmessung erklärt, in der Hoffnung, dass du es dann verstehst.
Wenn du trotzdem noch fragen hast:
Frag ruhig!!

jon

dj
27.08.2006, 07:44
hi, Jon
danke für das Prog. ich hab jetzt noch 2 Fragen:
1.Muss ich den Treiber "p5driv.s19"immer laden, dass das Prog. funktioniert?
2.Was hast du noch alles an das Beispieprogramm"6_EINFÜHRUNG_WEGSTRECKENZÄHLER.bas"(ich denk mal, dass du davon ausgegangen bist) drangehängt?
Ich probier's jetzt mal aus.

Gruß dj

dj
27.08.2006, 08:17
Hallo,Jon
Dein Prog. läuft einwandfrei. =D>
Eine Frage hätte ich aber noch:
Wie kann ich Robby sagen, dass er nur einen Meter weit fahren soll, aber nur wenn der Schallsensor auf max. ist?
Ich hab das jetzt schon ein paar mal ausprobiert aber irgendwie ist Robby immer endlos weitergefahren.

Gruß dj

Jon
27.08.2006, 08:41
1.Muss ich den Treiber "p5driv.s19"immer laden, dass das Prog. funktioniert?
Du musst den Treiber nicht immer laden. Das Programm wird auch so funktionieren, es sei denn, du erweiterst die Basis mit der Erweiterung. Dann müsstest du den andere Treiber laden (Nicht den, einen anderen).


2.Was hast du noch alles an das Beispieprogramm"6_EINFÜHRUNG_WEGSTRECKENZÄHLER.bas"(ich denk mal, dass du davon ausgegangen bist) drangehängt?
1. ich habe bei #stop ein beep reingesetzt:
#stop gosub LED4ON:SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:end

2. Ich habe die weiteren drei Entfernungsstufen aus dem Programm von Conrad rausgenommen.

3. Ich habe alles für dir rechte Seite reingehängt. Wird allerdings in diesem Programm nicht genutzt (auskommentiert).

Wenn ich das jetzt richtig sehe habe ich nicht mehr verändert.

jon

dj
27.08.2006, 09:03
Und was ist damit?

Hallo,Jon
Dein Prog. läuft einwandfrei. =D>
Eine Frage hätte ich aber noch:
Wie kann ich Robby sagen, dass er nur einen Meter weit fahren soll, aber nur wenn der Schallsensor auf max. ist?
Ich hab das jetzt schon ein paar mal ausprobiert aber irgendwie ist Robby immer endlos weitergefahren.

Gruß dj

Jon
27.08.2006, 09:08
Der Code mit Schallsensor:

'--------------------------
'------ 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
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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
if MIC > 230 then gosub move_fwd 'Fragt das Microfon ab. Wenn der Wert über 230 liegt dann geht er zu move_fwd. Und von dort zur Wegstreckenabfrage.

#NO_TASK
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE 'Liest die Variable mit der Strecke von links aus
'gosub R_Distance 'Liest die Variable mit der Strecke von rechts aus
if LBYTE=100 then gosub stop 'LBYTE ist der linke Wegstreckenzähler
'if RBYTE=25 then gosub stop 'RBYTE ist der rechte Wegstreckenzähler
'Mit den Zahlen hinter L- und RBYTE= gibst du die Strecke in cm an, die er zurück legen soll.
goto NO_TASK
'--------------------------------------------
#stop
gosub LED4ON:SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:end
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub NO_TASK
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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

Ich habe es jetzt so gemacht, dass er losfährt, wenn der Schallsensor auf fast maximum ist.
(Da ich nicht mehr genau weiß, was der höchst mögliche Wert ist und meine Akkus leer sind konnte ich es jetzt nicht ausprobieren. Eventuell musst du mit dem Wert hinter "if MIC > " spielen.)
Wenn aber die Lautstärke beim Fahren sinkt, was sehr unwarscheinlich ist, da der Robby sehr laut ist, fährt er trotzdem weiter, bis er einen Meter hinter sich hat.

jon

dj
27.08.2006, 09:15
Kann es sein, dass du irgendwas vergessen hast beim abfragen des Micros?
Ich hab den Wer hinter MIC > 230 bis auf 0 runtergesetzt aber Robby hat nix gemacht.

Gruß dj

Jon
27.08.2006, 09:16
Und was ist damit?
Ich habe deine Fragen erst heute morgen gelesen und musste dann noch den Code schreiben :-) (im Code schreiben bin ich nicht so schnell) ](*,)

jon

dj
27.08.2006, 09:21
Ich hab mir das jetzt nochmal angeschaut im Schallbeispielprog. war noch: "define LBYTE","define HBYTE", "define SUBCMD"
dann war da noch was mit GP und SAMPLE und HSAMPLE
schau dir das mal noch mal an.

Gruß dj

dj
27.08.2006, 10:39
hi,Jon
muss mich oben verbessernLBYTE,HBYTE und SUBCMD sind doch auch in deinem Prog. drin.
Aber irgendwie funktioniert das mit dem Micro nicht.
Ich hab selbst nochmal ein Prog. geschreiben das das selbe ergebnis wie deins ergibt .Aber es auch nicht funktioniert.Ich hab geschrieben:if MIC > 10 then gosub move_fwd
Es hat aber geklappt wenn ich statt > < geschrieben hab.
Ich hab auch noch n'Prog mit nur if MIC>1 then gosub LED1ON ausprobiert.Das hat funktioniert aber das komische war, dass es auch noch bei if MIC>1000000 geklappt hat.

Gruß dj

Jon
27.08.2006, 10:47
Ich glaube, dass ich mein Programm doch mal mit normalen Batterien ausprobieren muss. Das kann aber etwas dauern, da es gleich bei uns Mittagessen gibt.

jon

robby-fant
27.08.2006, 11:54
uiii.....ein sehr kurzer Code um die Wegstrecke zu messen.

dj
27.08.2006, 12:17
Funktioniert aber.
Eigentlich ist unser Problem nämlich auch den Wegstreckenzähler mit dem Schallsensor zu verbinden. :-k

Gruß dj

Jon
27.08.2006, 12:43
Ich habe nochmal meinen Code bearbeitet und ausprobiert.
Beim Ausprobieren habe ich dann auch festgestellt, dass meine Sensoren zur Wegstreckenmessung kaputt sind.
Aber nach dem, was ich mir über LCD anzeigen lassen konnte sollte es so gehen:

'--------------------------
'------ 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]
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)




'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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

#LOOP
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED4ON else gosub LED4OFF
if HSAMPLE >= 10 then gosub Strecke
HSAMPLE=0:goto loop
'----------------------------------------------------------------
#Strecke
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE= 25 then gosub stop
goto Strecke

'--------------------------------------------
#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:end
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub Strecke
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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

Mir ist auch noch aufgefallen, dass es nicht RBYTE heißt, sondern HBYTE!!
Meine ich zumindest :-#
Probiere es bitte mal aus!!

jon

dj
27.08.2006, 13:03
hallo, Jon
ich glaube auch, dass es HBYTE heißt.
ich hab dein Prog. ausprobiert aber s'hat nicht funktioniert.ich überprüf nachher mal noch mein Micro ob da alles in ordnung ist.
Nur so, dass du dir schon mal gedanken machen kannst:
Es hat gepiept, dann is die grüne LED am kleinen Prozessor angegangen und hat geblinkt, dann is LED4 angegangen.
Gefahren is er nicht.

Gruß dj

Jon
27.08.2006, 13:49
Es hat gepiept,
Richtig.


dann is die grüne LED am kleinen Prozessor angegangen und hat geblinkt,
Auch richtig.


dann is LED4 angegangen.
Ebenfalls richtig.
Spiele mal wieder mit dem Wert hinter "HSAMPLE"
Wenn der Geräuschepegel ausreicht, geht die LED4 aus und er startet die Motoren.
Geht die LED4 nicht aus, dann fragt er den Geräuschepegel wieder ab.

Probiere einfach nochmal etwas aus.
Ich kann mir kaum denken, dass dieser Code jetzt nicht geht.

jon

dj
27.08.2006, 15:28
Sorry, aber es funktioniert immernochnicht.
Hat alles geklappt wie es soll nur is er nich losgefahren.
Ich hab was gesagt LED is ausgegangen aber er ist nicht losgefahren.
Hast du das Prog. schon bei dir ausprobiert?

Gruß dj

Jon
27.08.2006, 15:43
Ich habe das Programm bei mir schon ausprobiert, mit dem kleinen Problem, dass er bei mir durch die defekten Sensoren immer weiter geradeaus fährt.
Ich werde es mir aber nochmal genau anschauen.
Probiere mal den Treiber neu zu laden. Vielleicht hilft es.

jon

Jon
27.08.2006, 15:48
'--------------------------
'------ 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]
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)




'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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

#LOOP
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED4ON else gosub LED4OFF
if HSAMPLE >= 10 then gosub move_fwd
HSAMPLE=0:goto loop
'----------------------------------------------------------------
#Strecke
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE= 25 then gosub stop
goto Strecke

'--------------------------------------------
#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:end
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub Strecke
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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

Ich hatte in der Zeile
"if HSAMPLE >= 10 then gosub move_fwd"
erst "then gosub Strecke" stehen. Was dazu führt, dass er die Motoren nicht startet. ](*,) ](*,)
Jetzt sollte es aber funktionieren!!!!!

jon

C1B1
27.08.2006, 17:26
Ich hab auch noch n'Prog mit nur if MIC>1 then gosub LED1ON ausprobiert.Das hat funktioniert aber das komische war, dass es auch noch bei if MIC>1000000 geklappt hat.

Klar, dass das nicht funktioniert hat, denn es kommt zum Variablenüberlauf und er fängt wieder von vorne an zu zählen.

Jon
28.08.2006, 11:25
Funktioniert mein Programm jetzt so?????????

Ich habe meinen Bot gerade bei Conrad abgegebe, kann also keine weiteren Tests durchführen :-(

jon

dj
28.08.2006, 14:34
Ich kann es auch erst am Mittwoch testen.
Aber vielleicht kann es ja jemand anderes ausprobieren?
Aber kann es sein, dass er so nicht anhält?
Müsste man nicht noch if LBYTE=25 then gosub stop einfügen?

Gruß dj

Jon
28.08.2006, 16:10
Es steht doch da:
"if LBYTE =25 then gosub stop"
Wo ist da dein Problem?
Oder hast du das einfach nur übersehen? (Passiert mir auch manchmal)

jon

dj
28.08.2006, 16:36
Hi Jon,
hab übersehen, dass bei move_fwd am ende gosub Strecke steht.
Ja ich glaub so musstes eigentlich funktionieren.
Ich probiers gleich mal am Mittwoch aus.

Gruß dj

Jon
30.08.2006, 18:19
Gehts oder Gehts nicht??????????

jon

dj
31.08.2006, 15:32
sorry hab noch so viel mit schule um die ohren gehabt und bin dann nichtmehr dazu gekommen.
aber am wochen ende kann ich es ganz sicher ausprobieren aber bis dahin müsste dein robby eigenlich wieder da sein.
so wie der code aussieht(wenn ich nichrs übersehen hab)muss es eigentlich funktionieren.

Gruß dj

Jon
01.09.2006, 13:50
Ich habe ja jetzt schon meinen zweiten Robby abgegeben (beim ersten war das ACS defekt), da hat es ganze 4 Wochen gedauert, bis ich einen Gutschein bekommen habe. Conrad meinte beim zweiten dann, dass es wieder um die 4 Wochen dauern wird.
Mal schauen.

jon

dj
01.09.2006, 20:47
Hi Jon,
dein prog. funktioniert.
ich hab nur noch ein Problem:
ich hab dein prog. erweitert undzwar um:
eine endlos schleife für das ganze prog.(dass man es mehrmals hintereinander ausführen kann)
und um ACS(dachte das wäre ganz nützlich)
mein problem ist allerdings, wenn ich robby zum 2. mal fahren lasse stopt er nicht mehr!
hier ist mal der code vielleicht kannst du mir ja sagen, was an meinem prog. nicht stimmt:

'--------------------------
'------ 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]
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)



#Start
'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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

#LOOP
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED4ON else gosub LED4OFF
if HSAMPLE >= 10 then gosub move_fwd
HSAMPLE=0:goto loop
'----------------------------------------------------------------
#Strecke
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE= 25 then gosub stop

'--------- LEDs ansteuern --------------------
if ACSL_F=on then gosub LED4ON else gosub LED4OFF
if ACSR_F=on then gosub LED1ON else gosub LED1OFF
'--------- AUSWEICHMANÖVER EINLEITEN ---------
if (ACSL_F and ACSR_F)=on then goto rotate
if ACSL_F=on then goto move_right
if ACSR_F=on then goto move_left
SYS FWDR:SYS FWDL:SPEED_L=255:SPEED_R=255

goto Strecke

'--------------------------------------------
'-------- AUSWEICHEN NACH RECHTS -------------
#move_right
SPEED_R=100:SPEED_L=255:goto Strecke
'-------- AUSWEICHEN NACH LINKS -------------
#move_left
SPEED_L=100:SPEED_R=255:goto Strecke
'---------- ROTIEREN --------------------
#rotate
SPEED_L=150:SPEED_R=150:SYS ROTR:goto Strecke

#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:goto Start
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub Strecke
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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



vielndank schon mal.

Gruß dj

Jon
02.09.2006, 15:19
So wirklich weiß ich auch nicht, was da falsch sein könnte.
Ich würde nur mal sagen, dass du die Zeile
"SYS FWDR:SYS FWDL:SPEED_L=255:SPEED_R=255"
bei #Strecke rauslassen köntest. Es sei denn, du willst ihm sagen, dass er bei keinem Gegenstand schneller fahren soll.

jon

dj
03.09.2006, 11:29
Hi,
muss oben an meinem Code noch was veränder so wie er oben steht fährt robby beim 2. mal einfach so wieder los.
hier der code mit Verbesserung, der allerdings noch nicht richtig funktioniert:


'--------------------------
'------ 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]
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)



#Start
'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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
#LOOP
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED4ON else gosub LED4OFF
if HSAMPLE >= 10 then gosub move_fwd
HSAMPLE=0:goto loop
'----------------------------------------------------------------
#Strecke
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE= 25 then gosub stop

'--------- LEDs ansteuern --------------------
if ACSL_F=on then gosub LED4ON else gosub LED4OFF
if ACSR_F=on then gosub LED1ON else gosub LED1OFF
'--------- AUSWEICHMANÖVER EINLEITEN ---------
if (ACSL_F and ACSR_F)=on then goto rotate
if ACSL_F=on then goto move_right
if ACSR_F=on then goto move_left


goto Strecke

'--------------------------------------------
'-------- AUSWEICHEN NACH RECHTS -------------
#move_right
SPEED_R=100:SPEED_L=255:goto Strecke
'-------- AUSWEICHEN NACH LINKS -------------
#move_left
SPEED_L=100:SPEED_R=255:goto Strecke
'---------- ROTIEREN --------------------
#rotate
SPEED_L=150:SPEED_R=150:SYS ROTR:goto Strecke

#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:LBYTE=0:HSAMPLE=0:goto Start
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub Strecke
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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

bitte schaut ihn euch an!
ich weiß einfach nicht, was da falsch ist.

Gruß dj

Jon
03.09.2006, 18:55
Um ehrlich zu sein:
Ich weiß nicht, was da falsch ist :-(
Wirklich keinen Plan :-( :-(

jon

dj
03.09.2006, 19:02
Hi,
hab fest gestellt, dass der zweite durchlauf fehlerhaft ist.
beim ersten mal funktionierts aber wenn er dann wieder bei #Start anfängt hält er nicht mehr an.
ich werd mal weiter nachlesen und gucken ob ich den Fehler find.

Gruß dj

dj
13.09.2006, 19:24
Hi,
Hab den Fehler immernoch nicht entdeckt!
Bitte helft mir doch!
Ich weiß einfach nicht was da schief läuft!
Vielleicht entdeck ja einer ihn.

Gruß dj

Jon
14.09.2006, 19:57
Hallo dj,
ich habe endlich mal dein Programm ausprobiert und herausbekommen, dass bei mir mit deinem Programm das selbe Passiert.
Mit dem Programm habe ich dann etwas herumprobiert, und Folgendes herausbekommen:

'--------------------------
'------ 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]
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)



#Start
'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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
#LOOP
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED4ON else gosub LED4OFF
if HSAMPLE >= 10 then gosub move_fwd
HSAMPLE=0:goto loop
'----------------------------------------------------------------
#Strecke
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE= 25 then gosub stop

'--------- LEDs ansteuern --------------------
if ACSL_F=on then gosub LED4ON else gosub LED4OFF
if ACSR_F=on then gosub LED1ON else gosub LED1OFF
'--------- AUSWEICHMANÖVER EINLEITEN ---------
if (ACSL_F and ACSR_F)=on then goto rotate
if ACSL_F=on then goto move_right
if ACSR_F=on then goto move_left


goto Strecke

'--------------------------------------------
'-------- AUSWEICHEN NACH RECHTS -------------
#move_right
SPEED_R=100:SPEED_L=255:goto Strecke
'-------- AUSWEICHEN NACH LINKS -------------
#move_left
SPEED_L=100:SPEED_R=255:goto Strecke
'---------- ROTIEREN --------------------
#rotate
SPEED_L=150:SPEED_R=150:SYS ROTR:goto Strecke

#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:gosub CLR_DISTANCE:HSAMPLE=0:gosub loop
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub Strecke
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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

Bei "#Stop" habe ich "LBYTE=0" in "gosub CLR_DISTANCE" geändert und "goto loop" in "gosub loop"
So funktioniert es bei mir.
Wenn ich aber LBYTE=0 verwende tritt der Fehler wieder auf.
Weshalb deine Variante nicht geht kann ich dir leider nicht sagen.

Probiere es einfach mal aus.

jon

Jon
15.09.2006, 11:31
Ich habe einen Verdacht, weshalb "LBYTE=0" nicht geht:
Bei "HBYTE" ist z.B. auch die Versionnummer des Bots abgelegt, warscheinlich auch noch andere Sachen wie die Infos zur IR-Komunikation.
So ähnliche Sachen sind, glaube ich auch in "LBYTE".
Und das dann in dieser Art und Weise auf Null zu setzten gelingt dann natürlich nicht.

Ich nehme keine Garantie darauf, dass das jetzt stimmt. Alles nur Vermutungen!!!

jon

dj
16.09.2006, 15:19
Hi Jon
Danke für den Tipp!
Ich hab dein Prog. ausprobiert, aber es hat nur beim ersten Mal funktioniert. Danach ist Robby einfach so wieder weiter gefahren.
Es könnte bloß vielleicht daran liegen, dass meine Akkus fast leer sind.

Gruß dj

Jon
16.09.2006, 15:33
Dann lade mal deine Akkus wieder neu auf. Ich habe nämlich jetzt kein Problem mehr.

jon

dj
16.09.2006, 15:35
Werd ich machen.
Ich hoffe, dass es dann funktioniert(bei der ganzen Arbeit) [-o<

Jon
19.09.2006, 14:40
Und..
hast du deine Akkus endlich geladen?

jon

Jon
03.10.2006, 20:07
Hast du dieses Thema jetzt atakta gelegt?
Würde mich nämlich wundern, wenn es nicht geht, bei mir geht es halt weiterhin.

jon

dj
06.10.2006, 10:58
nein aber in der anleitung von robby steht, dass man robby beim laden an haben soll,aber in der vom ladegerät steht man soll es an kein gerät anschließen, dass an ist.
weil ich nix kaputt machen will hab ichs halt noch nicht geladen.
kannst du mir vielleicht sagen ob robby beim laden an oder aus sein muss?

Gruß dj

Jon
06.10.2006, 11:05
Der Robby muss an sein.
Pass aber auf, dass er die Akkus nicht überlädt. Das wäre sonst für die Akkus sehr schädlich.

Was für ein Ladergerät verwendest du?

jon

dj
09.10.2006, 10:11
Was für ein Ladergerät verwendest du?


Ich verwende dieses hier von Conrad:http://www1.conrad.de/scripts/wgate/zcop_b2c/~flNlc3Npb249UDkwV0dBVEU6Q19BR0FURTA4OjAwMDEuMDJhM y44YTA0MzA3ZiZ+aHR0cF9jb250ZW50X2NoYXJzZXQ9aXNvLTg 4NTktMSZ+U3RhdGU9MjUxODU1NTg5Mg==?~template=PCAT_A REA_S_BROWSE&mfhelp=&p_selected_area=%24ROOT&p_selected_area_fh=&perform_special_action=&glb_user_js=Y&shop=B2C&vgl_artikel_in_index=&product_show_id=&p_page_to_display=DirektSearch&~cookies=1&zhmmh_lfo=&zhmmh_area_kz=&s_haupt_kategorie=&p_searchstring=steckernetzger%e4t&p_searchstring_artnr=&p_search_category=alle&r3_matn=&insert_kz=&area_s_url=&brand=&amount=&new_item_quantity=&area_url=&direkt_aufriss_area=&p_countdown=&p_80=&p_80_category=&p_80_article=&p_next_template_after_login=&mindestbestellwert=&login=&password=&bpemail=&bpid=&url=&show_wk=&use_search=3&p_back_template=&template=&titel=&darsteller=&regisseur=&anbieter=&genre=&fsk=&jahr=&jahr2=&dvd_error=X&dvd_empty_error=X&dvd_year_error=&call_dvd=&kna_news=&p_status_scenario=&documentselector=&aktiv=&p_load_area=$ROOT&p_artikelbilder_mode=&p_sortopt=&page=&p_catalog_max_results=10



Pass aber auf, dass er die Akkus nicht überlädt. Das wäre sonst für die Akkus sehr schädlich.
wie macht man das?

Gruß dj

Jon
09.10.2006, 12:20
Was für ein Ladergerät verwendest du?


Ich verwende dieses hier von Conrad:http://www1.conrad.de/scripts/wgate/zcop_b2c/~flNlc3Npb249UDkwV0dBVEU6Q19BR0FURTA4OjAwMDEuMDJhM y44YTA0MzA3ZiZ+aHR0cF9jb250ZW50X2NoYXJzZXQ9aXNvLTg 4NTktMSZ+U3RhdGU9MjUxODU1NTg5Mg==?~template=PCAT_A REA_S_BROWSE&mfhelp=&p_selected_area=%24ROOT&p_selected_area_fh=&perform_special_action=&glb_user_js=Y&shop=B2C&vgl_artikel_in_index=&product_show_id=&p_page_to_display=DirektSearch&~cookies=1&zhmmh_lfo=&zhmmh_area_kz=&s_haupt_kategorie=&p_searchstring=steckernetzger%e4t&p_searchstring_artnr=&p_search_category=alle&r3_matn=&insert_kz=&area_s_url=&brand=&amount=&new_item_quantity=&area_url=&direkt_aufriss_area=&p_countdown=&p_80=&p_80_category=&p_80_article=&p_next_template_after_login=&mindestbestellwert=&login=&password=&bpemail=&bpid=&url=&show_wk=&use_search=3&p_back_template=&template=&titel=&darsteller=&regisseur=&anbieter=&genre=&fsk=&jahr=&jahr2=&dvd_error=X&dvd_empty_error=X&dvd_year_error=&call_dvd=&kna_news=&p_status_scenario=&documentselector=&aktiv=&p_load_area=$ROOT&p_artikelbilder_mode=&p_sortopt=&page=&p_catalog_max_results=10
Bei Conrad musst du die Artikelnummer oder Bezeichnung angeben.
Links auf Suchergebnisse oder anderes gehen nicht.




Pass aber auf, dass er die Akkus nicht überlädt. Das wäre sonst für die Akkus sehr schädlich.
wie macht man das?
Du verwendest das Ladeprogramm von Conrad und wenn die Akkuspannung 9V erreicht hat nimmst du dein Netzgerät ab.

jon

dj
12.10.2006, 17:26
Hi Jon


dj hat folgendes geschrieben::
Zitat:
Was für ein Ladergerät verwendest du?



Ich verwende dieses hier von Conrad:http://www1.conrad.de/scripts/wgate.....&p_catalog_max_results=10

Bei Conrad musst du die Artikelnummer oder Bezeichnung angeben.
Links auf Suchergebnisse oder anderes gehen nicht.

wusst nicht, dass solche Links nicht funktionieren.
Aber egal hier ist die Artikelnummer: 510010


dj hat folgendes geschrieben::
Zitat:
Pass aber auf, dass er die Akkus nicht überlädt. Das wäre sonst für die Akkus sehr schädlich.

wie macht man das?

Du verwendest das Ladeprogramm von Conrad und wenn die Akkuspannung 9V erreicht hat nimmst du dein Netzgerät ab.


danke für den Tipp

Gruß dj

Jon
12.10.2006, 19:22
Dein Netzgerät ist das richtige.

Das mit den Links bei Conrad ist eine Erfahrungs-Sache, die irgendwie jeder mal machen muss.

Probiere mal, die Akkus zu laden. Am besten wird sein, wenn du jede 1/2 - 3/4 Stunde die Temperatur der Akkus kontrolierst. Wenn sie zu heiß werden (60-70Grad) beende den Ladevorgang.

jon

dj
14.10.2006, 09:34
Hi Jon
Ich hab dein Prog. ausprobiert.
Da gibts bei mir 2 Fehler:

1. Robby hält nicht an.(Auch beim ersten Mal nicht)

2. Wenn einmal ein Hindernis im Weg war dreht er sich die ganze Zeit im Kreis auch wenn kein Hindernis mer im Weg ist.

Kann es vieleicht daran liegen, dass du irgentwelche Erweiterungen hast und dass es dadurch erst funktioniert?Ich haber nämlich nur den ganz einfachen Robby ohne Erwieterungen.

Vieleicht kann mal noch jemand anderes dieses Programm testen und mir mitteilen ob es bei ihm funktioniert hat?

'--------------------------
'------ 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]
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)



#Start
'---------- INIT---------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
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
#LOOP
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED4ON else gosub LED4OFF
if HSAMPLE >= 10 then gosub move_fwd
HSAMPLE=0:goto loop
'----------------------------------------------------------------
#Strecke
pause 5:SYS COMNAV_STATUS
gosub L_DISTANCE
if LBYTE= 25 then gosub stop

'--------- LEDs ansteuern --------------------
if ACSL_F=on then gosub LED4ON else gosub LED4OFF
if ACSR_F=on then gosub LED1ON else gosub LED1OFF
'--------- AUSWEICHMANÖVER EINLEITEN ---------
if (ACSL_F and ACSR_F)=on then goto rotate
if ACSL_F=on then goto move_right
if ACSR_F=on then goto move_left


goto Strecke

'--------------------------------------------
'-------- AUSWEICHEN NACH RECHTS -------------
#move_right
SPEED_R=100:SPEED_L=255:goto Strecke
'-------- AUSWEICHEN NACH LINKS -------------
#move_left
SPEED_L=100:SPEED_R=255:goto Strecke
'---------- ROTIEREN --------------------
#rotate
SPEED_L=150:SPEED_R=150:SYS ROTR:goto Strecke

#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:beep 368,10,0:gosub CLR_DISTANCE:HSAMPLE=0:gosub loop
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155:gosub Strecke
'---------------------------------------------



'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 COMM/NAV SYSTEM IIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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

'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

Ich wäre euch sehr dankbar.

Gruß dj

Jon
14.10.2006, 16:47
Ich habe das Programm bei mir auch nur mit der Basis getestet.

Vielleicht probiert es nochmal jemand anderes.

jon

Dirk
14.10.2006, 17:21
Hallo dj,


Vieleicht kann mal noch jemand anderes dieses Programm testen und mir mitteilen ob es bei ihm funktioniert hat?

Ein Prog mit unklaren Unterprogramm-Strukturen kann nicht funktionieren und liefert Ergebnisse, die man nicht genau voraussagen kann.

Wichtig ist dieser Grundaufbau eines Progs:

'Haupt-Programmschleife:
Start:
...
Gosub Unterprog1
...
If A = B Then Gosub Unterprog2
...
Goto Start
End

'---------------------
'Unterprogramme:
Unterprog1:
...
Return

Unterprog 2:
...
Return

'----------------------

Wenn du ein Prog NUR genau so aufbaust, kann es ein Ergebnis erreichen, dass man nachvollziehen kann, d.h.:
Jedes Unterprogramm endet mit "Return" und steht NIE irgendwo im Hauptprogramm, sondern am Ende hinter "End" oder hinter der Hauptschleife. Man springt NIE aus einem Unterprogramm mit Goto heraus ins Hauptprogramm. Aus dem Hauptprogramm springt man NIE mit Goto in ein Unterprogramm, sondern ruft es NUR mit Gosub auf.

OK? O:)

Gruß Dirk

Jon
14.10.2006, 17:23
Warum hat das Programm dann bei mir defuntzt?
Verstanden habe ich es aber trotzdem.

jon

dj
15.10.2006, 15:20
@ Dirk
und du denkst, dass wenn ich mein Prog. so aufbaue wie du es geschrieben hast würde es funktionieren?
Dann verstehe ich nur nicht warum es bei Jon aber nicht bei mir funktioniert hat.

Gruß dj

Jon
15.10.2006, 15:56
Funktioniert es denn jetzt bei dir, wenn du es so wie Dirk es vorgeschlagen hat, bearbeitest?

jon

dj
16.10.2006, 13:52
Hab ich noch nicht gemacht.
Aber ich hab da noch eine Frage an Dirk:
wie ist das mit den Schleifen?
Darf ich merere ineinander schreiben?

gruß dj

Dirk
16.10.2006, 20:33
Hallo dj,


... wie ist das mit den Schleifen?
Darf ich merere ineinander schreiben?

Ja, es gibt verschachtelte Schleifen, z.B.:

#Start
...
#Schleife
...
If A = B Then Goto Schleife
...
Goto Start

Da ist eine äußere Schleife ohne Bedingung und eine kleine innere Schleife, die solange wiederholt wird, bis A <> B ist. Wenn die Bedingung A <> B nie eintritt, hängt sich das Prog da auf.

Unterprogramme kann man auch verschachteln:

#Unterprog1
...
Return


#Unterprog2
...
Gosub Unterprog1
...
Return

Da ruft das 2. Unterprog das 1. auf.

Beim Proggen sollte man nur immer nachvollziehen können, wohin das Prog bei welcher Bedingung springt. Ein großer Nachteil vom "Herumspringen" im Prog ist, dass man da schnell den Überblick verliert.
Wenn ihr hier einen intelligenten RP5 bauen wollt, braucht ihr erst 'mal gute Unterprogramme.
Z.B.:
Unterprogramm "RP5 Stoppen" ->
Setzt SPEED_R und SPEED_L gleich Null, dann Return.
Geht aber auch komplexer: Wenn der Bot nicht sofort stoppen soll, sondern langsam abbremsen, würde das Unterprog einen "Eingabeparameter" brauchen. Der könnte z.B. 0 sein, wenn der Bot sofort stoppen soll und > 0 für das langsame Abbremsen. So ein Unterprog ist also einfach: Es braucht keinen oder höchstens einen Parameter.
2. Beispiel:
Unterprog "RP5 Geradeausfahrt":
Hier wird's schon schwieriger. Ein Eingabeparameter wäre nötig, der die Wegstrecke angibt, die geradeaus zu fahren ist. Das könnte ein Word sein und der Wegstreckenzähler würde das dann machen.
Aber: Das Unterprog müßte ja wohl auch das ACS benutzen, denn der RP5 darf ja auf seinem Weg nicht irgendwo anstoßen.
Dann könnte man für dieses Prog noch einen "Ausgabeparameter" nehmen. Denn das Hauptprogramm wüßte ja vielleicht gern, ob unterwegs ein Hindernis war und ob die ganze Wegstrecke geschafft wurde.

So viel als Beispiel: Interessiert?

Weitere Unterprogs wären z.B.: Linkskurve, Rechtsrotation mit X Grad usw.

Am Ende der Kette werden diese Unterprogs durch Verschachtelung immer komplexer: Geh-in-eine-Ecke, Suche-Ausgang, Suche-Licht usw.

Ein Hauptprogramm wird dadurch immer kürzer:
#Start
Gosub Suche-Raummitte
Gosub Geh-in-eine-Ecke
Gosub Warte-auf-Dunkelheit
Gosub Suche-Ausgang
...
(Danach fiel er eine Treppe herunter!). O:)


Also Vorschlag:
Baut doch erst 'mal einige Unterprogs, durch die der RP5 immer mehr kann! Ich beteilige mich, wenn ihr Interesse habt!

Gruß Dirk

Flexo
17.10.2006, 14:57
Hi Dirk,

da ich nur Subs machen kann und keine Functions erstellen kann - wie übergebe ich dann Parameter?

Oder haben Subs gar keinen Local Scope?

Wie definiere ich Rückgabewerte?



MFG

Flexo

Dirk
17.10.2006, 16:59
Hallo Flexo,


... da ich nur Subs machen kann und keine Functions erstellen kann - wie übergebe ich dann Parameter? ... Wie definiere ich Rückgabewerte?

Ja, leider kennt CCBASIC keine Funktionen.

Ich behelfe mich so:

Ich definiere 2 Bytes:
define INBYTE byte[x]
define OUTBYTE byte[x+1]

Diese Bytes dienen als Eingabe- und Ausgabeparameter. Man kann bei Bedarf auch Words nehmen oder auch einen 2. Eingabeparameter INBYTE2 o.ä. Auf jeden Fall geschieht die "Kommunikation" zwischen Hauptprogramm und Unterprogrammen NUR über diese Vars. Probleme gibt's beim Verschachteln von Subs,- hier muss man evtl. einen eigenen "Satz" von Ein-/Ausgabevars nehmen.

Die Unterprogramme dürfen diese Vars frei verwenden und ändern (wäre dann so etwas wie die Byval-Definition). Zusätzlich gibt es universelle Variablen, die im Hauptprogramm und in Unterprogrammen frei verwendet werden dürfen: Temp1 .. Tempn und einfache "Zählvariablen" i .. n. Bei ihnen kann man sich nicht darauf verlassen, dass sie am Anfang oder Ende eines Programmteils oder Subs einen bestimmten Wert haben.

Alle anderen Vars erfüllen spezielle Aufgaben.


Naja: Ist nicht so wie ein "großes" BASIC, aber man legt sich zumindest für eigene Projekte fest!

Gruß Dirk

Flexo
18.10.2006, 16:25
Hi Dirk,

okay. Also alles über globale Variablen (eigentlich gibt ja keine in dem Sinn) :)

Das byte[x] ist ein Array?
Warum dann aber das OUTBYTE byte[x+1], also + 1?

Dirk
18.10.2006, 21:28
Das byte[x] ist ein Array?
Warum dann aber das OUTBYTE byte[x+1], also + 1?

Nein, sorry, so war das nicht gemeint. Das sind ganz normale Variablen.
Also z.B. so:
define INBYTE byte[7]
define OUTBYTE byte[8]


Gruß Dirk

dj
21.10.2006, 09:04
Also ich hab mir das mal überlegt.
wir brauchen für das Programm etwa 6 Unterprogs:
1. fahren, dass über INBYTE eine strecke angegeben bekommt und soweit geradeaus fährt.(mit ACS)
2. micro, dass den Schallpegel über OUTBYTE zurück gibt
3. stop, dass robby stoppt.
4. rotate, falls ein hindernis auftaucht, dass er dann rotiert
5. move_right(wie 4.)
6. move_left(wie 4.)

mit diesen Unterprogs. sollte es möglich sein ein übersichtliches und kurzes Prog zu schreiben.
Ich mach mich dann an die Arbeit.Wenn ich die Unterprogs fertig habe poste ich sie natürlich.

Gruß dj

dj
21.10.2006, 10:44
Hier sind die Unterprogs die ich oben angesprochen hatte:
Ich muss aber betonen, dass die Unterprogs alleine nicht funktionsfähig und wenn man sie mit Robby ausführt, kann es zu Beschädigungen an ihm kommen. Ich übernehme keine Haftung!

#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:return

#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


Das sind also die Unterprogs mit denen es möglich sein sollte das Prog zu schreiben.
Ich versuche es jetzt.Mal sehen was dabei herrauskommt.

Gruß dj

ich hab ein Unterprog vergessen gehabt, hier ist es:

#micro
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
HSAMPLE=OUTBYTE:return

dj
21.10.2006, 11:07
So ich hab jetzt ein Prog, bei dem ich glaube, dass es funktioniert:

'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'IIIIIIIIII ROBBY RP5 - Leerprogramm 1 IIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'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)? =P~
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

Dirk
21.10.2006, 14:02
Hallo dj,

sieht doch gut aus! (Konnte es aber nicht testen!)

Mit den Variablen must du etwas aufpassen!

Wenn du deine Vars ...
define INBYTE byte[7]
define OUTBYTE1 byte[8]
define OUTBYTE2 byte[9]
... als Bytes 7..9 definierst, gibt es weiter oben unter "USER MEMORY" bei den schon vorhandenen Variablen Überlappungen mit ...
define MAXLIGHT byte[7]
define GP1 byte[8]
define SAMPLE byte[9]

Wenn du das im Kopf hast, kann man das so machen, aber es bedeutet, dass z.B. OUTBYTE1 und GP1 DIESELBE Variable ist.

Gruss Dirk

dj
21.10.2006, 16:51
Hi Dirk
Danke für den Tipp!
Aber kann ich auch Variablen mit z.b. dem Wert byte[100] benutzen oder ist das irgendwie begrenzt?

Gruß dj

dj
22.10.2006, 09:07
Kann denn niemand dieses Prog hier für mich ausprobieren?:

'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'IIIIIIIIII ROBBY RP5 - Leerprogramm 1 IIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'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"

bitte!!! Ich hab euch doch schon gesagt, dass ich gerade nicht an meinen Robby ran komm.Ich würd aber gern wissen ob das Prog funktioniert.
Wenn ihr fragen zur funktion des Progs haben solltet dann fragt mich einfach!

Gruß dj

Dirk
22.10.2006, 10:30
Hallo dj,

Aber kann ich auch Variablen mit z.b. dem Wert byte[100] benutzen oder ist das irgendwie begrenzt?

Ja, das ist leider eng begrenzt:
byte[1..24]
word[1..12]

Wobei z.B. word[2] genau da liegt, wo auch byte[3] und byte[4] sind.
Also: Vorsicht!

Gruß Dirk

dj
22.10.2006, 16:50
Hm.Naja aber das reicht doch meistens.Oder?

dj
25.10.2006, 19:07
Also ich konnte heute endlich meine Prog ausprobieren.
Dabei habe ich fesgestellt, dass:
1.das Unterprog "micro" nicht richtig funktioniert.(das funktionsfähige poste ich später zusammen mit dem richtigen Unterprog. "fahren")
und
2. Am Unterprog "fahren" etwas nicht stimmt.Ich weiß aber nicht was! ](*,) Hier ist es nochmal ich fände es gut wenn mir jemand antworten könnte:
#fahren
if LBYTE = INBYTE then gosub stop
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155
SYS COMNAV_STATUS
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


Gruß dj

dj
27.10.2006, 18:49
Kann mir denn niemand sagen was an meinem Unterprog nicht stimmt?
Hier is das richtige Unterprog "micro":

#micro
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED1ON else LED1OFF
if HSAMPLE >= 10 then return
HSAMPLE=0
goto micro



Ich weiß wirklich nicht was bei dem Unterprog "fahren" falsch ist.
Bitter helft mir.

Gruß dj

Dirk
27.10.2006, 19:37
Hallo dj,

Müßte die eine Zeile:
if HSAMPLE < 10 then gosub LED1ON else LED1OFF

... nicht so aussehen:
if HSAMPLE < 10 then gosub LED1ON else [highlight=red:01cbc0231b]gosub[/highlight:01cbc0231b] LED1OFF

Gruß Dirk

dj
27.10.2006, 21:24
Natührlich! Wie konnte ich das Übersehen!
Aber... das Unterprog "micro" funktioniert doch eigentlich...Man sollte es natührlich berichtigen.Also:
#micro
for GP=1 to 100
SAMPLE=MIC
if SAMPLE > HSAMPLE then HSAMPLE=SAMPLE
next
if HSAMPLE < 10 then gosub LED1ON else gosub LED1OFF
if HSAMPLE >= 10 then return
HSAMPLE=0
goto micro

mein Problem war ja eigentlich das Unterprog "fahren".
aber trotzdem vielen dank.

Gruß dj

Dirk
28.10.2006, 09:31
... für #Fahren probier 'mal dies:

Anstelle von:
if (ACSL_F and ACSR_F)=on then gosub rotate

... das:
if (ACSL_F and ACSR_F) then gosub rotate

(muss aber nicht unbedingt der Fehler sein!)

Gruß Dirk

dj
28.10.2006, 10:15
Nein, das war es leider nicht.
Hab es ausprobiert(selbes ergebnis wie vorher).
Trotzdem danke.
Das ACS ist doch im Interrupt betrieb oder?
Kann es vielleicht senin, dass Robby sich an der Stelle aufhängt?

Gruß dj

dj
28.10.2006, 10:21
Das wars auch nicht. ](*,)
Habs grad eben ausprobiert.
Ich denke da stimmt irgendwas mit LBYTE nicht.

Gruß dj

dj
11.11.2006, 08:01
Also das Problem mit "fahren" hab ich jetzt gelöst.
Hier mal mein jetztiger Stand:

'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'IIIIIIIIII ROBBY RP5 - Leerprogramm 1 IIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'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[24]
define OUTBYTE byte[23]

'---------- 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
INBYTE=0:OUTBYTE=0
#loop
gosub micro
if HSAMPLE >= 10 then INBYTE=25:gosub fahren
goto loop
'----------------------------------------------------------------------
' UNTERPROGRAMME:
#fahren 'benötigt INBYTE und ACS
gosub L_DISTANCE
if LBYTE=INBYTE then gosub stop
SYS FWDR:SYS FWDL:SPEED_L=155:SPEED_R=155
SYS COMNAV_STATUS
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
if HSAMPLE < 10 then gosub LED1ON else gosub LED1OFF
if HSAMPLE >= 10 then return
HSAMPLE=0
goto micro

'----------------------------------------------
'--------- 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"


Bei diesem Prog hängt sich mein robby beim Zweiten Durchgang zwischen
if HSAMPLE < 10 then gosub LED1ON else gosub LED1OFF
und if HSAMPLE >= 10 then gosub fahren
auf.(denke ich zumindest)
vielleicht kann mir ja jemand helfen.
Fänd ich gut

Gruß dj