Problem: Interrupt Drehgeber LCD - Ausgabe AVR

Gast #572437
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 !
Gast #572439
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.
Gast #572457
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
#572478
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
#573309
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
Gast #573347
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren