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