Ausgänge reagieren bei tastendruck falsch

#1596793
Lesenswert?

Ich versuch jetzt seit Stunden den Fehler zu finden.
Irgendwie hab ich mir mein Programm zerschossen und weiß nicht wo der 
Fehler liegt:
1
#define KEY_DDR         DDRD
2
#define KEY_PORT        PORTD
3
#define KEY_PIN         PIND
4
#define KEY0            0
5
#define KEY1            1
6
#define KEY2            2
7
#define KEY3            3
8
#define KEY4            4
9
#define KEY5            5
10
#define KEY6            6
11
#define KEY7            7
12

13
#define NR_KONFIGS    9
14
#define NR_KEYS      7
15

16
#define OUT_DDR         DDRC
17
#define OUT_PORT        PORTC
18
#define OUT_PIN         PINC
19
#define OUT0            0
20
#define OUT1            1
21
#define OUT2            2
22
#define OUT3            3
23
#define OUT4            4
24
#define OUT5            5
25
#define ALL_OUT      (1<<OUT0 | 1<<OUT1 | 1<<OUT2 | 1<<OUT3 | 1<<OUT4 | 1<<OUT5)
26

27
#define LED0      (1<<OUT0)
28
#define LED1      (1<<OUT1)
29
#define LED2      (1<<OUT2)
30
#define LED3      (1<<OUT3)
31
#define LED4      (1<<OUT4)
32
#define LED5      (1<<OUT5)
33

34
// Tabelle von Zeigern auf die Tastenkonfigurationen erstellen
35
// ===========================================================
36
uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] =
37
  {
38
    {LED0,LED0,LED4,LED3,LED1,LED2,0},            // Konfiguration 1 (C64)
39
    {LED1,LED0,LED3,LED2,LED5,LED4,1},            // Konfiguration 2
40
    {LED5,LED4,LED0,LED2,LED1,LED3,5},            // Konfiguration 3
41
    {LED3,LED1,LED2,LED0,LED4,LED5,3},            // Konfiguration 4
42
    {LED4,LED1,LED2,LED3,LED0,LED5,4},            // Konfiguration 5
43
    {LED5,LED1,LED2,LED3,LED4,LED0,5},            // Konfiguration 6
44
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 7
45
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 8
46
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 9
47
   };
48

49
volatile uint8_t nKonfig = 0;
50

