Forum: Mikrocontroller und Digitale Elektronik Matrix-Tastatur an AtMega8


von dacripple (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir vor kurzem ein myAVR Board mit LCD-Addon zugelegt. 
Funktioniert soweit einwandfrei alles.

Ich möchte jetzt eine  3x4 Matrix Tastatur daran anschließen.
Der ATMega8 soll später einen Pater-Noster-Lagerschrank steuern.

Das ganze soll dann so funktionieren:
1.Zahl zwischen '0' und '45' eingeben und mit '#' bestätigen
2.ein Ausgang bleibt dann solange HIGH, bis ein weiterer Eingang z.B. 
45-mal (abhängig von eingetippter Zahl!) von HIGH->LOW wechselt.
3.Jetzt kann eine neue Zahl eingegeben werden.

Mein Problem liegt beim Auslesen der Tastatur, und wie kann ich 
realisieren, das mehrere Ziffern eingegeben werden z.B. '43'?

Lässt sich daran dann noch zusätzlich ein LCD-Display anschließen, mit 
dem man die eingegeben Zahl sehen kann?

Ich wäre euch dankbar wenn mir jemand ein paar Vorschläge schreiben 
könnte, am besten C-Code, da ich mich mit Assembler nicht auskenne.

Vielen Dank im Vorraus!!

von Bastler (Gast)


Lesenswert?

wenn du die tastatur und ein lcd an einen mega8 anschließen willst, kann 
es sein, dass deine ports etwas knapp werden. Was soll denn genau das 
pater noster lager tun?

von dacripple (Gast)


Angehängte Dateien:

Lesenswert?

Also, den Pater-Noster-Schrank kann man sich schemenhaft wie auf dem 
angehängten Bild vorstellen.
Er hat 45 Fächer, einen induktiven Sensor, der jeweils ein HIGH Signal 
liefert wenn ein neues Fach vorbei fährt.
Es soll dann mit der Tastatur die Fach-Nr. z.B. 16 eingegeben werden.
Danach wird mit einem Schütz der Motor des Aufzugs solange 
eingeschaltet, bis der Sensor für die Fächer 16 mal HIGH- Signal 
liefert.

von MagIO (Gast)


Lesenswert?

Wieso wird das eng mit dem Atmega8?

23 I/Os sollten doch wohl reichen.

4 daten- + 2 steuer-Leitungen fürs Display und
3 + 4 für ein 12-Tasten Eingabefeld ...

= 13 I/Os... da bleiben noch 10 I/Os für andere Dinge.

Zum Display:
Das chip select und das read/write Signal kann man hart verdraten, wenn 
man nicht unbedingt lesen muss und die 4 I/Os noch für andere Dinge 
braucht.

Was das auslesen der Tasten betrifft, einfach Schrittweise vorgehen. 
Schreib erst mal den Code, der das Tastenfeld ausliest und irgendwo 
ablegt. Dann setzt man darüber den Code, der einen String einliest.
Und zum Schluss brauchst Du nur noch Code, der den String interpretiert. 
Falsche Eingabe -> Fehler anzeigen
Richtige Eingabe -> Fach auswählen.

von dacripple (Gast)


Lesenswert?

Kann mir jemand sagen was an meinem Code falsch ist?? möchte mit dem 
eingelesenen Wert der 3x4-Matrix-Tastatur eine LED z.B. 8-mal blinken 
lassen, wenn der Wert '8' eingetippt wurde

Vielen Dank im Vorraus!
1
#include <avr/io.h>
2
#include <util/delay.h> 
3
4
5
6
7
void init_keypad(){
8
    DDRD=0b00001111;//PINS D4-D6 sind Ausgänge, D0-D3 sind Eingänge
9
    PORTD=0b00001111;//Pull-Ups von D0-D3 aktivieren
10
}
11
12
char which_key(){
13
    int temp=0;
14
    char zeichen='-';
15
    //Erste Spalte auf 0V
16
17
    PORTD=0b00111111;
18
    _delay_us(10);
19
    temp=PIND;
20
    switch(temp){
21
        case 115:
22
            zeichen = '3';
23
        case 179:
24
            zeichen = '6';
25
        case 211:
26
            zeichen = '9';
27
        case 227:
28
            zeichen= '#';
29
        default:
30
        ;
31
    }
32
33
    _delay_us(10);
34
    PORTD=0b01011111;
35
    _delay_us(10);
36
    temp=PIND;
37
    switch(temp){
38
        case 117:
39
            zeichen = '2';
40
        case 181:
41
            zeichen = '5';
42
        case 213:
43
            zeichen = '8';
44
        case 229:
45
            zeichen = '0';
46
        default:
47
        ;
48
    }
49
50
    _delay_us(10);
51
    PORTD=0b01101111;
52
    _delay_us(10);
53
    temp=PIND;
54
    switch(temp){
55
        case 118:
56
            zeichen = '1';
57
        case 182:
58
            zeichen = '4';
59
        case 214:
60
            zeichen = '7';
61
        case 230:
62
            zeichen = '*';
63
        default:
64
        ;
65
    }
66
67
    return zeichen;
68
}
69
70
71
72
73
74
int main (void){
75
    int i,j;
76
    char z=58;
77
    init_keypad();
78
79
    DDRC= DDRC | (1<<DDC0);//PIN C0 ist Ausgang
80
81
    while(1){
82
        j=0;
83
        z=which_key();
84
        j=z-48; //von z den ASCII Wert von '0' abziehen
85
86
        for(i=0; i<j; i++){ //LED Blinkschleife
87
            _delay_ms(50);
88
            PORTC= PORTC | (1<<PORTC0);//Ausgang C0 auf HIGH
89
            _delay_ms(50);
90
            PORTC= PORTC & ~(1<<PORTC0);//Ausgang C0 auf LOW#
91
        }
92
    }
93
}

von Heiko (Gast)


Lesenswert?

dacripple schrieb:
> Kann mir jemand sagen was an meinem Code falsch ist??

Nicht so spontan, meine Glaskugel ist gerade kaputt.

Was passiert denn?

Ich vermute, deine Konstanten in den case-Statements stimmen nicht. 
Warum? Weil sich bei Eingängen auf Bit0-Bit3 mindestens zwei Konstanten 
derselben Spalte nur um 1 unterscheiden (0bxxxxxx10 und 0bxxxxxx01)

MfG, Heiko

von bix (Gast)


Lesenswert?

dacripple schrieb:
> DDRD=0b00001111;//PINS D4-D6 sind Ausgänge, D0-D3 sind Eingänge
> PORTD=0b00001111;//Pull-Ups von D0-D3 aktivieren

Müsste es nicht heissen:

> DDRD=0b11110000

von dacripple (Gast)


Lesenswert?

Heiko schrieb:
> Was passiert denn?
>
>
>
> Ich vermute, deine Konstanten in den case-Statements stimmen nicht.
>
> Warum? Weil sich bei Eingängen auf Bit0-Bit3 mindestens zwei Konstanten
>
> derselben Spalte nur um 1 unterscheiden (0bxxxxxx10 und 0bxxxxxx01)

Es passiert eben garnichts!

Die Konstanten hab ich aus nem Beispielprogramm von hier:
http://www.roboternetz.de/phpBB2/viewtopic.php?t=44401

Hab noch nicht überprüft ob die Werte (CASE-Statements) stimmen, DANKE 
für den Hinweis, werd ich gleich mal machen.

von Kurt (Gast)


Lesenswert?

@da criple

Hast du das hinbekommen mit der Matrixtastatur. Ich brauche die nämlich 
auch und komme da nicht weiter.

von Lehrmann M. (ubimbo)


Lesenswert?

Dann fangen wir mal von ganz vorne an:

1. Wie sieht dein Schaltplan aus. Wenn nicht vorhanden bitte zeichnen 
(da wird einem selbst einiges klar) und mit Werten (Pullups, etc.). Das 
beinhaltet auch die Spannungsversorgung (mit Abblockkondensatoren) und 
die Taktquelle (soweit vorhanden).

2. Fängt der AVR überhaupts an zu arbeiten (evtl. eine LED einfach 
aufleuchten lassen)

3. Ist das LCD schon implementiert?

4. DDR nochmal anschauen. Nochmals absichern.

5. Code selbst schreiben und keinen Übernehmen den man nicht versteht. 
Wenn nötig http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial


Ich möchte nun noch einige Anregungen zum Thema LCD+Matrixtastatur 
geben. Hier eine minimalst Variante: 
http://www.sprut.de/electronic/pic/test/index.htm#lcd
Benötigt 'nur' einen Port (8 I/Os) für LCD im 8-Bit Modus + 
Matrixtastatur (3x4).

von Peter D. (peda)


Lesenswert?


von Florian (Gast)


Lesenswert?

Anmerkung zum Code von Peter,

er funktioniert super, allerdings muss is muss es für die Spalten wie 
folgt lauten:
1
   if( !(PINA & (1<<PINA0)) ) { col = 4;}
2
   if( !(PINA & (1<<PINA1)) ) { col = 8;}
3
   if( !(PINA & (1<<PINA2)) ) { col = 12;}

gruß Florian

von Peter D. (peda)


Lesenswert?

Florian schrieb:
> allerdings muss is muss es für die Spalten wie
> folgt lauten:

Und wie unterscheidest Du dann den Zustand keine Taste gedrückt?


Peter

von Tach auch (Gast)


Lesenswert?

Nur ein Einwurf dazwischen (nicht zur Tastatur):

dacripple schrieb:
> Es soll dann mit der Tastatur die Fach-Nr. z.B. 16 eingegeben werden.
> Danach wird mit einem Schütz der Motor des Aufzugs solange
> eingeschaltet, bis der Sensor für die Fächer 16 mal HIGH- Signal

Wenn Du jetzut bei der 8 bist und zur 16 willst, dann dreht das Ding so 
lange, bis 16 mal HIGH empfangen wurde? ... dann wärst Du aber bei der 
24!
Wenn Du nicht selber rechnen willst, dann müsstest Du die Fächer wohl 
absolut auswerten - spätestens nach dem Aus- und wieder Einschalten geht 
sonst die Rechnerei los.

Gruss

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.