Forum: Mikrocontroller und Digitale Elektronik LC - Display mithilfe einer Matrix Tastatur ansteuern


von Lukas E. (wiv5)


Lesenswert?

Hallo!
Ich bin neu in der Welt der Mikrocontroller und habe folgende Frage:
Ich möchte mithilfe eines ATMega 8 ein LC-Display über eine 4x4 atrix 
Tastatur ansteuern und werde dies in der Programmiersprache C versuchen.
Jetzt wollte ich mal fragen was ihr mir raten würdet wie ich am besten 
anfange bzw was ihr sagt wie man dieses Programm aufbauen sollte.
Erstes Problem wie kann icham besteb abfragen welche Taste im Moment 
gedrückt ist?
PS: Habe leider auch noch wenig Erfahrung mit C.
Danke im Vorraus!

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Lukas Eckl schrieb:
> PS: Habe leider auch noch wenig Erfahrung mit C.

und scheinbar auch wenig Erfahrung mit "strukturiertem Vorgehen 
(analysieren, beschreiben etc)" im allgemeinen. Welche 
Programmiersprachen kennst du denn schon?

> Ich möchte mithilfe eines ATMega 8 ein LC-Display
> über eine 4x4 atrix Tastatur ansteuern

Ein Display kann nicht über eine Tastatur "angesteuert" werden, den 
Begriiff hast du etwas ungeschickt ausgewählt.

Du kannst dir eine Tastatur-Einlese-Routine schreiben  oder vorhandene 
Routinen nutzen (nur du selbst weißt welche und wieviele Tasten du 
nutzen möchtest, und wie die an deinem uC angeschlossen sind), und dann 
aufgrund von Tastenbetätigungen einen klitzekleinen Moment später 
"irgendwas" machen

Dann kannst du eine Displayroutine schreiben oder nutzen, die 
"irgendwas" darstellt (nur du alleine weißt wie groß dein Display ist, 
ob es zeichenorientiert oder "graphisch" darstellt, und wie das Display 
an deinem uC angeschlossen ist)

Und dann kannst du dir überlegen, WAS WO WIE passieren soll, wenn du 
(zuvor) bestimmte Tasten gedrückt hattest. Wenn z.B. eine Taste "^" 
existiert und zuvor gedrückt wurde, dann kann das bedeuten, daß in einem 
Menuepunkt eine Zeile hochgescrollt wird, oder der Schnurrbart vom 
dargestellten Super-Mario oder gar der ganze Mario nach oben zuckt. Was 
du mit welcher TAste zu welchem Zeitpunkt unter welchen Randbedingungen 
bewirken willst weißt auch nur du alleine.


Alle die Dinge die nur du alleine weißt sind spezifisch. Solange du da 
nichts drüber verrätst, oder dir keine Gedanken zu machst, ist viel 
Glaskugel-Raten und Würmer-aus-der-Nase-ziehen angesagt.

PS: Du hast bestimmt einen Fahrrad-Tacho oder kennst einen der einen 
hat?

Übungsaufgabe: Versuche zu beschreiben, wie der Tacho mit den paar am 
Tacho vorhandenen Tasten bedient wird, und was wann passiert (du 
brauchst dazu keine Programmierkenntnisse, nur eine genaue Beobachtungs- 
und Beschreibungsfähigkeit)

Danach beschreiben DEINE Anwendung die du vorhast, mit ähnlichen 
Worten/Methoden

> Erstes Problem wie kann icham besteb abfragen welche Taste im Moment
> gedrückt ist?

Nö, das ist dein 59. Problem oder so (siehe das zuvor gesagte)

von Lukas E. (Gast)


Lesenswert?

Okay also ich versuche mein Projekt mal einfach zu erklären.
Es soll ein Stelltrafo über einen Schrittmotor angetrieben werden. Der 
Schrittmotor wird durch den Mikrocontroller über eine Treiberstufe 
angerieben.
Auf dem LC-Display soll ein Menü entstehen bei dem man die gewünschten 
Parameter durch rauf- runterscrollen auswählen kann und dann die 
gewünschte Werte über die 4x4 Tastatur eingeben kann bzw ändern kann 
(LC-Display: 2x16 Zeichen zeichenorientiert)
Und jetzt wollte ich eben fragen ob ihr Ideen habt wie man das am besten 
anpacken kann bzw wie so ein Programmcode ca aussehen muss?

von Karl H. (kbuchegg)


Lesenswert?

Lukas E. schrieb:

> Und jetzt wollte ich eben fragen ob ihr Ideen habt wie man das am besten
> anpacken kann bzw wie so ein Programmcode ca aussehen muss?


