3x4 Tastenmatrix in der ISR

Gast #4803041
Lesenswert?

Hallo Community,

ich dachte, ich versuche mich auch mal mit einer 3x4 Tastenmatrix am 
ATMega8. Ich setze abwechselnd die Spalten auf LOW und prüfe dabei die 
Zeilen ab. Die Zeilen sind als Eingänge definiert mit internen Pullups 
und die Spalten sind als Ausgänge definiert. Zeilen 2-4 werden 
fehlerfrei übertragen, jedoch Zeile 1 nicht. Ich habe die erste Zeile 
mit dem Multimeter auf Durchgang überprüf-> i.O.
Ich bitte um Durchsicht meines Codes.

in diesem Sinne:
1
ISR (TIMER0_OVF_vect)
2
{
3
  
4
  PORTB|=(1<<Spalte1)|(1<<Spalte2)|(1<<Spalte3);
5
  
6
  switch(position)
7
  {    
8
    case 0:
9
    PORTB&=~(1<<Spalte1);
10
    if (!(PINB&(1<<Zeile1)))
11
    {
12
      uart_puts("1");
13
      _delay_ms(300);
14
    }
15
    else if (!(PINB&(1<<Zeile2)))
16
    {
17
      uart_puts("4");
18
      _delay_ms(300);
19
    }    
20
    else if (!(PINB&(1<<Zeile3)))
21
    {
22
      uart_puts("7");
23
      _delay_ms(300);
24
    }    
25
    else if (!(PINB&(1<<Zeile4)))
26
    {
27
      uart_puts("*");
28
      _delay_ms(300);
29
    }    
30
    break;
31
        
32
    case 1:
33
    PORTB&=~(1<<Spalte2);
34
    
35
    if (!(PINB&(1<<Zeile1)))
36
    {
37
      uart_puts("2");
38
      _delay_ms(300);
39
    }
40
    else if (!(PINB&(1<<Zeile2)))
41
    {
42
      uart_puts("5");
43
      _delay_ms(300);
44
    }    
45
    else if (!(PINB&(1<<Zeile3)))
46
    {
47
      uart_puts("8");
48
      _delay_ms(300);
49
    }    
50
    else if (!(PINB&(1<<Zeile4)))
51
    {
52
      uart_puts("0");
53
      _delay_ms(300);
54
    }
55
    break;
56
        
57
    case 2: 
58
    PORTB&=~(1<<Spalte3);
59
    if (!(PINB&(1<<Zeile1)))
60
    {
61
      uart_puts("3");
62
      _delay_ms(300);
63
    }
64
    else if (!(PINB&(1<<Zeile2)))
65
    {
66
      uart_puts("6");
67
      _delay_ms(300);
68
    }    
69
    else if (!(PINB&(1<<Zeile3)))
70
    {
71
      uart_puts("9");
72
      _delay_ms(300);
73
    }    
74
    else if (!(PINB&(1<<Zeile4)))
75
    {
76
      uart_puts("#");
77
      _delay_ms(300);
78
    }
79
    break;  
80
  }
81
  position++;
82
  if (position==3)
83
  {
84
    position=0;
85
  }
86
    
87
}
Gast #4803080
Lesenswert?

Keymatrix schrieb:
> Ich würde an deiner Stelle das Rad nicht neu erfinden.
>
> Insbesondere wenn die Neuerfindung so schlecht ist.
>
> siehe z.B.
>
> Beitrag "Taster-Matrix Code von Peda auf AVR"

Was genau findest du daran schlecht? Ich bin für Verbesserungen offen, 
zähle mich aber -vlt. im Gegensatz zu dir- zu der Fraktion, die nicht 
gleich Code kopiert und nach Libs schreit.
Gast #4803097
Lesenswert?

Vermutlich brauchst du ein paar us oder Takte, bis du Zeile 1 lesen 
darfst.

Der Code ist wirklich schlecht.
Kopierter Code für Spalten und reihen
Bitshiftmanipulation direkt
Warten und senden in ISR
Nur eine Taste von x gewinnt
Position weder statisch noch Abfrage > 2
Gast #4803114
Lesenswert?

jetzt bin ich am PC und möchte meine Kritik begründen.

> Kopierter Code für Spalten und Reihen
Die cases unterscheiden sich nur dadurch, dass ein anderes Bit in Port B 
gesetzt wird und ein anderes Zeichen gesendet. Dafür werden 2 Dutzend 
Zeilen kopiert und angepasst. obfuscated Alternative: 
uart_put("1234567890#*"[Zeile+position*3]); //;-)

> Bitshiftmanipulation direkt
(!(PINB&(1<<Zeile2)))
Bei den meisten (flüchtigen) Zeichenfehlern kann niemand warnen. Bei 
"PIN_LOW(PINB, Zeile2) dagegen führen 99% aller Zeichenfehler zu einem 
Build-Fehler. Hier wäre praktisch nur der Suffix von PIN oder Zeile zu 
fragil.

> Warten und senden in ISR
eine ISR sollte nur wenige Takte lang laufen, zumindest nicht viel mehr 
als der "Herzschlag", also der SysTicker. Sonst besser auf Taskebene.

> Nur eine Taste von x gewinnt
wenn das gewollt ist, ok. Aber sonst spräche ja nichts gegen parallele 
Auswertung und ggf. "e" bei mehr als 1 Taste.

> position weder statisch noch Abfrage > 2

wenn Position auch außerhalb verändert werden kann, so ist
1
  if (Position>2)
2
  {
3
    position=0;
4
  }
einfach robuster.

Ich habe die Kritik auch nur geäußert, weil

Erwin schrieb:
> Was genau findest du daran schlecht? Ich bin für Verbesserungen offen,

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren