PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum Entfernungssensor



Garret
21.03.2005, 12:50
Hallo zusammen

Ich hab eine Frage zum Beispielprogramm 4 EINFÜHRUNG ENTFERNUNGSSENSOR. Da ist ein Befehl, den ich nicht verstehe.
" if (SYSTEM_STATUS and &H03)=3 then goto move_back "

1. Frage: Wofür ist der SYSTEM_STATUS gut?
2. Frage: Wofür ist die Adresse &H03 gut?
3. Frage: Warum muss SYSTEM_STATUS AND &H03 z.B. 3 sein, damit er zuück fährt?

Danke im voraus

Garret

GaronG
21.03.2005, 14:50
Hallo Garret,

SYSTEM_STATUS ist eine Variable, die durch die Systemroutine COMNAV_STATUS gefüllt wird. Die Variable ist bitweise verschlüsselt. Dabei ist Bit0 = 1, wenn der rechte Collisionssensor anspricht, Bit1 = 1 wenn der linke Collisionssensor anspricht. &H03 ist keine Adresse, sondern der Wert, wenn BEIDE Sensoren ansprechen.

if (SYSTEM_STATUS and &H03) = 3 ist ein Ausdruck aus der Boolschen Algebra. Beide Größen werden miteinander verglichen.
Rechter Sensor spricht an: 2 hoch 0 = 1
Linker Sensor spricht an: 2 hoch 1 = 2
2 + 1 = 3 -> Bedingung erfüllt -> Befehl 'goto move_back' ausführen

Hoffentlich habe ich es einigermaßen verständlich ausgedrückt.

MfG
GaronG

Garret
22.03.2005, 07:39
@ GaronG
Was ist denn der COMNAV_STATUS? Wo finde ich den? UNd kann ich den auch selbst verändern?

GaronG
22.03.2005, 11:12
COMNAV_STATUS findest du bei den erweiterten Systemroutinen. Sind in allen Programmbeispielen zu finden. Die Einsprungadresse ist &H125. Die Routine COMNAV_STATUS ist genau dazu da, die Zustände einiger Sensoren abzufragen und in SYSTEM_STATUS zu hinterlegen.

(Siehe auch PROJECT5_INTERN.BAS bei den Beispielen)

MfG
GaronG

Garret
23.03.2005, 09:07
Eine andere Frage! Kann man die Entfernung verändern? Ich möchte nämlich mit einer Fernbedienung die Entfernung selbst einstellen.
Im Beispielprogramm hat man ja eine Entfernung von 30 cm und ich möchte dann mit der Fernbedienung z.B. 15 cm einstellen.

GaronG
23.03.2005, 10:29
Vorgesehen ist nur der Zugriff über die 3 Systemroutinen ACS_LO, ACS_HI und ACS_MAX die wahrscheinlich einen bestimmten Wert irgendwo auf eine Speicherzelle schreiben, die die Empfindlichkeit beeinflusst. Wenn man das komplette Systemprogramm disassembliert hätte, könnte man sowohl Werte als auch Adresse rauskriegen und eigene Werte reinschreiben. Die Frage ist, ob dann die Hardware mit den Werten arbeiten kann, da sie ja über die angegebenen Grenzen hinausgehen. Wär mal eine Aufgabe für absolute Freaks!

MfG
GaronG

Garret
23.03.2005, 10:46
Also ist das ziemlich schwer zu realisieren? Dann denk ich mal, dass ich das nicht fertig bekomme, ich bin noch ein Anfänger!

Garret
24.03.2005, 07:33
@ GaronG
Am Anfang des Programms sind ja die ganzen Variabeln definiert!
define ACS_LO &H01E1
define ACS_HI &H01E9
define ACS_MAX &H01F1
Kann man denn nicht einfach einen Wert in z.B. &H01E1 legen, und dann hält er den Abstand?

Garret

GaronG
24.03.2005, 08:05
Nein, denn das sind NICHT die Adressen der Variablen, sondern nur die Einsprungadressen der Routinen, die die Variable verändern. Wo die Variable selbst steht, ist dadurch nicht ersichtlich.

MfG
GaronG

Garret
24.03.2005, 08:13
Ja wo könnten die Variabeln denn stehen? Man muss die doch irgendwo selbst ändern können!

Garret

GaronG
24.03.2005, 09:03
Siehe Beitrag von gestern 11:29 Uhr. Man braucht den disaasemblierten Code oder den Source-Code. Da könnte man nachschauen, welche Speicheradresse verändert wird. Irgendwo im Netz stand schon mal das Listing, weiß aber nicht mehr, wo. Muss mal googlen...