51
int main(void)
52
{
53
  while(1)
54
  {
55
      Summe = 0;
56

57
      if(!(KEY_PIN &(1<<KEY2)))              // Wenn Taste PortD.2 auf LOW
58
        Summe |= KonfigPattern[nKonfig][0];
59
      if(!(KEY_PIN &(1<<KEY3)))              // Wenn Taste PortD.3 auf LOW
60
        Summe |= KonfigPattern[nKonfig][1];
61
      if(!(KEY_PIN &(1<<KEY4)))              // Wenn Taste PortD.4 auf LOW
62
        Summe |= KonfigPattern[nKonfig][2];
63
      if(!(KEY_PIN &(1<<KEY5)))              // Wenn Taste PortD.5 auf LOW
64
        Summe |= KonfigPattern[nKonfig][3];
65
      if(!(KEY_PIN &(1<<KEY6)))              // Wenn Taste PortD.6 auf LOW
66
        Summe |= KonfigPattern[nKonfig][4];
67
      if(!(KEY_PIN &(1<<KEY7)))              // Wenn Taste PortD.7 auf LOW
68
        Summe |= KonfigPattern[nKonfig][5];
69

70
      OUT_PORT = Summe;
71
...

Wenn ich jetzt zb. die Taste von PortD.4 drücke bekomme ich am Ausgang 
PortC.2 und PortC.5 ein HIGH.
Bei den anderen tasten ebenfalls immer 2 verschiedene Ports auf HIGH.
Bei PortD.5 überhaupt ein HIGH auf C.0, C.2 und C.4.

???
#1596901
Lesenswert?

Ich habe den Fehler jetzt eingeschränkt.
Hier mal der Teil des ganzen Programmes der für den Fehler 
verantwortlich ist:
1
// ************************************************************************
2
// *                                                                      *
3
// *                             Arcade Stick                             *
4
// *                         Tastenprogrammierung                         *
5
// *                                                                      *
6
// ************************************************************************
7
 
8
#include <avr/eeprom.h>
9
#include <avr/interrupt.h>
10
#include <avr/pgmspace.h>
11
#include <util/delay.h>
12
#include "lcd.h"
13

14
#ifndef F_CPU
15
#define F_CPU      4000000                  // Processor Takt-Frequenz definieren
16
#warning kein F_CPU definiert
17
#endif
18

19
// Tasteneingänge definieren
20
// =========================
21
#define KEY_DDR         DDRD
22
#define KEY_PORT        PORTD
23
#define KEY_PIN         PIND
24
#define KEY0            0
25
#define KEY1            1
26
#define KEY2            2
27
#define KEY3            3
28
#define KEY4            4
29
#define KEY5            5
30
#define KEY6            6
31
#define KEY7            7
32
#define ALL_KEYS        (1<<KEY0 | 1<<KEY1 | 1<<KEY2 | 1<<KEY3 | 1<<KEY4 | 1<<KEY5 | 1<<KEY6 | 1<<KEY7)
33

34
// Tastendrückwiederholungsdauer definieren
35
// ========================================
36
#define REPEAT_MASK     (1<<KEY0 | 1<<KEY1)
37
#define REPEAT_START    50                               // nach 500ms
38
#define REPEAT_NEXT     20                              // alle 200ms
39

40
// Tasten-Ausgänge definieren
41
// ==========================
42
#define OUT_DDR         DDRC
43
#define OUT_PORT        PORTC
44
#define OUT_PIN         PINC
45
#define OUT0            0
46
#define OUT1            1
47
#define OUT2            2
48
#define OUT3            3
49
#define OUT4            4
50
#define OUT5            5
51
#define ALL_OUT      (1<<OUT0 | 1<<OUT1 | 1<<OUT2 | 1<<OUT3 | 1<<OUT4 | 1<<OUT5)
52

53
#define LED0      (1<<OUT0)
54
#define LED1      (1<<OUT1)
55
#define LED2      (1<<OUT2)
56
#define LED3      (1<<OUT3)
57
#define LED4      (1<<OUT4)
58
#define LED5      (1<<OUT5)
59

60
// LCD-Ausgänge definieren
61
// =======================
62
#define LCD_DDR         DDRB
63
#define LCD_PORT        PORTB
64
#define LCD_PIN         PINB
65
#define LCD0            0
66
#define LCD1            1
67
#define LCD2            2
68
#define LCD3            3
69
#define LCD4            4
70
#define LCD5            5
71
#define LCD6            6
72
#define LCD7            7
73
#define ALL_LCD        (1<<LCD0 | 1<<LCD1 | 1<<LCD2 | 1<<LCD3 | 1<<LCD4 | 1<<LCD5 | 1<<LCD6 | 1<<LCD7)
74

75
#define NR_KONFIGS    9
76
#define NR_KEYS      7
77
#define DELAY      300
78

79
#define NO_ACTION      0
80
#define EXIT_ACTION      1
81
#define DEF_KEY_ACTION    2
82
#define DEF_REPEAT_ACTION  3
83
#define LCD_ACTION      4
84
#define LED_ACTION      5
85
#define SAVE_ACTION      6
86

87
// Tabelle von Zeigern auf die Tastenkonfigurationen erstellen
88
// ===========================================================
89
uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] =
90
  {
91
    {LED0,LED0,LED4,LED3,LED1,LED2,0},            // Konfiguration 1 (C64)
92
    {LED1,LED0,LED3,LED2,LED5,LED4,1},            // Konfiguration 2
93
    {LED5,LED4,LED0,LED2,LED1,LED3,5},            // Konfiguration 3
94
    {LED3,LED1,LED2,LED0,LED4,LED5,3},            // Konfiguration 4
95
    {LED4,LED1,LED2,LED3,LED0,LED5,4},            // Konfiguration 5
96
    {LED5,LED1,LED2,LED3,LED4,LED0,5},            // Konfiguration 6
97
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 7
98
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 8
99
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 9
100
   };
101

102
// LCD-Menüeinträge definieren
103
// ===========================
104
const char menu_000[] = " Multifunktions ";  //
105
const char menu_001[] = "ArcadeController";  //
106
const char menu_002[] = "** HAUPTMENUE **";  //
107

108
const char menu_100[] = "Tastenzuordnung>";  // 0
109
const char menu_101[] = "[X        ]    1";  // 1
110
const char menu_102[] = "[XX       ]    2";  // 2
111
const char menu_103[] = "[XXX      ]    3";  // 3
112
const char menu_104[] = "[XXXX     ]    4";  // 4
113
const char menu_105[] = "[XXXXX    ]    5";  // 5
114
const char menu_106[] = "[XXXXXX   ]    6";  // 6
115
const char menu_107[] = "[XXXXXXX  ]    7";  // 7
116
const char menu_108[] = "[XXXXXXXX ]    8";  // 8
117
const char menu_109[] = "[XXXXXXXXX]    9";  // 9
118

119
const char menu_200[] = "<  Dauerfeuer  >";  // 10
120
const char menu_201[] = "[         ]  AUS";  // 11
121
const char menu_202[] = "[X        ]    1";  // 12
122
const char menu_203[] = "[XX       ]    2";  // 13
123
const char menu_204[] = "[XXX      ]    3";  // 14
124
const char menu_205[] = "[XXXX     ]    4";  // 15
125
const char menu_206[] = "[XXXXX    ]    5";  // 16
126
const char menu_207[] = "[XXXXXX   ]    6";  // 17
127
const char menu_208[] = "[XXXXXXX  ]    7";  // 18
128
const char menu_209[] = "[XXXXXXXX ]    8";  // 19
129
const char menu_210[] = "[XXXXXXXXX]    9";  // 20
130

131
const char menu_300[] = "< Beleuchtung  >";  // 21
132
const char menu_301[] = "[          ] AUS";  // 22
133
const char menu_302[] = "[X         ]   1";  // 23
134
const char menu_303[] = "[XX        ]   2";  // 24
135
const char menu_304[] = "[XXX       ]   3";  // 25
136
const char menu_305[] = "[XXXX      ]   4";  // 26
137
const char menu_306[] = "[XXXXX     ]   5";  // 27
138
const char menu_307[] = "[XXXXXX    ]   6";  // 28
139
const char menu_308[] = "[XXXXXXX   ]   7";  // 29
140
const char menu_309[] = "[XXXXXXXX  ]   8";  // 30
141
const char menu_310[] = "[XXXXXXXXX ]   9";  // 31
142
const char menu_311[] = "[XXXXXXXXXX]  10";  // 32
143

144
const char menu_400[] = "<   LED-Test   >";  // 33
145
const char menu_401[] = "  [EIN]   AUS   ";  // 34
146
const char menu_402[] = "   EIN   [AUS]  ";  // 35
147

148
const char menu_500[] = "<  Speichern   >";  // 36
149

150
const char menu_600[] = "<   Beenden     ";  // 37
151

152
typedef struct def_menustruktur
153
{
154
  const char *text;
155

156
  unsigned char next;
157
  unsigned char previous;
158
  unsigned char sub;
159
  unsigned char up;
160

161
  unsigned char ActionCode;
162
  uint8_t ActionValue;
163
}menustruktur;
164

165
// Tabelle von Zeigern auf die Texte erstellen
166
// ===========================================
167
menustruktur menu[] = 
168
{
169
  {menu_100, 10, 0, 1, 0, NO_ACTION, 0},
170
    {menu_101, 2, 1, 0, 0, DEF_KEY_ACTION, 1},
171
    {menu_102, 3, 1, 0, 0, DEF_KEY_ACTION, 2},
172
    {menu_103, 4, 2, 0, 0, DEF_KEY_ACTION, 3},
173
    {menu_104, 5, 3, 0, 0, DEF_KEY_ACTION, 4},
174
    {menu_105, 6, 4, 0, 0, DEF_KEY_ACTION, 5},
175
    {menu_106, 7, 5, 0, 0, DEF_KEY_ACTION, 6},
176
    {menu_107, 8, 6, 0, 0, DEF_KEY_ACTION, 7},
177
    {menu_108, 9, 7, 0, 0, DEF_KEY_ACTION, 8},
178
    {menu_109, 9, 8, 0, 0, DEF_KEY_ACTION, 9},
179
  {menu_200, 21, 0, 11, 10, NO_ACTION, 0},
180
    {menu_201, 12, 11, 10, 10, DEF_REPEAT_ACTION, 0},
181
    {menu_202, 13, 11, 10, 10, DEF_REPEAT_ACTION, 1},
182
    {menu_203, 14, 12, 10, 10, DEF_REPEAT_ACTION, 2},
183
    {menu_204, 15, 13, 10, 10, DEF_REPEAT_ACTION, 3},
184
    {menu_205, 16, 14, 10, 10, DEF_REPEAT_ACTION, 4},
185
    {menu_206, 17, 15, 10, 10, DEF_REPEAT_ACTION, 5},
186
    {menu_207, 18, 16, 10, 10, DEF_REPEAT_ACTION, 6},
187
    {menu_208, 19, 17, 10, 10, DEF_REPEAT_ACTION, 7},
188
    {menu_209, 20, 18, 10, 10, DEF_REPEAT_ACTION, 8},
189
    {menu_210, 20, 19, 10, 10, DEF_REPEAT_ACTION, 9},
190
  {menu_300, 33, 10, 22, 21, NO_ACTION, 0},
191
    {menu_301, 23, 22, 21, 21, LCD_ACTION, 0},
192
    {menu_302, 24, 22, 21, 21, LCD_ACTION, 25},
193
    {menu_303, 25, 23, 21, 21, LCD_ACTION, 50},
194
    {menu_304, 26, 24, 21, 21, LCD_ACTION, 75},
195
    {menu_305, 27, 25, 21, 21, LCD_ACTION, 100},
196
    {menu_306, 28, 26, 21, 21, LCD_ACTION, 125},
197
    {menu_307, 29, 27, 21, 21, LCD_ACTION, 150},
198
    {menu_308, 30, 28, 21, 21, LCD_ACTION, 175},
199
    {menu_309, 31, 29, 21, 21, LCD_ACTION, 200},
200
    {menu_310, 32, 30, 21, 21, LCD_ACTION, 225},
201
    {menu_311, 32, 31, 21, 21, LCD_ACTION, 255},
202
  {menu_400, 36, 21, 34, 33, NO_ACTION, 0},
203
    {menu_401, 35, 34, 33, 33, LED_ACTION, 0},
204
    {menu_402, 35, 34, 33, 33, LED_ACTION, 1},
205
  {menu_500, 37, 33, 36, 36, SAVE_ACTION, 1},
206
  {menu_600, 37, 36, 37, 37, EXIT_ACTION, 1}
207
};
208

209
volatile uint8_t nKonfig = 0;                    // Tasten-Konfiguration
210
volatile uint8_t Summe;                      // Tastenzuordnung bei gedrückten Tasten
211

212

213
// Initialisierung der Ports
214
// =========================
215
void init()
216
{
217

218
// Ports initialisieren
219
// --------------------
220
  OUT_DDR |= ALL_OUT;                      // Controller als Ausgang definieren
221
  LCD_DDR |= ALL_LCD;                      // LCD als Ausgang definieren  
222
  KEY_DDR &= ~ALL_KEYS;                    // Tastenports als Eingang definieren
223
  KEY_PORT |= ALL_KEYS;                    // Tastenports PullUp
224
}
225

226
int main(void)
227
{
228
  init();                            // Einschaltsequenz starten
229

230
  while(1)
231
  {
232
      Summe = 0;
233

234
      if(!(KEY_PIN &(1<<KEY2)))              // Wenn Taste PortD.2 auf LOW
235
        Summe |= KonfigPattern[nKonfig][0];
236
      if(!(KEY_PIN &(1<<KEY3)))              // Wenn Taste PortD.3 auf LOW
237
        Summe |= KonfigPattern[nKonfig][1];
238
      if(!(KEY_PIN &(1<<KEY4)))              // Wenn Taste PortD.4 auf LOW
239
        Summe |= KonfigPattern[nKonfig][2];
240
      if(!(KEY_PIN &(1<<KEY5)))              // Wenn Taste PortD.5 auf LOW
241
        Summe |= KonfigPattern[nKonfig][3];
242
      if(!(KEY_PIN &(1<<KEY6)))              // Wenn Taste PortD.6 auf LOW
243
        Summe |= KonfigPattern[nKonfig][4];
244
      if(!(KEY_PIN &(1<<KEY7)))              // Wenn Taste PortD.7 auf LOW
245
        Summe |= KonfigPattern[nKonfig][5];
246

247
      OUT_PORT = Summe;
248

249
  }
250
}

Entferne ich den Teil:
1
menustruktur menu[] = 
2
{
3
  {menu_100, 10, 0, 1, 0, NO_ACTION, 0},
4
    {menu_101, 2, 1, 0, 0, DEF_KEY_ACTION, 1},
5
    {menu_102, 3, 1, 0, 0, DEF_KEY_ACTION, 2},
6
    {menu_103, 4, 2, 0, 0, DEF_KEY_ACTION, 3},
7
    {menu_104, 5, 3, 0, 0, DEF_KEY_ACTION, 4},
8
    {menu_105, 6, 4, 0, 0, DEF_KEY_ACTION, 5},
9
    {menu_106, 7, 5, 0, 0, DEF_KEY_ACTION, 6},
10
    {menu_107, 8, 6, 0, 0, DEF_KEY_ACTION, 7},
11
    {menu_108, 9, 7, 0, 0, DEF_KEY_ACTION, 8},
12
    {menu_109, 9, 8, 0, 0, DEF_KEY_ACTION, 9},
13
  {menu_200, 21, 0, 11, 10, NO_ACTION, 0},
14
    {menu_201, 12, 11, 10, 10, DEF_REPEAT_ACTION, 0},
15
    {menu_202, 13, 11, 10, 10, DEF_REPEAT_ACTION, 1},
16
    {menu_203, 14, 12, 10, 10, DEF_REPEAT_ACTION, 2},
17
    {menu_204, 15, 13, 10, 10, DEF_REPEAT_ACTION, 3},
18
    {menu_205, 16, 14, 10, 10, DEF_REPEAT_ACTION, 4},
19
    {menu_206, 17, 15, 10, 10, DEF_REPEAT_ACTION, 5},
20
    {menu_207, 18, 16, 10, 10, DEF_REPEAT_ACTION, 6},
21
    {menu_208, 19, 17, 10, 10, DEF_REPEAT_ACTION, 7},
22
    {menu_209, 20, 18, 10, 10, DEF_REPEAT_ACTION, 8},
23
    {menu_210, 20, 19, 10, 10, DEF_REPEAT_ACTION, 9},
24
  {menu_300, 33, 10, 22, 21, NO_ACTION, 0},
25
    {menu_301, 23, 22, 21, 21, LCD_ACTION, 0},
26
    {menu_302, 24, 22, 21, 21, LCD_ACTION, 25},
27
    {menu_303, 25, 23, 21, 21, LCD_ACTION, 50},
28
    {menu_304, 26, 24, 21, 21, LCD_ACTION, 75},
29
    {menu_305, 27, 25, 21, 21, LCD_ACTION, 100},
30
    {menu_306, 28, 26, 21, 21, LCD_ACTION, 125},
31
    {menu_307, 29, 27, 21, 21, LCD_ACTION, 150},
32
    {menu_308, 30, 28, 21, 21, LCD_ACTION, 175},
33
    {menu_309, 31, 29, 21, 21, LCD_ACTION, 200},
34
    {menu_310, 32, 30, 21, 21, LCD_ACTION, 225},
35
    {menu_311, 32, 31, 21, 21, LCD_ACTION, 255},
36
  {menu_400, 36, 21, 34, 33, NO_ACTION, 0},
37
    {menu_401, 35, 34, 33, 33, LED_ACTION, 0},
38
    {menu_402, 35, 34, 33, 33, LED_ACTION, 1},
39
  {menu_500, 37, 33, 36, 36, SAVE_ACTION, 1},
40
  {menu_600, 37, 36, 37, 37, EXIT_ACTION, 1}
41
};

dann funktioniert alles perfekt.
Dubios!

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