Forum: Mikrocontroller und Digitale Elektronik Problem: Interrupt Drehgeber LCD - Ausgabe AVR


von Michael (Gast)


Lesenswert?

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 !

von Thomas (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von Falk (Gast)


Lesenswert?

@ 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

von Thomas (Gast)


Lesenswert?

Hm, dann kannst du vielleicht in der Ausgaberoutine zumindest bei 
kritischen Stellen den Timer-Int ausschalten und danach wieder ein?

von Michael (Gast)


Lesenswert?

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 !

von Peter D. (peda)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Thomas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.