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.
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:
Mein Ziel ist folgendes:Code: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
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
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.
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:
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...Code: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
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.
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
Ha, wie gesagt. Anfängeralarm
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
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.
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.
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
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.
Lesezeichen