3 Stelligen Code mit 3x4 Matrix Tastatur am atmega8

Geschrang

Neues Mitglied
20. Dez. 2009
4
0
0
Sprachen
Hallo zusammen.
Ich habe ein kleines problem mit meinem Projekt. Ich muss mit ner 3x4 Matrix-Tastatur einen 3 Stelligen Code programmieren und anschließend mit der *-Taste bestätigen. Wenn der Code richtig ist, leuchtet meine Bi-Color LED grün auf und wenn falsch, dann rot. Mit der #-Taste setze ich den Vorgang zurück, es muss auch mittendrin passieren können.
Ich habe ein Programm gefunden, mit dem ich die Tasten einlesen und ausgeben kann. Bekomme aber den Code nicht hin.

Hier nochmal die Aufgabenstellung.

Mit einem Zifernblock ist ein Code-Schloss zu programmieren.
Nach Eingabe des Codes(3 Ziffern) und der *-Taste erfolgt die Rückmeldung durch eine grüne LED (Eingabe korrekt) oder eine rote LED (Eingabe falsch). Beide LED´s sollen jeweils kurz aufleuchten.
Dann ist das Code-Schloss für eine neue Eingabe bereit.
Mit der #-Taste wird die Eingabe gelöscht bzw. abgebrochen.
Drei richtige Zifferncodes sind im Programm hinterlegt.


Ich hab schon alles mögliche durchprobiert, komme aber zu keinem Ergebniss.

Gruß

Alex
 

Anhänge

  • Matrix-der-letzte-Versuch.bas
    3,4 KB · Aufrufe: 123
Hi,

Ich habe ein Programm gefunden, mit dem ich die Tasten einlesen und ausgeben kann. Bekomme aber den Code nicht hin.
...
Drei richtige Zifferncodes sind im Programm hinterlegt.

Ich hab schon alles mögliche durchprobiert, komme aber zu keinem Ergebniss
heißt also, die Tastaturabfrage und Anzeige im Display läuft aber der Vergleich
der Eingabe mit dem richtigen Code läuft nicht wie gewünscht ? Also die
eigentliche "Schloß-Funktion" ?

Bin nicht so der richtige BASCOMer ...

Also nochmal der Code in voller Schönheit ...


CodeBox BASCOM
'Alexander Kinder
'FEV 08
'Matrix Tastatur

'----------------------------------------------------------------------------------------------------------------------------

$regfile = "m8def.dat"
$crystal = 1000000
'-------------------------------------------------------------------------------------------------------------------------------
Ddrc = &B00000011 'Ausgaenge LED
'-------------------------------------------------------------------------------------------------------------------------------
Declare Sub Tastatur

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Potrd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdbus = 4
Deflcdchar 0 , 32 , 4 , 21 , 14 , 14 , 21 , 4 , 32 ' replace ? with number (0-7)
Deflcdchar 1 , 32 , 32 , 10 , 31 , 10 , 31 , 10 , 32 ' replace ? with number (0-7)
Cursor Off Noblink


Sub Tastatur
'Alle nötigen Variablen
Dim T As Byte 'wird der spätere Tastaturcode gespeichert
Dim H As Byte 'Hilfsvariable
Dim Taste As Byte
T = 0
Dim I As Byte
Dim Temp As Word
Dim Zwi1 As Integer , Zwi2 As Integer ,
dim Zwi3 As Integer , Pw As Integer
Dim Passwort As Integer



'----------------------------------------------------------------------------------------------------------------------------
'Die ersten 3 Ports abfragen,
Do
'dazu die Spalten als Inputs und die Zeilen auf GND ziehen
Config Pinb.4 = Input
Config Pinb.5 = Input
Config Pinb.3 = Input
Config Pinb.7 = Input
Portb.4 = 1
Portb.5 = 1
Portb.3 = 1
Portb.7 = 1
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
'Berechnung des Tastaturcodes als Byte
H = 1 * Pinb.4
T = T + H
H = 2 * Pinb.5
T = T + H
H = 4 * Pinb.3
T = T + H
H = 8 * Pinb.7
T = T + H
'Die letzten 4 Ports abfragen,
'dazu die Zeilen als Inputs und die Spalten auf GND ziehen
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pinb.3 = Output
Config Pinb.7 = Output
Portb.4 = 0
Portb.5 = 0
Portb.3 = 0
Portb.7 = 0
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1 'Letzte Berechnung für den Byte-Tastaturcode
H = 16 * Pinb.0
T = T + H
H = 32 * Pinb.1
T = T + H
H = 64 * Pinb.2
T = T + H 'Ausgabe der Tastencodes auf dem LCD
Upperline
Lcd "Key: "

