Hallo, zusammen ich hätte ein Problem bei dem ich mal eure Hilfe bräuchte ! Ich taste in einer Timer - ISR die Ausgangsimpulse eines Drehgebers mit 1024 Schritten ab, ca. 80 - 100 kHz. Nun möchte ich den errechneten Wert auf dem Display ausgeben. Nun stellt sich allerdings das Problem, wenn der Controller die Zeichenübertragung zum Display auf Grund eines Interrupts unterbricht, das Display abstürzt. Allerdings kann ich ja während dem ausgeben der Zeichen nicht die Interrupts sperren ! Atmega 8,16 / WinAVR Danke !
Du kannst ja das Ausgeben immer NACH einem Lesezyklus des Drehgebers machen lassen. Entweder noch direkt in der ISR oder da halt eben ein Flag setzen, ISR beenden und dann das Ausgeben aufrufen, wenn das Flag gesetzt ist. Das Ausgeben muss dann eben rechtzeitig vor dem nächsten Interrupt beendet sein.
Hallo Thomas, das geht leider nicht weil das ausgeben zu lange dauert. Bei einer Abtastrate von 80 kHz hätte ich nur 12 µs Zeit zum ausgeben der Daten, derzeit brauche ich ca. 3,5 ms.
@ Michael >das geht leider nicht weil das ausgeben zu lange dauert. Aber nicht, wenn die Datenausgabe in der Main-Loop läuft und per Flag vom Interrupt getriggert wird. Für das Display reicht eine Update-Rate von sagen wir 10 Hz mehr als aus, also muss dein Interrupt alle 8000 Interrupts ein Flag setzen, welches die Main-loop erkennt und die Ausgabe startet. Natürlich wird die Ausgabe sehr oft durch den Interrupt unterbrochen, das sollte aber für die meisten LCD bei richtiger Programmierung kein Problem sein. Sicherst du in der Interrupt-Routine auch alle verwendeten Register? >Bei einer Abtastrate von 80 kHz hätte ich nur 12 µs Zeit zum ausgeben >der Daten, derzeit brauche ich ca. 3,5 ms. MfG Falk
Hm, dann kannst du vielleicht in der Ausgaberoutine zumindest bei kritischen Stellen den Timer-Int ausschalten und danach wieder ein?
Hallo Falk, ich hab´s mal nach deinem Schema probiert und mir dem richtigen LCD - Display funktioniert so !! Welche Register würdet ihr den in der ISR retten ? Danke !
Michael wrote: > Nun stellt sich allerdings das Problem, wenn der Controller die > Zeichenübertragung zum Display auf Grund eines Interrupts unterbricht, > das Display abstürzt. Warum sollte das Display abstürzen ? Wenn ein Interrupt ordnungsgemäß programmiert ist, d.h. alle Resourcen so hinterläßt, wie er sie vorgefunden hat, dann stürzt nichts ab. Fast jeder Programmierer benutzt Interrupts und nichts stürzt ab (außer mal die Kaffeetasse vom Tisch). Peter
Michael wrote: > Bei einer Abtastrate von 80 kHz hätte ich nur 12 µs Zeit zum ausgeben > der Daten, derzeit brauche ich ca. 3,5 ms. Das ist viel zu schnell, kein Mensch kann das ablesen. Mach die Ausgabe nur etwa alle 200ms, das ist ergonomisch. Peter
@ Michael >ich hab´s mal nach deinem Schema probiert und mir dem richtigen LCD - >Display funktioniert so !! >Welche Register würdet ihr den in der ISR retten ? Du musst alle Register retten, welche in der ISR verwendet werden. Sowie das SREG! Wenn man Rechenzeit sparen will reserviert man einfach ein paar Register exclusiv für die ISR, dann muss nur noch das SREG gesichert werden (kann man auch über ein Register machen, muss nicht push/pop sein). @ Thomas >Hm, dann kannst du vielleicht in der Ausgaberoutine zumindest bei >kritischen Stellen den Timer-Int ausschalten und danach wieder ein? Nein, kann er nicht. Dann würden möglicherweise Schritte vom Drehgeber verschluckt. Aber das Ding muss schon schnell drehen um bei 1024 Schritten/Umdrehung 40 kHz hinzulegen, sind schlappe 2300 U/min. MFG Falk
Ist es nicht sogar so, dass der Timer-Überlauf trotz ausgeschaltetem ET0 ein Flag setzt, und dann nach Setzen des ET0 ein wenig verspätet in die Timer-ISR springt? Dann müsste man die Zeit, in der ET0 gelöscht ist, nur noch auf die Zeit zwischen 3 Timerüberläufen beschränken und nicht mehr auf 2. Weiss ja nicht, was das für ein Display ist, aber das sollte schon drin sein.
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.