Schrittweise arbeiten!
Das ist das um und auf bei der Programmierung.

Zerlege dein Komplettproblem in Teilprobleme. Wähle die Teilprobleme so, 
dass du dich nach jedem Teilschritt ein bischen mehr an deine 
Komplettlösung annäherst.

Empfehlenswert ist es, wenn man erst mal mit der Ausgabe anfängt. Denn 
eine Möglichkeit, auf der du dir in weiterer Folge Zwischenergebnnisse, 
dich interessierende Variablen etc. ausgeben lassen kannst, ist ein 
wichtiges Hilfsmittel in der Programmentwicklung. Also ist es 
vernünftig, wenn man diesen Teil ganz am Anfang erledigt.

Und dann: Schritt für Schritt das nächste Teilproblem dazunehmen. Wenn 
du noch am Anfang deiner Programmierkarriere stehst, dann eher kleine 
Schritte als Große! Du willst bei jedem Teilschritt immer so schnell wie 
möglich in einen Zustand kommen, an dem du diesen Teilschritt 
ausführlich testen kannst. Und erst dann, wenn du mit diesem Teilschritt 
zufrieden bist, kommt der nächste. Was du auf keinen Fall haben willst: 
Einen Haufen Programmcode, der nicht funktioniert und bei dem du keinen 
blassen Schimmer hast, wo du mit Fehlersuche anfangen sollst. Arbeitest 
du schrittweise und testest du jeden kleinen Teilschritt ausführlich, 
dann ist die Chance hoch, dass ein fehlerhaftes Verhalten vom letzten 
Teilschritt herrührt, den du als letztes ergänzt hast.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Lukas E. schrieb:
> Und jetzt wollte ich eben fragen ob ihr Ideen habt wie man das am besten
> anpacken kann bzw wie so ein Programmcode ca aussehen muss?

Die von dir benötigten Software-Module sind schon erfunden, du brauchst 
sie nur geeignet zusammen zu kleben. Um das zu können, mußt du aber erst 
mal ein paar grundsätzliche Überlegungen anstellen und festlegen.

1. Einlesen einer Tastaturmatrix
Frage vorneweg: Wofür brauchst du 16 Tasten, um in einem Menue herum zu 
navigieren? hoch, runter, Eingabe sind grad mal 3 Tasten. Was machst du 
mit den anderen 13 Tasten?

> dann die gewünschte Werte über die 4x4 Tastatur eingeben kann
> bzw ändern kann

ok, also irgendwelche "Werte": Vermutlich Ausgangsspannung oder so?

dann könnten die Ziffern 0..9, evtl. noch Korrekturtaste "nützlich" 
sein.


Wie bewegst du dich im Nenue, welche Taste soll zu welchem 
Zeitpunktdrückbar sein, und welche Reaktion im display oder "extern" 
bewirken?

2. Ausgabe:
Wie sieht dein Menue aus? Beschreibe umgangssprachnlich, was zu welchem 
Zeitpunkt "zu sehen" ist im Display (Menuepunkte)
Welche Ausgabe soll im "Wirkbetrieb" erfolgen, z.B. wenn der Motor 
verfährt?

3. Ansteuerung des Schrittmotors
Ist dein Treiber "nur" ein Leistungstreiber, d.h. machst du die Taktung 
der einzelnen Phasen selbst? Oder verwendest du einen fertigen Chip?
Gibt es eine (absolute oder relative) Rückmeldung über die angefahrene 
Position?

Alles Fragen, welche noch keine einzige Zeile Code benötigen, sondern 
erst mal durchdacht werden wollen.

Dann braucht es natürlich noch einer real existierenden Hardware, auf 
dem das ganze läuft. Wie sieht die denn aus?

von Lukas Eckl (Gast)


Lesenswert?

Danke für die Antworten!

1. Die 16 Tasten werden benötigt um die Parameter eingeben zu können. 
Also eben 0-9,Kommataste, Korrekturtaste und Eingabetaste und dann eben 
die Tasten zum Rau und Runterscrollen im Menü hatte ich mir gedacht.
Im Menü soll man nur die Scroll- und Eingabetaste benützen können.

2.Die Menüpunkte sind: Prüfspannung, Prüfdauer, 
Anstiegszeit,Abstiegszeit und "Start".
Ich habe mir das so vorgsetellt das man die Parameter auswählen kann und 
dann die entsprechenden Werte eingibt und es dann so einen Art 
"Startknopf" gibt.
Welche Ausgabe wenn der Motor verfährt? Du meinst eine Art Errormeldung?

3. Ist ist nur ein reiner Leistungstreiber vorhanden.

Wo findet man diese einzelnen Softwaremodule? Damit ich mal einen 
ungefähren Überblick bekomme wie soetwas ca aussieht und aufgebaut ist.

Danke für eure Hilfe!

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Lukas Eckl schrieb:
> Danke für die Antworten!
>
> 1. Die 16 Tasten werden benötigt um die Parameter eingeben zu können.
> Also eben 0-9,Kommataste, Korrekturtaste und Eingabetaste und dann eben
> die Tasten zum Rau und Runterscrollen im Menü hatte ich mir gedacht.
> Im Menü soll man nur die Scroll- und Eingabetaste benützen können.
>
> 2.Die Menüpunkte sind: Prüfspannung, Prüfdauer,
> Anstiegszeit,Abstiegszeit und "Start".
> Ich habe mir das so vorgsetellt das man die Parameter auswählen kann und
> dann die entsprechenden Werte eingibt und es dann so einen Art
> "Startknopf" gibt.
> Welche Ausgabe wenn der Motor verfährt? Du meinst eine Art Errormeldung?

Na, das ist doch schon mal ein Anfang.

Jetzt nimm dir ein Blatt Papier, und überlege dir, was wann GENAU 
passieren soll.

nach dem Einschalten könnte z.B. für 1 Sekunde folgendes auf dem Display 
Stehen:

+----------------+
|  Motortreiber  |
|Lukas Eckl v 1.0|
+----------------+

danach könnte als "erste Menuemaske" folgendes auftauchen

+----------------+
|*Prüfspannung   |
| Prüfdauer     v|
+----------------+

und die "*" Zeile kennzeichnet die Zeile, welche beim Betätigen der 
Eingabetaste ausgewählt werden würde. Das v bzw ^ kennzeichnet mögliche 
Tastenbetätigungen, und kann genau so als Symbol dargestellt werden.

Zum Navigieren im Menue gibt es verschiedene Varianten. Ich hab mir 
jetzt mal spontan 2 Menueideen ausgedacht. Sicherlich gibt es noch 
verschiende Andere Möglichkeiten. Vorgeführt jeweils: Start-Menuezeile, 
und dann 2 * Taste "runter" = v gedrückt)

Variante A:

+----------------+
|*Prüfspannung   |
| Prüfdauer     v|
+----------------+
+----------------+
| Prüfspannung   |
|*Prüfdauer     v|
+----------------+
+----------------+
| Prüfdauer      |
|*Anstiegszeit  v|
+----------------+

Variante B:

+----------------+
|*Prüfspannung   |
| Prüfdauer     V|
+----------------+
+----------------+
| Prüfspannung   |
|*Prüfdauer     V|
+----------------+
+----------------+
|*Anstiegszeit  ^|
| Abstiegszeit   |
+----------------+



Nach Auswahl des Eingabethemas (Prüfspannung, Prüfdauer ...) kommt dann 
noch die Eingabe der Werte selbst, auch da kannst du dir Gedanken machen 
was wann wo wie zu lesen oder einzugeben ist.

==> Wie du in deinem Menue rumnavigierst, und welche Eingaben wann wie 
möglich sind, weißt nur du alleine, bzw. liegt bei deinem persönlichen 
Geschmack.

Da mußt du erst mal ein wenig in gedankliche Vorleistung treten. Nur du 
weißt schlussendlich was du da fabrizieren möchtest.

Und, NEIN: du brauchst zu diesem Zeitpunkt noch gar nicht "wissen", wie 
man feststellt, daß die Taste 'v' gedrückt wurden war, welche sich an 
Zeile 3, Spalte 4 deiner Tastaturmatrix befindet. Vertraue einfach 
darauf, daß es Tasten-Einlese-Routinen gibt (geben wird), welche dir 
genau eine Taste zurück liefern.

Das ganze geht also "vom Großen" "ins Kleine", man nennt das auch 
"Top-Down" Entwurf.

Beim Hausbau dennkst du vermutlich auch nicht von Anfang an darüber 
nach, welcher Installateur wann und wie die Deckenlampe an der Decke 
montieren wird. Du vertraust einfach drauf, daß das "irgendwann, 
irgendwie" weiter geklärt wird, und das sowas möglich ist (eine 
Deckenlampe an die Decke zu schrauben)


