Hallo!
Ich hab hier ein Problem, an dem ich fast verzweifele...
Ich möchte eine Matrixtastatur an meinen ATMega162 an PORT A
anschließen. Dafür will ich mir eine Funktion bauen, die die aktuell
gedrückte Zahl ausgeben soll. Momentan erkenne ich nur die Zeile:
1 | #define MATRIX_NOKEY 12
|
2 | #define MATRIX_INVALID 13
|
3 |
|
4 | #define nop() \
|
5 | __asm__("nop\n\t" \
|
6 | "nop\n\t")
|
7 |
|
8 |
|
9 | uint8_t matrix_poll_number() {
|
10 | uint8_t number = MATRIX_NOKEY;
|
11 | uint8_t input_value = 0;
|
12 |
|
13 | // Zeile herausbekommen
|
14 | DDRA = 0b10000111; // Zeilen als Eingänge konfig.
|
15 | PORTA = 0b01111000; // Pull-Ups aktivieren, Spalten auf GND ziehen
|
16 | nop();
|
17 | input_value = PINA;
|
18 |
|
19 | if (input_value == 0b01111000) number = MATRIX_NOKEY;
|
20 | else if (input_value == 0b00111000) {
|
21 | // Vierte Zeile
|
22 | number = 24;
|
23 | }
|
24 | else if (input_value == 0b01011000) {
|
25 | // Dritte Zeile
|
26 | number = 23;
|
27 | }
|
28 | else if (input_value == 0b01101000) {
|
29 | // Zweite Zeile
|
30 | number = 22;
|
31 | }
|
32 | else if (input_value == 0b01110000) {
|
33 | // Erste Zeile
|
34 | number = 21;
|
35 | }
|
36 | else number = MATRIX_INVALID;
|
37 |
|
38 | DDRA = 0b11111000;
|
39 | PORTA = 0b00000111;
|
40 |
|
41 | return number;
|
42 | }
|
Die Funktion wird im Hauptprogramm periodisch ca. alle 500ms aufgerufen
und der Rückgabewert wird auf dem UART ausgegeben.
Das komische ist nun folgendes: Wenn ich eine oder beide der vorletzten
Anweisungen der Funktion, also DDRA = 0b11111000; und PORTA =
0b00000111; auskommentiere, funktioniert alles wie erwartet.
Wenn aber beide Anweisungen drin sind kommt immer MATRIX_INVALID als
Rückgabewert. Wie kann das denn sein, wenn zum Zeitpunkt der beiden
Anweisungen der Inhalt der Variable number schon feststeht?
Kann mir da jemand helfen?