MfG
GaronG

Garret
24.03.2005, 09:15
Als erstes danke für deine Geduld mit mir!

Ich probiers jetzt so! Ich stelle über die Fernsteuerung die Entfernung ein, mit der "1" wird die Entfernung vom ACS_LOW (30 cm) eingestellt, mit der "2" die Entfernung vom ACS_HI (60 cm) und mit der "3" die Entfernung vom ACS_MAX (100 cm).
Mal schauen ob ich das hin bekomme!

Garret

GaronG
24.03.2005, 09:50
Keine Ursache, ist auch für mich interessant.

Die Sache, eigene Werte für die Empfindlichkeit festzusetzen, ist noch komplizierter als ich dachte. Das Source-Listing habe ich hier im Forum gefunden.

Aber: Für die Entfernungssensoren und die IR-Communikation hat der Robby noch einen eigenen Prozessor, der wiederum ein eigenes (festes) Betriebssystem (Treiber) hat. Die Kommunikation mit dem übergeordneten Programm geschieht im Treiber p5driv.s19 an den Adressen H00A4 (Bit 1 und 2) und H00A5 (Bit 6 und 7). Damit wird aber nur die Verschlüsselung für LO, HI und MAX getroffen. Die echten Werte stehen auch da nicht, sondern sind im Festspeicher des IR/ACS Prozessors und ich fürchte, da kommt man nicht ran (ROM-Speicher).

MfG
GaronG

Garret
25.03.2005, 08:27
Könntest du mal hier das Programm schauen? Ich seh da keinen Fehler, aber es geht trotzdem nicht. Funktion des Programmes: Mit der Taste 1 soll er die Entfernung vom 30cm einhalten (ACS_LO), wenn ich Taste 2 drücke dann soll er die Entfernung von 60cm einhalten (ACS_HI), bei Taste 3 stoppt er.
Hier das Programm:

'---------- INIT---------------
gosub SUBSYS_PWR_ON:REV_L=off:REV_R=off
beep 368,10,0:pause 50
'------- IR-FORMAT EINSTELLEN----------------
'gosub REC80
gosub RC5
'--------------------------------------------
'--- WARTEN AUF CODE UND ANZEIGEN ---
'--------------------------------------------
#LOOP
gosub GET_IRDATA
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0
if (LBYTE and HBYTE =&HFF) then goto LOOP
if (LBYTE =&H01) and (HBYTE =&H00 or HBYTE =&H20) then goto 30cm
if (LBYTE =&H02) and (HBYTE =&H00 or HBYTE =&H20) then goto 60cm
ADR=HBYTE:CMD=LBYTE:pause 50
goto loop

#30cm
SYS ACS_LO:SYS COMNAV_STATUS
if (LBYTE =&H03) and (HBYTE =&H00 or HBYTE =&H20) then goto loop
if (SYSTEM_STATUS and &H03)=1 then gosub LED1ON
if (SYSTEM_STATUS and &H03)=2 then gosub LED4ON
if (SYSTEM_STATUS and &H03)=3 then gosub stop
if (SYSTEM_STATUS and &H03)=0 then gosub move_fwd
goto 30cm

#60cm
SYS ACS_HI:SYS COMNAV_STATUS
if (LBYTE =&H03) and (HBYTE =&H00 or HBYTE =&H20) then goto loop
if (SYSTEM_STATUS and &H03)=1 then gosub LED1ON
if (SYSTEM_STATUS and &H03)=2 then gosub LED4ON
if (SYSTEM_STATUS and &H03)=3 then gosub stop
if (SYSTEM_STATUS and &H03)=0 then gosub move_fwd
goto 60cm

#stop
SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:pause 50:gosub LEDSOFF:return
#move_fwd
SYS FWDR:SYS FWDL:SPEED_L=150:SPEED_R=150:return

Das Problem ist, er reagiert gar nicht auf die Taste 1 und er hält nicht den Abstand von 60cm.

Danke für deine Hilfe

Garret

DIE HARD
25.03.2005, 18:05
Hallo....

Die Entfernungseinstellung beim ACS ist eigenlich
eine Empindlichkeitseinstellung, also keine
echte Entfernungsmessung.
Diese ist ausserdem abhängig von der Objektfarbe !!

Es wird im Subsystem der Vorwiderstand der beiden
IR-LEDs vorne geschaltet (2 Widerstände) und damit
der Strom durch die LEDs eingestellt.
ciao.....