Hallo Leute, ich sitze hier vor einen kleinen Problem. Ziel ist es eine Ausgabe über ein LCD Display zu machen und 'gleichzeitig' einen Schrittmotor zu betreiben. Der Gedanke war dieses mit Hilfe von 2 Interrupts zu machen. Ich hab 2 Programme für die jeweiligen Abläufe. Diese werden von 2 Timern über Interrupts aufgerufen. Leider klappt das nicht. Es scheint als würden sich die Interrupts gegenseitig blockieren. Ich habe schon getestet die Interrupts manuell wieder freizugeben: "sei" und dann ein "ret" sowie das ganze über ein "reti" zu machen. Kann mir da vielleicht jemand ein paar Tips geben oder mir vielleicht sagen ob das vom Ansatz her falsch ist ? grüße Timo
Tödlich für solche Funktions-zusammenführungen sind Interruptroutinen mit langen Prozesszeiten oder sogar pausenschleifen, die mit hoher Frequenz aufgerufen werden sollen. Jedenfalls ist es schwierig ohne quellcode irgendetwas genaueres sagen zu können.
Warum willst Du das Display auch über Interrupt steuern ? Beim Schrittmotor macht es Sinn, damit die Pulse schön synchron kommen und der Motor rund läuft. Beim LCD macht es keinen Sinn. Mach' ne Hauptschleife für das LCD und Interrupts für den Motor. Übrigens sollen die Interrupt Routinen kurz sein, also keine großen Berechnungen in der Motor Interrupt routine machen, sondern eventuell in der Hauptschleife die Daten vorbereiten.
Hallo Teemo, eigentlich ist die Sache ganz einfach: In der Hauptschleife schaust Du nach wieviele Schritte Du gehen mußt und schreibst das in eine globale Variable. Dort kannst Du auch Dein Display ansteuern. Der Timerinterrupt ist nur dazu da, den Schrittmotor anzusteuern. Dabei entscheidet die Zykluszeit des Timers über die Schrittgeschwindigkeit des Motors. Gruß Matthias
Hallo Teemo wenn Du 2 Prozesse steuern willst dann würde ich nur den Zeitkritischen Prozess in die Interruptroutine stecken den anderen im normalen Programmablauf. Die Schrittmotor Routine würde ich in den Interrupt bearbeiten, und die LCD Ansteuerung im normalen Programmablauf. MfG Torsten
Danke für die schnelle Antwort. Also Lange-Warte-Schleifen habe ich extra vermieden. Ich hab die Datei hochgeladen. Hier ist der Link : http://imojo.de/code.txt Das Problem umfasst folgende Funktionen : go_lcd (wird durch Interrupt aufgerufen um das LCD Display anzusteuern) und go_sm (um den Schrittmotor aufzurufen) Die Funktionen alleine und für sich funktionieren. Nur leider nicht zusammen. Bitte nicht meckern für den teilweise unübersichtlichen Code.... es handelt sich hierbei um die Arbeit eines Anfängers :D Grüße Timo
Vorschlag zur Interrupt-Service-Routine (ISR): ISR if Timer1_Flag == true { Schrittmotor-Routine } if Timer2_Flag == true { LCD-Modul-Routine } reti Alternativ könnte auch nur die Motor-Routine mittels Interrupt abgearbeitet werden, da die LCD-Routine vielleicht etwas zeitunkritischer ist: main if Timer2_Flag == true { LCD-Modul-Routine } call Irgendwas1 call Irgendwas2 call Irgendwas3 goto main ISR if Timer1_Flag == true { Schrittmotor-Routine } reti
1 | ;+------------------------------------------------------------------------ |
2 | ;| LCD CONTROLLER - Overflow Timer1 |
3 | ;+------------------------------------------------------------------------ |
4 | go_lcd: |
5 | sbi PORTC,5 |
6 | rcall wait |
genau sowas meinte ich mit "tödlich".
diese Zeile gehört dort eigentlich nicht hin. Wurde nur zu Testzwecken eingefügt. Bin hier die ganze Zeit am rumprobieren und hatte vergessen sie zu löschen. Grüße, Timo
Der Code wurde nun aktualisiert. Die LCD Funktion wird in der Mainloop aufgerufen. Der Interrupt springt in die SM Motor Funktion. http://imojo.de/code.txt Das Resultat ist foglendes : Der Schrittmotor läuft und macht das was er soll. Leider dsa LCD Display nicht mehr :( Das reagiert gar nicht mehr. Ich fummel hier weiter rum aber falls jemand noch ne Idee hat wär ich dankbar THX Timo
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.