'---------------------------------------------------------------------------------------------------------------------
Select Case T

Case 102 : Taste = 1
Locate 1 , 5 : Lcd Chr(0)

Case 86 : Taste = 2
Locate 1 , 6 : Lcd Chr(0)

Case 54 : Taste = 3
Locate 1 , 7 : Lcd Chr(0)

Case 103 : Taste = "*" 'Umwandlung der Tastencodes in Tastenzahlen und Ausgabe auf dem LCD

Case 55 : Taste = 0
T = 0
H = 0


Do
Portc = &B00000001
Loop Until T = 55

End Select

Loop

Bis Zeile 20 ist Initialisierung (LCD, Takt, ...)
in 22 definierst du die Unterroutine "Tastatur" :confused: :confused:
dann kommt von 24-33 wieder Variablen-Initialisierungen
Danach fängt die Hauptroutine an (38 Do ... 113 Loop)
Mit den Portumstellungen da drin ... :confused:
Die Umstellungen am Port sind wohl für den Scanvorgang der Matrix ...

Irgendwie steig ich da nicht durch (ok kein Bascommer :D ) ...
Mir kommt das so vor als ob da Teile fehlen oder was durcheinander
geraten ist ... :confused:

Werden die Tasten richtig abgefragt und erkannt ?
kannst du beim debuggen die korrekten Tastencodes auf dem LCD sehen ?
Schreib mal wie die Matrix am AVR hängt und an welchen Kreuzpunkten
welche Taste hängt ...
Sind da bei der Matrix Dioden mit drin ?

Gruß
Dino
 
Richtig, es ist die Schloß-Funktion, die mir Kopfschmerzen bereitet. Da ich auch kein richtiger BASCOMer bin.
 
Es ist das einzige Programm, dass auf Anhieb funktionierte.
Von

do
config Pinb.4 = Input
....
Upperline
Lcd "Key: "

Es hat mir für die Tasten ganz komische Zahlen auf dem LCD ausgegeben. Daraufhin hab ich den Rest selber dazu gebeastelt, damit zumindest für jede Taste der richtige Zahlenwert ausgegeben wird.
 
Hallo Alex!

Ich werde und kann dir hier keine fertige Lösung präsentieren, aber vielleicht kann ich dir den ein oder anderen Denkanstoß geben.

Interessant wäre es aber gewesen, wenn du dich erst mal etwas vorgestellt hättest....
Warum programmierst du denn in BASCOM, wenn du kein "Bascomer" bist?
Hast du die kostenlose Version von BASCOM, oder bereits eine Vollversion auf dem PC?
Welchen Controller nutzt du denn für deinen Versuch?
Welche Vorbildung besitzt du eigentlich?
Hast du dir den Code vielleicht nur "zusammen gesucht", oder selbst erstellt?


Soweit erst einmal zu den Fragen, die mir ganz spontan beim Lesen deines Beitrages gekommen sind.


Fangen wir nun aber erst mal "oben" an....
Warum benutzt du die BASCOM-Routine "Getkbd" eigentlich nicht?
Mit "Config Kdb = PortX" und "Getkdb" hast du doch eine einfache Methode um eine 3x4 bzw. 4x4 Tastaturmatrix abzufragen.
Schau doch mal in die Hilfe bei BASCOM zu den o.g. Befehlen. ;)

Dann hast du einen "Scancode" und mittels einer Tabelle am Ende deines Programmes kannst du dem "Scancode" auch eine Zahl, oder Anderes zuweisen.

Wenn das geklappt hat und die Ausgabe am Display wie gewünscht funktioniert, dann kannst du dich um die Schossvariante kümmern.

