PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmverbesserung erwünscht!



gttoxiclt2
07.03.2008, 09:44
Hallo,

noch eine Frage:
Ich lerne immer mehr über einzelne Befehle und dessen Sinn. Allerdings komm ich meistens nicht allein drauf, sondern mit Hilfe des Forums hier O:)

Nun ne Frage. Mein Programm wird langsam aber stetig größer. Nun frage ich mich, ob ich gewisse Sachen besser anders schreiben sollte.
Wie im nachfolgenden Auszug ersichtlich.
Die Frage dazu erfolgt weiter unten


Do

If Pind.2 = 1 And Pind.7 = 0 Then 'Monitor hinten & Relais1 eingeschalten
Stepper_richtung = 0 'Schlitten fährt nach vorn
Stepper_enable = 1 'Motor einschalten
Config Timer0 = Timer , Prescale = 64
Timervorgabe = 89
End If

If Pind.6 = 1 And Pind.7 = 0 Then 'Monitor ist in Mitte & Relais1 eingeschalten
Waitms 650 'solange warten, bis an richtigem Schwenkpunkt angekommen
Stepper_enable = 0 'jetzt Motor ausschalten
End If

...


Ist der Schlitten an der richtigen Endlage (pind.2 = 1) und ein Relais wird eingeschalten, dann soll der Motor los drehen und den Schlitten solange bewegen, bis der nächste Endpunkt erreicht ist (pind.6 = 1).
Dann noch paar Sek. warten und dann abschalten.

Mir macht mein Programm etwas Sorge, da der Motor von einem If-then auf die Reise geschickt wird und von einem anderen wieder gestoppt.
Was passiert, wenn etwa pind.6 nicht auslöst, aufgrund Hardware Probleme? Dann fährt der Schlitten bis ins Nirvana, bzw. seinen sicheren Tod.

Ich möchte gerne, dass intern in einem einzelnen If-THEN, WHILE-WEND oder DO-LOOP geklärt wird, dass bei der Bedingung (d.2 high und d.7 low) der Schlitten losfährt und nur solange fährt, bis d.6 high wird. Mit meinem "Programm" hab ich ebenfalls Sorge, dass das Programm irgendwann den richtigen If then übersieht und den Motor nicht stoppt, da ja noch viel mehr solche ähnlichen Situationen dazu kommen.

Ebenfalls hab ich eine Frage zur Sicherheit. Ich hab gehört, dass man parallel zu einem Prozess intern einen Zähler aktivieren kann, der hochzählt, z.B. Sek.
Sowas wäre mir in oben genannten Programm gerade recht. Wenn ich mit Stoppuhr messe, wie lange der Schlitten im Idealfall braucht um von d.2 zu d.6 zu gelangen. Erreicht der Schlitten nicht in der angegebenen Zeit d.6, dann sollte das Programm stoppen, so wie es steht.
Wie würde dafür der korrekte Code aussehen?

Ich kann mir schwer vorstellen, wie mehrere Prozesse parallel laufen sollen, wo doch das Programm von oben nach unten abgearbeitet wird...?!


Vielen Dank für ne Hilfestellung!

python_rocks
07.03.2008, 10:38
Nun frage ich mich, ob ich gewisse Sachen besser anders schreiben sollte.
Hallo toxic!

Gleich vorab: Ich habe noch keine Erfahrung mit Steppern und weiß auch nicht ob das was ich jetzt schreiben werde auch wirklich wie gewünscht funktioniert.

Ich weiß nicht, wie du deinen Stepper ansteuerst, aber falls du die Geschwindigkeit über die IC-Kombination L298 und L297, oder ähnliche Schaltungen, regelst, dann kannst du die Geschwindigkeit des Steppers über ein Rechtecksignal steuern. So ein Rechtecksignal kannst du dir vom TIMER1 generieren lassen. Dieses kannst du mit COMPARE1A sogar in der Frequenz ändern.

Mit dieser Einstellung ``CONFIG TIMER1 = TIMER , CLEAR TIMER = 1 , COMPARE A = TOGGLE`` wird bei jedem Erreichen des Wertes COMPARE1A der Timer auf 0 zurück gesetzt und der Pin OC1A wird getoggelt. Siehe: http://avrhelp.mcselec.com/index.html?config_timer1.htm

Jetzt musst du nur im Programm den Timer1 starten, stoppen und die Frequenz durch zuweisen eines Wertes an COMPARE1A einstellen.

Um deinen Motor also langsam anlaufen zu lassen, brauchst du nur noch eine Prozedur nach diesem Schema:

- COMPARE1A auf kleinen Wert setzen
- Timer1 starten
- Signal für den L297 setzen, damit der Motor vor läuft
- in einer kleinen Schleife:
--- kurz warten
--- COMPARE1A erhöhen
- COMPARE1A auf volle Geschwindigkeit setzen

Um deinen Motor langsam abzubremsen, brauchst du nur noch eine Prozedur nach diesem Schema:

- in einer kleinen Schleife:
--- COMPARE1A verkleinern
--- kurz warten
- Signal für den L297 setzen, um den Motor zu stoppen
- Timer1 stoppen

Aber starte die Prozeduren nicht in einem Interrupt-Handler. Setze dort lieber ein Flag, welches du in der MainLoop abfragst. Starte die Prozeduren dann dort in der MainLoop. Einzig das schnelle Stoppen des Motors muss in einem Interrupt-Handler passieren, dass es zuverlässig passiert.

Weiters kannst du die Schalter für die Anschlagpunkte auf Interrupt-Leitungen legen und in den jeweiligen Interrupt-Handlern den Motor stoppen lassen bzw. stoppen, umpolen und wieder starten lassen.

Wann du welche Aktionen durchführen lässt, hängt natürlich von deiner Anwendung ab. Ich habe leider noch nichts mit Steppern gemacht. Aber das steht ganz oben auf meiner Liste. :-)

Und wenn jemand merkt, dass ich hier Blödsinn verzapfe, dann bitte ich um entsprechende Hinweise!!!

lg
Gerold
:-)

PS: Ich bezeichne den Label, der bei einem Interrupt angesprungen wird, als "Interrupt-Handler". Ich bin das so von anderen Programmiersprachen gewohnt, in denen oft von "Event-Handlern" gesprochen wird. Diese werden bei bestimmten Events angesprungen.

PS2: Ich glaube, ich habe auf den falschen Thread geantwortet. Das hätte besser zu https://www.roboternetz.de/phpBB2/viewtopic.php?t=38768 gepasst.

.

python_rocks
07.03.2008, 10:58
Ebenfalls hab ich eine Frage zur Sicherheit. Ich hab gehört, dass man parallel zu einem Prozess intern einen Zähler aktivieren kann, der hochzählt, z.B. Sek.
Hallo toxic!

Wenn du den Timer1 für die Ansteuerung des Schrittmotors verwendest, dann kannst du einen Interrupt aktivieren, der bei COMPARE1A auslöst. Mit ``ENABLE COMPARE1A`` und ``Enable Interrupts`` wird er aktiviert und mit ``ON COMPARE1A On_Compare1A`` kannst du diesem Interrupt den Interrupt-Handler "On_Compare1A" zuweisen. In diesem Interrupt-Handler kannst du eine Variable nach oben zählen lassen. Diese Zahl prüfst du in deiner MainLoop ständig ab. Und wenn diese Zahl einen vorgegebenen Wert überschreitet, dann schaltest du das System ab.

mfg
Gerold
:-)