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