mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.