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.
???
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)
13.02.2010 22:38
Manfred W. schrieb:
> OUT_PORT = Summe;
> ...
ist hier das programm zu Ende?
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)
13.02.2010 23:01
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)
13.02.2010 23:06
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
> 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.