Zitat Zitat von >toxic<
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.

.