PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Picaxe 08M Programmierproblem! Bitte um hilfe.



mirco13
11.02.2006, 12:17
Ich möchte einen alten Servo selbst steuern. Infos in einem anderen thema:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=16828
Die Steuerung rechts links klappt auch wunderbar, nur leider scheint irgendwo in meinem Prog ein fehler zu stecken, den ich nicht finde. Nach dem programmstart wird die Mittelstellung angefahren. das ist schonmal super. sobald dann aber das Programm in "loop" steckt, scheint es durchgehend nur noch auf IR Signale zu warten. Normal sollte es ja wieder zu "startloop" spriingen, wenn keine IR Signale Empfangen werden. Wie kann ich das beheben? Lenken ist so ja möglich, aber der Servo soll ja automatisch auf Mittelstellung fahren, wenn keine IR Signale mehr kommen.

Bin am Verzweifeln.


Programm:
symbol rechts = 1 `rechts ansteuerung ausgang 1 Pin 6
symbol links = 2 `links ansteuerung ausgang 2 Pin 5
symbol position = b0 `Speicherort Position

startloop:
goto mittelstellung

loop:
low rechts
low links
infrain2
if infra = 1 then lenkr
if infra = 2 then lenkl
goto startloop

lenkr:
readadc 4,b0 `lese den Analogwert in b0 (Aktuelle Position)
if b0 > 236 then goto loop
high rechts `rechts vollausschlag lenken
goto lenkr

lenkl:
readadc 4,b0 `lese den Analogwert in b0 (Aktuelle Position)
if b0 < 20 then goto loop
high links `links vollausschlag lenken
goto lenkl


`Auswertung der Servostellung
` 5V = rechts = 256 (in Auswertung rechts = sobald größer 236)
`2,6V = mitte = 133
` 0V = links = 0 (in Auswertung links = sobald kleiner 20)

mittelstellung:
for b1 = 1 to 20
pause 20
readadc 4,b0 `lese den Analogwert in b0 (Aktuelle Position)
if b0 > 162 then goto linksdrehen
if b0 < 150 then goto rechtsdrehen
next b1
goto loop

linksdrehen:
high links `links drehen
pause 20 `für 0,02sec
low links
goto mittelstellung

rechtsdrehen:
high rechts `rechts drehen
pause 20 `für 0,02sec
low rechts
goto mittelstellung

zardoz
11.02.2006, 14:28
Moin Mirco,

da hast Du recht: INFRAIN wartet solange, bis ein Signal eintrifft.

Beheben kannst Du das, indem Du den Eingang zuächst auf einen Interrupt legst und dann in der Interrupt-Routine mit INFRAIN den Code einliest. Eigentlich kein Problem, weil der Code vom Sender normalerweise mehrfach wiederholt wird.

Nice weekend,
Zardoz

mirco13
12.02.2006, 18:31
Moin Mirco,
da hast Du recht: INFRAIN wartet solange, bis ein Signal eintrifft.
Beheben kannst Du das, indem Du den Eingang zuächst auf einen Interrupt legst und dann in der Interrupt-Routine mit INFRAIN den Code einliest. Eigentlich kein Problem, weil der Code vom Sender normalerweise mehrfach wiederholt wird.
Nice weekend,
Zardoz

Danke für die Info, aber selbst wenn ich die Ir Befehle erst durch den Interrupt einlese, hänge ich ja wieder im Infrain Befehl fest! Ich muss ja aber nach Empfang des IR Signales wieder "zurückkommen"um meine Rutine für die Mittelstellung ausführen zu lassen (Automatisch wenn halt keine Steuerbefehle mehr ankomen).
Also das gleiche Problem wie jetzt auch.

Schade. dachte, dass man evtl. es so Proggen kann, dass nur eine bestimmte Zeit der IR Empfang geprüft wird und dann automatisch die Rückkehr zum Programm folgt.

Na dann werde ich den IR Empfang wohl anders lösen müssen, bzw. darauf verzichten.

Grüße Mirco

zardoz
12.02.2006, 18:58
selbst wenn ich die Ir Befehle erst durch den Interrupt einlese, hänge ich ja wieder im Infrain Befehl fest

Wieso das? Mit Start der IR-Sendung wird der Interrupt ausgelöst, in der Interruptroutine wird mit INFRAIN das Signal decodiert und ausgewertet. Danach kannst Du solange treiben was immer Du möchtest, bis Du den Interrupt wieder eingeschaltet hast und eine neue IR-Sendung den Interrupt erneut auslöst.

Nice weekend,
Zardoz

mirco13
12.02.2006, 19:47
Na aber in der Interrupt Rutine würde dann ja als erstes wieder die Abfrage der IR Signale kommen. Also genau das gleiche wie in meinem Momentanen Programm, womit ich ja wieder an dem Punkt bin, wo ich jetzt auch bin.

Im Momentanen Programm frage ich den IR Empfang ab. Selbst wenn ich was Empfangen habe, scheint das Programm durchgehend weiter den IR Empfang zu erwarten. Das Programm führt den zu dem Signal gehörenden Befehl aus (Bsp.: nach rechts) und dann scheint es hier festzuhängen. (Weitere IR Befehle werden aber ausgeführt!).

Sonst müßte es ja zu "startloop" springen. Das macht es nie (ausser direkt einmal nach Start des Programms, da es ja der erste Befehl ist).
Wo liegt denn dann der Unterschied wenn ich es in der Interrupt Rutine unterbringe? Wie kommt der Picaxe da wieder aus der ich nenne es mal "Empfangsschleife" raus?


Programmausschnitt:

startloop:
goto mittelstellung

loop:
low rechts
low links
infrain2
if infra = 1 then lenkr
if infra = 2 then lenkl
goto startloop

Ich nochmal.
So habe mir das ganze nochmal durch den Kopf gehen lassen. Könnte doch so klappen wie du sagtest. Erstmal verstehen :-). Nachdem ich mich nun ein wenig belesen habe, werde ich es mal wie von dir vorgeschlagen probieren. Manchmal sieht man den Wald vor lauter Bäumen nicht.
Melde mich, sobald es Ergebnisse gibt.

Danke erstmal Mirco

mirco13
18.02.2006, 12:24
Hallo.
Wollte mich mal zurückmelden und Infos geben, was daraus geworden ist.
Also die IR Steuerung habe ich vorerst auf EIS gelegt.

Auch mit dem Interrupt funktioniert es nicht wie gewollt.
Der Interrupt wird zwar erkannt und auch ausgeführt, aber weitere IR Befehle werden trotz reaktivieren des Interrupts nicht ausgeführt!

Vermutlich liegt es daran, dass ich im Interrupt nicht nur einfach irgend einen Schaltbefehl ausführen muss, sondern in andere Programmteile springen muss (um die gewünschte Stellung anfahren zu können.
Somit gelangt das Programm nicht wieder zurück in dienInterruptrutine, und kommt auch nicht zu dem erwarteten "return" am Ende der Rutine.

Habe bestimmt 100 Mal umprogrammiert und getestet... nun habe ich es aufgegeben. Aber auf jeden Fall habe ich nun schonmal gelernt wie der Interrupt funktioniert!

Hierfür vielen Dank.

Meine Aktuelle Steuerung wird nun über ein altes Handy ausgeführt. Hierzu aber demnächst mehr unter "Vorstellung". (Und dasss funtzt auch schon super!!!!)
Grüße Mirco