Forum: Mikrocontroller und Digitale Elektronik 3x4 Tastenmatrix in der ISR


von Erwin (Gast)


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
}

von Keymatrix (Gast)


Lesenswert?

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"

von Erwin (Gast)


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.

von Achim (Gast)


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

von A. S. (Gast)


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,

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
Noch kein Account? Hier anmelden.