-
        

Ergebnis 1 bis 8 von 8

Thema: IF - THEN mit Näherungssensoren, Programmablauf Probleme

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2007
    Beiträge
    20

    IF - THEN mit Näherungssensoren, Programmablauf Probleme

    Anzeige

    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:

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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2007
    Beiträge
    20
    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:

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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2007
    Beiträge
    20
    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.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2007
    Beiträge
    20
    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.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2007
    Beiträge
    20
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •