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!!
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?
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.
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.
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 | }
|
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
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
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.
@da criple Hast du das hinbekommen mit der Matrixtastatur. Ich brauche die nämlich auch und komme da nicht weiter.
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).
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.