PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IF - THEN mit Näherungssensoren, Programmablauf Probleme



gttoxiclt2
01.03.2008, 18:25
Hallo,


habe jetzt meine Hardware fertig aufgebaut und nun geht es ans Programmieren auf Basis der rn Control und angehängter rn step 297.

Die Hardware sieht wie folgt aus:

Ein Schlitten fährt an Gewindespindeln nach vorn und hinten.
An jeder Endlage ist ein Näherungssensor angebaut, die den Schrittmotor abschalten sollen, damit er nicht über die Endlagen fährt.

Vorweg: Die Schaltung hier ist mein Einstieg in das Programmieren, was ich mir anlernen will mit Hilfe des Internets.

Ich wollte das Programm auf einer IF- THEN Basis aufbauen, da 5 x Näherungssensoren, 1 x Fotodiode und 2 x Eingänge von Relais aus einer USB Karte ausgewertet werden sollen.

Nun habe ich so angefangen:



Do

If Pind.2 = 1 Then 'Näherungssensor hinten
If Pind.4 = 1 Then 'Eingang von USB Karte
Stepper_enable = 1
Config Timer0 = Timer , Prescale = 64
Timervorgabe = 89
Enable Interrupts
End If
End If

If Pind.4 = 0 Then 'Eingang von USB Karte
If Pind.5 = 1 Then 'Näherungssensor vorne
Toggle Stepper_richtung
Stepper_enable = 1
Config Timer0 = Timer , Prescale = 64
Timervorgabe = 89
Enable Interrupts
End If
End If

Loop



Mein Ziel ist folgendes:

Wenn am D.4 (Eingang von USB Karte) ein High anliegt und der Schlitten hinten ist (D.2 = 1) dann soll der Schrittmotor solange fahren, bis der D.5 auf High geht, also der Schlitten vorn ist.
Wenn dann der Schlitten vorn ist und das Signal von der USB Karte fällt irgendwann mal ab, soll die Drehrichtung geändert werden, damit der Schlitten wieder hinter fährt bis D.2 wieder auf High geht.

Mit dem gezeigten Code bekomm ichs nicht hin, egal wie ichs probier. Es endet immer im lauten Krachen, wenn der Motor irgendwo gegen dreht...

Probleme:
Wie kann ich möglichst in der IF-THEN Anweisung vorgeben, dass der Motor nur von D.2 eingeschalten wird und solange läuft, bis D.5 auf High geht? Andersrum natürlich auch.
Kann ich das toggle nicht durch was besseres ersetzen- etwa toggle-vor und toggle-hinter? Gibts da noch Alternativen? So kann ich ja nicht quer durchs Programm springen später mal, wenn ich vorher schon genau wissen muss, wann ein toggle wohin erfolgen muss...
Da kann ich ja gleich ein Komplettprogramm schreiben, welches keine Eventualitäten zulässt.

Ich hoffe, ihr versteht halbwegs, wie ich das meine. Über ne einfache Hilfestellung würde ich mich sehr freuen

Danke schonmal

kawamaha
01.03.2008, 19:06
also zweimal if then hintereinander geht nicht, dafür gibts"AND". also
if Pind.2 = 1 AND Pind.4 = 1 then...

und da der kontakt "hinten" wieder weg geht, wenn der schlitten vor fährt würd ich den ausgang mit "set" und "reset" programmieren.

gttoxiclt2
01.03.2008, 19:27
Naja mittlerweile hab ich das erste Problem gelöst, wenn auch etwas un-elegant.
Mittlerweile hab ich sogar 3x IF THEN hintereinander, also scheint das doch zu gehen? Oder versteh ich dich falsch?

Mein jetziger Ansatz:



Do

If Pind.2 = 1 Then
If Pind.4 = 1 Then
Stepper_enable = 1
Config Timer0 = Timer , Prescale = 64
Timervorgabe = 89
Enable Interrupts
End If
End If

If Pind.2 = 0 Then
If Pind.4 = 1 Then
If Pind.5 = 1 Then
Stepper_enable = 0
Enable Interrupts
End If
End If
End If