Andererseits: Es gibt schon vorgefertigte Menue-Routinen (Stöbere mal 
hier im Forum ein wenig rum mit der Suchfunktion), vielleicht ist ja 
deine bevorzugte Navigation und Darstellung dabei. Wenn nicht, mußt du 
halt ein wenig anpassen. Setzt aber voraus, daß man a) weiß was man 
machen möchte (wie es nachher aussehen soll), und b) daß man versteht 
wie das umzusetzen ist.

> Welche Ausgabe wenn der Motor verfährt? Du meinst eine Art Errormeldung?

Es gibt 2 "Zustände" deiner Mimik:
a) Menue- bzw. Eingabemodus
b) Funktionsmodus

Ich meinte jetzt eher weniger Fehlermeldungen, sondern sowas: Was 
während deines Eingabemodus passiert ist ja klar, aber was erscheint auf 
dem Display, sobald der Motor losdreht? Bleibt der Menue-Text erhalten, 
oder steht da z.B.

+----------------+
|Motor dreht sich|
|linksrum        |
+----------------+

Was passiert, wenn der Motor fertig ist mit fahren, was steht dann auf 
dem Display?

Nochmal zur Error-Meldung: Dazu müßtest du ja Fehler-Zuständ erkennen 
können, damit du diese signalisieren kannst.

Wenn du z.B. einen Encoder an dem Motor befestigt hast, könntest du 
durch Wieder-Einlesen feststellen, ob sich der Motor wirklich in der von 
dir gewünschten Richtung dreht, und wieviele Schritte er gemacht hat.

> 3. Ist ist nur ein reiner Leistungstreiber vorhanden.

Mann, lasß dir doch nicht so die Würmer aus der Nase ziehen. 
Bauteilbezzeichnung, Schaltplan?

von Karl H. (kbuchegg)


Lesenswert?

Ich möchte eines noch in den Raum stellen:
Zur 'Eingabe' von Zahlen benötigt man nicht unbedingt eine 
Zifferntastatur. Die jeweils relevanten Zahlen sind ja nicht beliebig 
gross, so dass man mit 2 Tasten ('Zahl erhöhen' bzw. 'Zahl erniedrigen') 
erstaunlich gut zurecht kommt.
Alles was man dazu benötigt wird einem von den PeDa Entprellroutinen 
schon zur Verfügung gestellt, so dass eine reine Zahleneingabe auch ohne 
Matrixtastatur, nur mit 3 Tasten, in kurzer Zeit realisierbar ist und, 
das ist schliesslich ein nicht unwesentlicher Punkt, auch komfortabel 
benutzbar ist.

Aus meiner Sicht sieht die Sache so aus, dass man mit minimal lediglich 
3 Tasten eine komfortable und benutzbare Gerätesteuerung aufbauen kann, 
in der durchaus auch Zahleneingaben gut behandelbar sind. Speziell bei 
letzterem ist es der in den PeDa Routinen enthaltene Autorepeat, der ein 
wesentliches Schlüsselelement ausmacht.

von Lukas Eckl (Gast)


Lesenswert?

So wie Variante A hatte ich mir das ungefähr vorgestellt.
Wenn man einen Menüpunkt (z.B Prüfpsannung) ausgewählt hat habe ich mir 
vorgestellt das da z.b:"_   .   V" erscheint und man hier den 
gewünschten Wert eingeben kann.
Wenn der Motor in die vorgegebene Positiion gefahren ist sollen die 
Restwerte wie Restprüfdauer und Prüfspannung usw angezeigt werden.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Lukas Eckl schrieb:
> ausgewählt hat habe ich mir
> vorgestellt das da z.b:"_   .   V" erscheint und man hier den
> gewünschten Wert eingeben kann.

und wie soll dieser Wert genutzt werden? Was soll er bewirken?

von Karl H. (kbuchegg)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Lukas Eckl schrieb:
>> ausgewählt hat habe ich mir
>> vorgestellt das da z.b:"_   .   V" erscheint und man hier den
>> gewünschten Wert eingeben kann.
>
> und wie soll dieser Wert genutzt werden? Was soll er bewirken?


Yep.

Ich fang eigentlich meistens ungekehrt an. Ich fang mit der inneren 
'Maschine' an, die mit den Werten arbeitet und die entsprechenden 
Pulse\Spannungen\was_auch_immer generiert. Die Parameter mach ich 
einfach mal als Variable, die ich zum Testen einfach mal mit konstanten 
Werten besetzte.
Und wenn die dann funktioniert, dann hab ich eine vollständige Sammlung 
aller notwendigen einstellbaren Parameter und überlege mir, wie eine 
entsprechende sinnvolle Menüsteuerung dafür aussehen könnte.

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.