www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Matrix-Tastatur an AtMega8


Autor: dacripple (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: dacripple (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dacripple (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

#include <avr/io.h>
#include <util/delay.h> 




void init_keypad(){
    DDRD=0b00001111;//PINS D4-D6 sind Ausgänge, D0-D3 sind Eingänge
    PORTD=0b00001111;//Pull-Ups von D0-D3 aktivieren
}

char which_key(){
    int temp=0;
    char zeichen='-';
    //Erste Spalte auf 0V

    PORTD=0b00111111;
    _delay_us(10);
    temp=PIND;
    switch(temp){
        case 115:
            zeichen = '3';
        case 179:
            zeichen = '6';
        case 211:
            zeichen = '9';
        case 227:
            zeichen= '#';
        default:
        ;
    }

    _delay_us(10);
    PORTD=0b01011111;
    _delay_us(10);
    temp=PIND;
    switch(temp){
        case 117:
            zeichen = '2';
        case 181:
            zeichen = '5';
        case 213:
            zeichen = '8';
        case 229:
            zeichen = '0';
        default:
        ;
    }

    _delay_us(10);
    PORTD=0b01101111;
    _delay_us(10);
    temp=PIND;
    switch(temp){
        case 118:
            zeichen = '1';
        case 182:
            zeichen = '4';
        case 214:
            zeichen = '7';
        case 230:
            zeichen = '*';
        default:
        ;
    }

    return zeichen;
}





int main (void){
    int i,j;
    char z=58;
    init_keypad();

    DDRC= DDRC | (1<<DDC0);//PIN C0 ist Ausgang

    while(1){
        j=0;
        z=which_key();
        j=z-48; //von z den ASCII Wert von '0' abziehen

        for(i=0; i<j; i++){ //LED Blinkschleife
            _delay_ms(50);
            PORTC= PORTC | (1<<PORTC0);//Ausgang C0 auf HIGH
            _delay_ms(50);
            PORTC= PORTC & ~(1<<PORTC0);//Ausgang C0 auf LOW#
        }
    }
}

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dacripple (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@da criple

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

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung zum Code von Peter,

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

gruß Florian

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tach auch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.