Forum: Compiler & IDEs 4x4 Tastaturabfrage


von Andreas R. (svsalzburg1933)


Angehängte Dateien:

Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

JTAG-Fuse ist deaktiviert?

von wt (Gast)


Lesenswert?

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.

von Andreas R. (svsalzburg1933)


Lesenswert?

was ist JTAG-Fuse ? Wo befindet sich diese ? Von der hab ich noch nie 
was gehört .

von Peter D. (peda)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Andreas R. wrote:
> was ist JTAG-Fuse ? Wo befindet sich diese ? Von der hab ich noch nie
> was gehört .

AVR Fuses

von Andreas R. (svsalzburg1933)


Lesenswert?

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

von wt (Gast)


Lesenswert?

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ß

von JayJay (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von JayJay (Gast)


Lesenswert?

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