Forum: Mikrocontroller und Digitale Elektronik Ausgänge reagieren bei tastendruck falsch


von Lokus P. (derschatten)


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.

???

von Ephraim H. (ephi)


Lesenswert?


von Lokus P. (derschatten)


Lesenswert?

Ephraim Hahn schrieb:
> Entprellung

Daran kanns nicht liegen.
Das ganze hat ja schon funktioniert.
Außerdem hab ich bewusst hier von eienr Entprellung abgesehen.

von Walter (Gast)


Lesenswert?

Manfred W. schrieb:
> OUT_PORT = Summe;
> ...

ist hier das programm zu Ende?

von Lokus P. (derschatten)


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!

von Werner (Gast)


Lesenswert?

Könntest Du Deine Ergüsse mal als Anhang posten?

So toll, daß sie jeder lesen muß, sind sie auch wieder nicht.

von komische idee (Gast)


Lesenswert?

sowas gehört ins flash !!
1
menustruktur menu[] PROGMEM= 
2
{
3
4
5
const char menu_000[] = PROGMEM " Multifunktions ";  //



is dein RAM vieleicht voll ?
wenn der menüzeug fehlt wird ne menge ram frei

von Lokus P. (derschatten)


Lesenswert?

> is dein RAM vieleicht voll ?
>wenn der menüzeug fehlt wird ne menge ram frei

Sowas in der Richtung hatte ich schon vermutet.
Jedoch funktioniert die LCD-Library damit nicht korrekt.

Mit lcd_puts_p(menu[menu_index].text);
bekomme ich nur verstümmelte Zeichen.

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.