Sehr geehrte Forenkollegen, ich komm einfach nicht zurecht mit dem Code, der mir im letzten Beitrag (ist schon eine Weile her, finde den Beitrag nicht mehr) gegeben wurde. Zur Kontrolle welche Taste welcher Zahl entspricht gebe ich die keyscan() auf dem LCD aus, allerdings steht dort immer eine 8 außer ich drücke die vorletzte Reihe von oben (dann kommt 12) oder die letzte Reihe (16). In diesen zwei Fällen kommt die sich von 8 unterscheidende Zahl allerdings nur wenn man eine der jeweils ersten 3 Tasten (von links) drückt. Bei Betätigung der Taste am rechten Rand kommt auch in diesen Reihen die 8. Mein Ziel ist es nun, dass ich für die jeweiligen Tasten Zahlen bekomme die ich dann fix annehmen kann in meinem weiteren Code. Ich bitte um Ratschläge! MfG Andreas
zwar merkwürdige Art und Weise, Tastenfeld zu scannen, aber sollte grundsätzlich funktionieren, vorausgesetzt man tut die Matrix an die richtige pins anschliessen. Bei Deiner Besreibung würde ich empfehlen, den Aufbau noch mal zu prüfen.
wt wrote:
> zwar merkwürdige Art und Weise, Tastenfeld zu scannen
Was ist daran merkwürdig?
Man fragt einmal die Zeilen ab und einmal die Spalten, das ist am
wenigsten Aufwand (Code, CPU-Zeit).
Die umständlichere Methode wäre, die Zeilen umzuschalten und viermal die
Spalten einzulesen, also doppelter Aufwand.
Das lohnt sich daher nur, wenn man auch 2 gedrückte Tasten erkennen muß.
Peter
Andreas R. wrote: > was ist JTAG-Fuse ? Wo befindet sich diese ? Von der hab ich noch nie > was gehört . AVR Fuses
Hallo, ach .. ich war am verzweifeln . Hab den Fehler in der Software gesucht und dann war ich doch einfach nur so dumm und hab vergessen einen Pin der Tastatur an den ATMEGA anzuschließen. Das Prog funktioniert prächtig, danke für den Hinweis mit "Fehler im Aufbau suchen". MfG Andreas
bitte, bitte @ Peter die umständlichere Methode hat viele Vorteile und funktioniert bei jeder Matrix. Ich finde es eher umständlich verschiedene Methoden zu implementieren und sie dann testen und neu qualifizeiren. gruß
ich hab mal ne Frage zum mitgelieferten Code: Warum ist der Buffer 20 Zeichen lang, wenn das char Array höchstens 3 Zeichen lang sein müsste, denn er höchste Wert im Array wäre ja 16:
1 | {'1','6',0} |
Das ist nach gerade ressourcensparend. Auch eine zweite Sache juckt mich: wäre es nicht klüger das ganze Interrupt gesteuert zu machen? Schließlich will ich nicht andauernd die Tastatur abfragen, nur um zu schauen ob einer ne Taste gedrückt hat. Das "debouncen" funktioniert hier über "_delay_ms(50);" oder? Wertvolle Zeit in der man was anderes tun könnte... Für den Zweck vieler Menschen mag die Routine vieler Menschen wahrscheinlich ausreichen. Eine Interrupt-Service Routine wäre aber besser. Ich hab leider keine geschrieben, die eine Tastatur abfragt, aber im Artikel Entprellung [[http://www.mikrocontroller.net/articles/Entprellung]] findet man eine für 8 Taster an einem Port. Vielleicht hat ja jemand zuhause eine und kann die posten. so long...
JayJay wrote: > ich hab mal ne Frage zum mitgelieferten Code: Du musst unterscheiden zwischen dem eigentlich interessanten Code und dem Testcode, der benötigt wird um diesen interessanten Code in Aktion zu zeigen. > Warum ist der Buffer 20 Zeichen lang, wenn das char Array höchstens 3 > Zeichen lang sein müsste, denn er höchste Wert im Array wäre ja 16: > {'1','6',0} Dieser Buffer ist im Testcode und gehört nicht zur eigentlichen Auswertung. Ob du den 10 oder 20 oder 3 Elemente gross machst, ist für die eigentliche Matrix-Auswerterei völlig belanglos. In realem Code wird sich auch niemand per itoa/printf/sprintf den Keycode in einen String umwandeln um ihn auszugeben. > > Das ist nach gerade ressourcensparend. Für nicht benutztes SRAM kriegt man kein Geld zurück. Gerade solche Ausgabepuffer neigen gerne mal dazu, aus falscher Sparsamkeit heraus zu klein dimensioniert zu werden. Vor allen Dingen in einem Testcode ist ein zu klein dimensionierter Buffer oftmals eine unnötige Stolperfalle. > Auch eine zweite Sache juckt mich: wäre es nicht klüger das ganze > Interrupt gesteuert zu machen? Schließlich will ich nicht andauernd die > Tastatur abfragen, nur um zu schauen ob einer ne Taste gedrückt hat. Wodurch willst du den Interrupt auslösen lassen? Tastendruck ist keine so gute Idee (ausser wenn du den µC schlafen legst und eine Taste ihn aufwecken muss). Du kriegst sonst das Tastenprellen voll durch. Da Tastatur-Auswerten nichts zeitkritisches ist, wäre eine vernünftige Lösung die, das ganz in einem Timer zyklisch anzustossen. > Das "debouncen" funktioniert hier über "_delay_ms(50);" oder? Wertvolle > Zeit in der man was anderes tun könnte... Nochmal: Bei dem Codefragment geht es um die Auswertung der Matrix an sich. Also: Wie kriegt man raus, welche Taste gedrückt ist? Debouncen, Auswertung und wie und wo man diese Auswertung macht, ist nicht Gegenstand des Codeschnipsels.
gutgut... Ich dachte nur für den nächsten Anfänger, wie ich selbst auch noch einer bin, sind ein paar zusaätzliche Infos ganz gut. Die eigentliche Frage des Threads ist ja eh schon beantwortet. Schließlich sollte der nächste der den Threrad liest möglichst viele Fragen beantwortet bekommen, sodass er keinen neuen aufmachen muss. Für Testcode, da gebe ich dir uneingeschränkt Recht, ist alles in Ordnung. >Da Tastatur-Auswerten nichts zeitkritisches ist, wäre eine vernünftige >Lösung die, das ganz in einem Timer zyklisch anzustossen. Jo das meine ich. Ich hatte einfach an einen Timer Overflow Interrupt mit hohem Vorteiler gedacht. Da kann man alles mögliche abfragen ohne das der Programmablauf unnötig verzögert wird. Besonders wenn der uC irgendwelche zeitkritischen Aufgaben erfüllt ist _delay_ms() nicht gerade erste Wahl. Nimmt man z.B. einen 8-bit Timer mit Vorteiler 1024 bei 8MHz dann würde die Tastatur 30x die Sekunde abgefragt.
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.