Forum: Mikrocontroller und Digitale Elektronik Bestätigungston für Tasteneingabe - in Interrupt oder Abfrageroutine?


von Ralf (Gast)


Lesenswert?

Hi,

ich hab eine Matrixtastatur, zu der ich gerne bei einem Tastendruck 
einen Quittungston ausgeben möchte. Wo würdet ihr den Quittungston 
ausgeben? Im Interrupt oder in den Abfragefunktionen?

Beides hat Vor- und Nachteile. Im Interrupt würde ich sofort hören, wenn 
ich eine Taste drücke. In den Abfrageroutinen hör ich den Ton dann, wenn 
das Programm den Tastaturbuffer ausliest. Man würde dann hören, wenn das 
Programm irgendwo hängt, andererseits könnte es ja auch vorkommen, dass 
der Ton spürbar nach dem Tastendruck kommt, was ja dann nicht so 
professionell rüberkommt.
In den Abfragefunktionen wär's wahrscheinlich auch etwas komplizierter 
zu implementieren, aber ich hab z.B. eine Abfragefunktion, welche 
wiederholte Tastenanschläge ausgibt, wenn man auf der Taste bleibt, also 
sollte es ja dann auch wiederholt einen Ton geben.
Wie macht ihr denn sowas?

Ralf

von Max Neumann (Gast)


Lesenswert?

Du machst dir um so etwas gedanken?

von Ralf (Gast)


Lesenswert?

> Du machst dir um so etwas gedanken?
Du nicht? Dann gehörst du vielleicht zu den Leuten die sich ein Programm 
zusammenpopeln, welches zufällig ein bisschen funktioniert und schlecht 
bedien- und wartbar ist. Oder vielleicht gehörst du auch zu denen, denen 
das Wissen um solche Programmstrukturen vielleicht schon in die Wiege 
gelegt worden ist.
Was also ist falsch daran zu fragen, wie andere Leute sowas machen? Was 
ist falsch daran, zu versuchen herauszufinden, ob es vielleicht etwas 
gibt, was ich übersehen haben könnte, und was mir dabei hilft, was 
ordentliches zustande zu bringen?

Ralf

von Ganymed (Gast)


Lesenswert?

>Was also ist falsch daran zu fragen,
>wie andere Leute so was machen?

nichts!!

Ich würde ISRs immer so kurz wie möglich
machen. Dann hat das Hauptprogramm die meiste
Zeit. Wahrscheinlich kommt es dann auch nicht
zu Verzögerungen zwischen Tastenanschlag und Signal.

von Richard (Gast)


Lesenswert?

> Du machst dir um so etwas gedanken?
Absolut legitime Frage.

Warum vermutest du, dass es zu Verzögerungen kommt, wenn du den Ton in 
der Abfragefunktion machst? Läuft die so selten, dass das auffällt? Dann 
wäre aber nicht nur der Tastenklick verzögert, sondern auch das was der 
Tastendruck bewirken soll.
Ich würde das in der Abfragefunktion machen. Dort hast du auch alle 
Infos darüber beisammen, ob das ein dauerhafter Tastendruck ist/wird -> 
erneut Ton (oder nicht). Somit ist dort die geignete Stelle.

von Peter D. (peda)


Lesenswert?

Ich mache sowas immer in der Mainroutine.
Allerdings schreibe ich das Main auch immer so, daß es nicht in 
irgendwelchen Wartezeiten ewig lange verreckt.
Für Wartezeiten kehren alle Funktionen sofort zum Main zurück, bis sie 
abgelaufen sind.
Ein Durchlauf dauert daher nur wenige ms, was nicht merkbar ist.

Man kann den Ton aber auch im Timerinterrupt der Tastenabfrage starten.
Man muß ja nur nen PWM-Ausgang enablen und der disabled sich dann wieder 
in seinem Overflowinterrupt nach der gewünschten Tondauer.


Peter

von Seppl (Gast)


Lesenswert?

Ich mache das normalerweise so:

Im Interrupt (z.B. alle 10ms oder 5ms) ein Flag setzen,

Im Hauptprogramm Flag abfragen, wenn gesetzt:

Flag löschen,
Tasten abfragen, entprellen
und wenn Taste erkannt Bestätigungston auslösen
ggf. auch auf "Taste gültig" beschränken
(wobei mir das Gepiepse auf den Keks geht)

Restliche Schritte vom Programm ausführen.

Bisher konnte keine "Verzögerung" auf Tastendrücke
feststellen.

Ein schönes Wochenende

Seppl

von Ralf (Gast)


