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