Hallo an alle,
Ich habe eine Matrixtastatur an PortF eines Atmegas1281 angeschlossen.
Ich verwende einen modififizierten Code von Peter Danegger. Bei einer
Taste wird jedoch der falsche Wert gelesen.
Ich habe das komplette Programm schon soweit minimiert:
1 | /* Nächste Zeile aktivieren */
|
2 | MATRIX_PORT = 0xFF;
|
3 | MATRIX_DDR = row[i];
|
4 | MATRIX_PORT = ~row[i];
|
5 |
|
6 | /* Einen Takt warten, da der Ausgang erst einen Takt später gesetzt wird
|
7 | (für 16MHz sind 2 Takte erforderlich) */
|
8 | asm volatile("nop");
|
9 | asm volatile("nop");
|
10 |
|
11 | /* Nächste Zeile einlesen */
|
12 | column = MATRIX_PIN & 0x0F;
|
13 |
|
14 | sendstr1("Read ");
|
15 | sendchar1(column);
|
16 | sendchar1('\n');
|
Dieser Code wird im 10ms im Timer Interrupt ausgeführt.
Nun zum Problem: Drücke ich die Taste 0, wird 0x03 ausgelesen was falsch
ist. Richtig ist 0x0B.
Teste ich diesen Code im Hauptprogramm:
1 | while(1)
|
2 | {
|
3 | MATRIX_PORT = 0xFF;
|
4 | MATRIX_DDR = row[0];
|
5 | MATRIX_PORT = ~row[0];
|
6 |
|
7 | /* Einen Takt warten, da der Ausgang erst einen Takt später gesetzt wird
|
8 | (für 16MHz sind 2 Takte erforderlich) */
|
9 | asm volatile("nop");
|
10 | asm volatile("nop");
|
11 |
|
12 | /* Nächste Zeile einlesen */
|
13 |
|
14 | uint8_t column = MATRIX_PIN & 0x0F;
|
15 | rprintf("Column: %d\n", column);
|
16 | _delay_ms(10);
|
17 | }
|
Wird der richtige Wert eingelesen, nämlich 0x0B.
woran kann das liegen? Ich habe keine Ahnung mehr.
Ich hoffe es kann mir wer helfen.
Danke!
lg Robert