Aber mal ehrlich..... etwas Hirnschmalz und einige Selbstversuche bringen dich bestimmt ganz schnell voran.
Tja und wenn du dann absolut nicht weiter kommst, dann stell deinen Programmcode und Schaltplan hier ein und wir schauen alle gemeinsam noch mal drüber. :)

Ein Tipp aber noch zum Schluss.....
BASCOM bringt alles mit, was du für dein Programm benötigst!
Lass also die ASM-Befehle ruhig mal in der Schublade! ;)


Gutes Gelingen und schöne Grüße,
Cassio
 
Oh, sorry. :eek:
Hi, mein Name ist Alex. Ich bin zur Zeit angehender Elektrotechniker und werde im Moment mit allen möglichen Programmiersprachen voll geballert.
Wir haben das Thema BASCOM nur kurz angeschnitten und haben jeder ne Aufgabe bekommen ein Programm zu erstellen. Wir müssen uns alles selber erarbeiten, aus dem Grund hab ich auch enorme Schwierigkeiten. Wir nutzen die Schulversion des BASCOM AVR und programmieren den ATmega8.
Den ATmega8 brennen wir über ein USB-Port.

Den Code hab ich mir natürlich zusammen gesucht, da ich BASCOM-Routine "Getkbd" schon ausprobiert habe und keinen Erfolg erzielen konnte.

Es wär natürlich schöner mit BASCOM-Routine "Getkbd" zu arbeiten, weil ich mir allein schon die tipperei erspart hätte. Aber was solls.

Und danke erstma für Eure Antworten

Gruß
Alex
 
Hallo Alex!

Danke, dass du meinem Rat gefolgt bist und du dich hier erst einmal ein wenig vorgestellt hast.

Nun haben wir auch eine entsprechende Vorstellung davon, warum und wieso du dieses Projekt bearbeiten möchtest. :)

Das ihr euch alles selbst erarbeiten sollt, ist natürlich schon eine harte Aufgabe.... wenn man die Programmiersprache nicht kennt.
Kannst du dich denn wenigstens mit ein paar Anderen zusammen setzen und die Aufgabe gemeinsam erarbeiten?


Nun aber zurück zu deinem Programm....

Ich übrlege gerade, was dir Probleme bei "Getkdb" bereitet hat.
Wenn du mit dem Mega8 arbeitest dann musst du nur schauen, dass du einen kompletten Port frei hast.... sonst könnte es ggf. zu Problemen kommen.
Der Befehl "Config Kdb" setzt nämlich einen ganzen Port voraus!
Vielleicht probierst du es noch mal....

Danach musst du dann dass "Übersetzen" der gedrückten Tasten in die realen Zahlen, z.B. mittels "Lookup", realisieren.

Anschließend musst du die einzeln eingelesenen Zahlen in eine Variable (oder mehrere) speichern und mit deiner Vorgabe vergleichen.

Je nach Tastendruck "*" oder "#" erfolgt dann die Auswertung bzw. Löschung.

Soweit erst mal zur "Roadmap"....
Ich müsste das aber selbst erst mal durchspielen, weil ich so ein Programm noch nicht geschrieben habe. (mangels Verwendungszweck ;) )


Ach so....
Wieviel Zeit hast du denn, für deine Zahlenschlossaufgabe?

Gruß,
Cassio
 
Kannst du dich denn wenigstens mit ein paar Anderen zusammen setzen und die Aufgabe gemeinsam erarbeiten?

Hi Cassio,

zu den anderen gehöre unter anderem ich :D

Die Sachen mit dem getkbd haben wir zusammen ausprobiert. Bei mir ist das mit der vollständigen Tastatur kein Problem und funktioniert jetzt auch wunderbar.

Die Tastatur war am kompletten PortB angeschlossen nach dem Bascom Beispiel.
Allerdings wurden die meisten Tasten nicht erkannt, d.h. es kam keine Reaktion. Aus diesem Grunde hat Alex sich jetzt wohl für die manuelle Variante entschieden.

Wenn du bei gelegenheit nochmal in meinen Thread mit dem KS108 reinschauen könntest, hab noch Probleme mit den Fuses sprich dem externen Quarz.

Gruß
Sebastian
 
Hallo,