Lesenswert?

Hallo,

ich danke euch allen für die Antworten.

@Ganymed:
> Ich würde ISRs immer so kurz wie möglich machen. Dann hat das
> Hauptprogramm die meiste Zeit. Wahrscheinlich kommt es dann auch nicht
> zu Verzögerungen zwischen Tastenanschlag und Signal.
In meinem Fall habe ich die Timer-ISR so aufgebaut, dass sie alle 
3.333ms auftritt. Die ISR ist in drei Abschnitte unterteilt, von denen 
jeder Abschnitt bestimmte Aufgaben übernimmt, einer macht die Abfrage 
der Matrix-Tastatur. Ein Abschnitt kommt somit alle 10ms an die Reihe, 
die einzelnen Abschnitte haben einen Versatz von 3.333ms.

@Richard:
> Warum vermutest du, dass es zu Verzögerungen kommt, wenn du den Ton in
> der Abfragefunktion machst? Läuft die so selten, dass das auffällt? Dann
> wäre aber nicht nur der Tastenklick verzögert, sondern auch das was der
> Tastendruck bewirken soll.
Zu Verzögerungen würde es ja nur kommen, wenn ich in einem Abschnitt des 
Hauptprogramms auf irgendwas warten würde bzw. wenn das Programm 
irgendwo hängt. Ich hab das Programm so geschrieben, dass ich nicht 
direkt warte, sondern anhand von Zuständen, etc. entscheide, was getan 
werden muss. Also kein richtiges Warten, die nächste Funktion kommt dann 
gleich an die Reihe, wenn nix zu tun ist.

> Ich würde das in der Abfragefunktion machen. Dort hast du auch alle
> Infos darüber beisammen, ob das ein dauerhafter Tastendruck ist/wird ->
> erneut Ton (oder nicht). Somit ist dort die geignete Stelle.
Ja, das sehe ich auch so, wie du sagst, dort habe ich jeweils alle Infos 
zusammen, und z.B. bei der Funktion für wiederholte Tastenanschläge kann 
ich's auch passend synchronisieren.

@PeDa:
> Ich mache sowas immer in der Mainroutine. Allerdings schreibe ich das
> Main auch immer so, daß es nicht in irgendwelchen Wartezeiten ewig lange
> verreckt. Für Wartezeiten kehren alle Funktionen sofort zum Main zurück,
> bis sie abgelaufen sind. Ein Durchlauf dauert daher nur wenige ms, was
> nicht merkbar ist.
Ja, so ist mein Programm auch aufgebaut, alle Funktion prüfen, ob sie 
was zu tun haben, wenn nicht, zurück ins Main, dann darf gleich der 
nächste in der Reihe ran.

> Man kann den Ton aber auch im Timerinterrupt der Tastenabfrage starten.
> Man muß ja nur nen PWM-Ausgang enablen und der disabled sich dann wieder
> in seinem Overflowinterrupt nach der gewünschten Tondauer.
Für einen ersten Test hab ich das so gemacht, um zu sehen ob es 
prinzipiell so funktioniert. Dazu hab ich bei erkanntem Tastendruck in 
der ISR eine Zählervariable mit der Wunschdauer des Tons geladen und den 
Timer 2 in den Freqenzausgabemodus versetzt (ich verwende einen 8051er) 
und aktiviert. Bei jedem erneuten Durchlauf der ISR hab ich die Variable 
dekrementiert und auf 0 geprüft, in dem Fall dann einfach den Timer 2 
gestoppt.
Ich werd's jetzt so umbauen, dass die Variable in den Abfrageroutinen 
geladen wird, und in der ISR starte/stoppe ich weiterhin den Timer.

@Seppl:
> Im Interrupt (z.B. alle 10ms oder 5ms) ein Flag setzen,
> Im Hauptprogramm Flag abfragen, wenn gesetzt:
> Flag löschen, Tasten abfragen, entprellen und wenn Taste erkannt
> Bestätigungston auslösen ggf. auch auf "Taste gültig" beschränken
> (wobei mir das Gepiepse auf den Keks geht)
> Restliche Schritte vom Programm ausführen.
> Bisher konnte keine "Verzögerung" auf Tastendrücke
> feststellen.
grins Das Gepiepse kann schon nerven, das stimmt, ich muss die 
Frequenz noch n bisschen anpassen :)
Die Tastenabfrage möchte ich jetzt ungern vom Timer-Interrupt ins 
Hauptprogramm auslagern. Richtige Verzögerungen konnte ich bis jetzt 
auch keine feststellen.

Ralf

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.