if Pind.4 = 0 then
Toggle Stepper_richtung
If Pind.5 = 1 Then
Stepper_enable = 1
Config Timer0 = Timer , Prescale = 64
Timervorgabe = 89
Enable Interrupts
End If
end if

If Pind.2 = 1 Then
If Pind.4 = 0 Then
If Pind.5 = 0 Then
Stepper_enable = 0
Enable Interrupts
End If
End If
End If

Loop



Damit bleibt er korrekt stehen. Zumindest beim nach vorn fahren. Nur nach hinten krachts und knallts. Hört sich an, als würde das toggle dauernd ausgeführt werden...

Hab mir grad überlegt, dass ich ja so einen Sprung einbauen könnte, der da besagt, wenn D.4 auf 0 geht, ge-toggle-t werden soll. Und dann der sprung zurück eben.

kawamaha
01.03.2008, 20:38
naja, dass sich irgendwas bewegt kann schon sein, aber das programm schaut echt abenteuerlich aus. wenn du wirklich vorwärtskommen willst schau dir doch ein paar programmbeispiele hier im forum an. eine timer config hab ich z. B. auch noch nie in der DO - LOOP schleife gesehen ;-)

gttoxiclt2
01.03.2008, 20:46
Ha, wie gesagt. Anfängeralarm O:)

Hab jetzt mit AND alles eingekürzt und schaut schon besser aus und geht auch. Hatte es heut früh schon probiert, aber da hatte ich zweimal IF-THEN mit AND verbunden und da ging nix O:)

Wegen der Timersache, ich weiß (noch) nicht, wie ich meinem Motor sonst sagen kann, fahr in der Geschwindigkeit los... Und am Anfang und jetzt auch noch nähre ich mich mehr durch Copy & Paste durchs Forum und die Beispielprogramme durch.

Die eigentliche Struktur wollte ich dann zurechtrücken, wenn alles läuft.

gttoxiclt2
02.03.2008, 11:31
So, nun habe ich etwas Ordnung reingebracht. Mit der Sache Set & Reset steh ich noch etwas auf dem Schlauch.

Ich hab auch meinen Fehler gefunden, warum es immer kracht und knallt. Allerdings weiß ich nicht so direkt, wie ich ihn verhindern kann. Vielleicht kannst du mir da noch einen Schubs geben in die richtige Richtung?

Und zwar, beim zurückfahren, fragt mein "Programm" ja jetzt immer ab, ob der Eingang D.4 auf 0 ist. Wenn ja, dann toggle die Motorrichtung. Und da mein Programm ja immer die Runde rum läuft, toggle-t der ja ständig...

So lautet meine Frage:

Wie kann ich, wenn der Eingang D.4 von 1 auf 0 abfällt, meinem Programm mitteilen, dass es nur 1x toggle-t? Und nicht immer wieder?
Es darf nur dann wieder ge-toggle-t werden, wenn auch der Eingang D.2 wieder auf High geht. Allerdings dann auch nur 1x bis D.5 auf High geht!

Wenn ich das so schreibe, kommt mir die Sache mit dem Set und Reset in den Sinn. Aber ich weiß nicht, wie ich das umsetzen kann.

Danke für deine Hilfe.

kawamaha
02.03.2008, 12:26
also mit toggle würd ichs nicht machen. ich würd zwei ausgänge machen, einmal "vor" und einmal "rück" und wenn der schalter "vorne" kommt, würd ich "vor" rücksetzen und "rück" setzen, dann natürlich wenn der schalter "hinten" kommt umgekehrt

gttoxiclt2
02.03.2008, 13:01
Oh mann, du hast Recht ](*,)

Natürlich, ich mach ja mit toggle nichts anderes, als zwischen 0 und 1 zu schalten.
Habs jetzt mit set portb.1 bzw. reset portb.1 versucht. Das erspart mir den ganzen quatsch mit toggle.

Danke schonmal bis hierher und ich versuch mich jetzt weiter.

Ne Frage, kann ich eigentlich IF-THEN 3,4 und 5x ineinander verschachteln? Im RN Wissen steht ja, es kann verschachtelt werden, aber die Frage ist, ob das das Programm dann irgendwann zu sehr ausbremst, wenn es sich in den "Schachteln" verfängt.