Es hat mir für die Tasten ganz komische Zahlen auf dem LCD ausgegeben. Daraufhin hab ich den Rest selber dazu gebeastelt, damit zumindest für jede Taste der richtige Zahlenwert ausgegeben wird.
ich schätze mal das das die Scan-Codes der Tasten sind die du da anzeigen
lassen hast.

Scancodes sind so etwas wie die Position der Taste in der Matrix.
Also sozusagen die Koordinaten in der Matrix. Das muß man dann noch in
die richtige Beschriftung der Taste umsetzen.

Sieh mal hier ... ASCII-Keyboard mit 4Bit-LCD und Tiny2313
ist zwar alles in Assembler aber evtl erklärt es dir das mit den Scancodes
(oder Keycodes) etwas ...

Gruß
Dino
 
Hi Cassio,

zu den anderen gehöre unter anderem ich :D

Hallo Sebastian!

Na, dann seid ihr ja wenigstens schon mal zu zweit! :)


Ist schon komisch, dass "Getkdb" bei Einem funktioniert und bei einem Anderen nicht. :hmmmm:

Wenn ich an den Mega8 und einen ganzen Port denke, dann fällt mir immer nur der Port D ein.
Port B nehme ich selten..... einfach um die Anschlüsse für den externen Quarz frei zu halten.
OK, wenn ihr natürlich später den INT0 oder INT1 mal brauchen solltet, dann muss man eben auf den extenen Quarz verzichten und Port B benutzen.
Irgendwas ist ja immer. ;)



Wenn du bei gelegenheit nochmal in meinen Thread mit dem KS108 reinschauen könntest, hab noch Probleme mit den Fuses sprich dem externen Quarz.

Sorry, aber manchmal rutschen mir die ein oder anderen Threads schon mal durch. :eek:
Dachte aber auch, dass du das Problem schon gelöst hattest.

Habe aber noch mal kurz etwas dazu geschrieben. ;)


Grüße an euch beide,
Cassio
 
Hallo zusammen, guten Morgen,

die Routine GETKBD() in Bascom ist relativ trickreich. Ich habe in der Vergangenheit auch festgestellt, dass es wohl Unterschiede zwischen verschiedenen BASCOM-Versionen gibt. Aber nachdem Ihr ja die Schulversion verwendet gehe ich davon aus, dass Ihr beide die gleiche BASCOM-Version habt.

Unter dem Aspekt, dass Ihr beide die gleiche HW verwendet läßt sich eigentlich ein unterschiedliches Verhalten nicht erklären. Um aber genauere Aussagen zum komischen verhalten zu treffen wäre es gut, wenn Ihr uns den Schaltplan mal zur Verfügung stellt, damit wir sehen können, wie Ihr die Matrix beschaltet habt.

Weiter kann ich Euch sagen, ist GETKBD() für eine 4x4 Matrix ausgelegt. Es sollte aber kein Problem sein, wenn Ihr das Ding richtig konfiguriert. Achtung, CONFIG KBD geht immer von einem ganzen, vollständigen Port aus. Also volle 8 Bit. Bedeutet, wenn Ihr das nicht zur Verfügung stellt und an einer Leitung noch etwas anderes Betreibt dann kann da durchaus Müll rauskommen.

Mit CONFIG KBD könnt Ihr eine ganze Menge einstellen. Bitte schaut Euch dazu die Hilfe in BASCOM an, damit es klarer wird.

Weiter gibt es die Funktion LookUp() mit deren Hilfe ein Tastaturcode in eine Variable umgesetzt werden kann. Das ganze funktioniert6 mit dem Trick über eine Tabelle. In der Tabelle definiert Ihr Euch Eure Variablen die dann zur weiteren Vararbeitung zurück gegeben werden können.

Ich würde Euch auf jeden Fall raten mit den in BASCOM beschriebenen Widerständen zu arbeiten. Mehr Infos dazu gibt es auch in der BASCOM Hilfe.

Soooo, und für den Fall, das Ihr es doch von Hand machen müsste dann könnt Ihr Euch ja auch mal meine Lösung ansehen. ich habe einst eine eigene Tastatur-Matrix gebaut und die Auswertung von Hand geschrieben. Vielleicht hilft Euch dieser Denkanstoß ja auch weiter.

Hier findet Ihr meine 3x3 Tastenmatrix

Viele Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)