Mikrocontroller und Digitale Elektronik
›
Thread
Controller reagiert nicht immer auf Tasterdruck
T
Thomas
Gast
02.07.2015 00:42
#4185102
Mein Arduino reagiert nicht auf jeden Tastendruck.
Woran kann das denn liegen? Es ist nicht immer so. Aber manchmal muss
ich 10x drücken bis etwas passiert.
Das das auch schon jemand mal gehabt?
Tips und Vorschläge was man tun kann wären für mich sehr hilfreich.
B
Bastler
Gast
02.07.2015 00:51
#4185106
z.B. alle delay() rauswerfen und durch gescheite Konstrukte ersetzen?
War nur mal so eine Annahme, soll aber bei Jüngern der Arduino IDE öfter
vorkommen.
6
6a66
Gast
02.07.2015 08:40
#4185208
Thomas schrieb:
> Mein Arduino reagiert nicht auf jeden Tastendruck.
Mein Auto fährt nicht - woran liegt das? Kann das seind ass man da den
Zündschlüssel rumdrehen muss oder die runden Dinger da dran sein müssen?
Wenn Du uns gute Informationen gibts können wir auch gute Antworten
liefern!
rgds
KM
Karl M.
Gast
02.07.2015 08:40
#4185209
Thomas,
/was man tun kann ?/
Bitte stelle den gesamten Code ein !
UF
Ulrich F.
Gast
02.07.2015 09:04
#4185228
6a66 schrieb:
> Wenn Du uns gute Informationen gibts können wir auch gute Antworten
> liefern!
Meine Glaskugel stimmt der guten Antwort von Bastler zu!
PD
Peter D.
(peda)
02.07.2015 09:08
#4185230
Thomas schrieb:
> Woran kann das denn liegen?
Ne ordentliche Entprell-Lib (im Timerinterrupt) nehmen.
O
oldmax
Gast
02.07.2015 12:33
#4185425
Hi
man kann aber auch den Taster dauernd festhalten, bis erwünschte
Reaktion erfolgt. Dann die Pfoten von. und gut, Automatisiert... geht
auch. Ein Modellauto einschalten, wenn Tastersignal erkannt, das fährt
dann weg. Ist auch gut. Na ja, zum Betätigen halt das Auto wieder
draufstellen...
Gruß oldmax
PS: das ihr aber auch immer so geil auf den geheimen Code seid..
oldmax schrieb:
> PS: das ihr aber auch immer so geil auf den geheimen Code seid..
Genau, damit will sich Thomas schliesslich für den nächsten
Nobelpreis anmelden (Leider gibts keinen Nobelpreis für
Mathematik).
Vielleicht hat der schnöde Taster eine Macke.
Ich hatte schon mehrere Tasterausfälle sogar an einer
Markenwaschmaschine. Taster getauscht, fertig.
wolle g. schrieb:
> Vielleicht hat der schnöde Taster eine Macke.
Ist zwar nicht ausgeschlossen.
Aber wahrscheinlicher ist es, dass es ganz einfach wieder mal an einem
Programm liegt, das mit Delay Aufrufen gespickt ist.
T
Thomas
Gast
06.07.2015 22:11
#4189832
Hallo
hier der Code. Ich muss immer so ca. 3 Sek. warten, wenn ich dann einen
der Taster betätige reagiert der Controller.
Kann man das noch optimierten?
1 #include <Wire.h>
2
3 //#include <LiquidCrystal.h>
4
5 unsigned char search_mode = 0 ;
6
7 char string [ 8 ];
8
9 int b = 0 ;
10 int c = 0 ;
11
12 #define Button_next 30
13 #define Button_prev 31
14
15
16
17 unsigned char frequencyH = 0 ;
18 unsigned char frequencyL = 0 ;
19
20 unsigned int frequencyB ;
21 double frequency = 0 ;
22
23 float freq_available = 0 ;
24
25
26
27 #define RST 12
28 #define CE 11
29 #define DC 10
30 #define DIN 9
31 #define CLK 8
32
33 static const byte ASCII [][ 5 ] =
34 {
35 { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } // 20
36 ,{ 0x00 , 0x00 , 0x5f , 0x00 , 0x00 } // 21 !
37 ,{ 0x00 , 0x07 , 0x00 , 0x07 , 0x00 } // 22 "
38 ,{ 0x14 , 0x7f , 0x14 , 0x7f , 0x14 } // 23 #
39 ,{ 0x24 , 0x2a , 0x7f , 0x2a , 0x12 } // 24 $
40 ,{ 0x23 , 0x13 , 0x08 , 0x64 , 0x62 } // 25 %
41 ,{ 0x36 , 0x49 , 0x55 , 0x22 , 0x50 } // 26 &
42 ,{ 0x00 , 0x05 , 0x03 , 0x00 , 0x00 } // 27 '
43 ,{ 0x00 , 0x1c , 0x22 , 0x41 , 0x00 } // 28 (
44 ,{ 0x00 , 0x41 , 0x22 , 0x1c , 0x00 } // 29 )
45 ,{ 0x14 , 0x08 , 0x3e , 0x08 , 0x14 } // 2a *
46 ,{ 0x08 , 0x08 , 0x3e , 0x08 , 0x08 } // 2b +
47 ,{ 0x00 , 0x50 , 0x30 , 0x00 , 0x00 } // 2c ,
48 ,{ 0x08 , 0x08 , 0x08 , 0x08 , 0x08 } // 2d -
49 ,{ 0x00 , 0x60 , 0x60 , 0x00 , 0x00 } // 2e .
50 ,{ 0x20 , 0x10 , 0x08 , 0x04 , 0x02 } // 2f /
51 ,{ 0x3e , 0x51 , 0x49 , 0x45 , 0x3e } // 30 0
52 ,{ 0x00 , 0x42 , 0x7f , 0x40 , 0x00 } // 31 1
53 ,{ 0x42 , 0x61 , 0x51 , 0x49 , 0x46 } // 32 2
54 ,{ 0x21 , 0x41 , 0x45 , 0x4b , 0x31 } // 33 3
55 ,{ 0x18 , 0x14 , 0x12 , 0x7f , 0x10 } // 34 4
56 ,{ 0x27 , 0x45 , 0x45 , 0x45 , 0x39 } // 35 5
57 ,{ 0x3c , 0x4a , 0x49 , 0x49 , 0x30 } // 36 6
58 ,{ 0x01 , 0x71 , 0x09 , 0x05 , 0x03 } // 37 7
59 ,{ 0x36 , 0x49 , 0x49 , 0x49 , 0x36 } // 38 8
60 ,{ 0x06 , 0x49 , 0x49 , 0x29 , 0x1e } // 39 9
61 ,{ 0x00 , 0x36 , 0x36 , 0x00 , 0x00 } // 3a :
62 ,{ 0x00 , 0x56 , 0x36 , 0x00 , 0x00 } // 3b ;
63 ,{ 0x08 , 0x14 , 0x22 , 0x41 , 0x00 } // 3c <
64 ,{ 0x14 , 0x14 , 0x14 , 0x14 , 0x14 } // 3d =
65 ,{ 0x00 , 0x41 , 0x22 , 0x14 , 0x08 } // 3e >
66 ,{ 0x02 , 0x01 , 0x51 , 0x09 , 0x06 } // 3f ?
67 ,{ 0x32 , 0x49 , 0x79 , 0x41 , 0x3e } // 40 @
68 ,{ 0x7e , 0x11 , 0x11 , 0x11 , 0x7e } // 41 A
69 ,{ 0x7f , 0x49 , 0x49 , 0x49 , 0x36 } // 42 B
70 ,{ 0x3e , 0x41 , 0x41 , 0x41 , 0x22 } // 43 C
71 ,{ 0x7f , 0x41 , 0x41 , 0x22 , 0x1c } // 44 D
72 ,{ 0x7f , 0x49 , 0x49 , 0x49 , 0x41 } // 45 E
73 ,{ 0x7f , 0x09 , 0x09 , 0x09 , 0x01 } // 46 F
74 ,{ 0x3e , 0x41 , 0x49 , 0x49 , 0x7a } // 47 G
75 ,{ 0x7f , 0x08 , 0x08 , 0x08 , 0x7f } // 48 H
76 ,{ 0x00 , 0x41 , 0x7f , 0x41 , 0x00 } // 49 I
77 ,{ 0x20 , 0x40 , 0x41 , 0x3f , 0x01 } // 4a J
78 ,{ 0x7f , 0x08 , 0x14 , 0x22 , 0x41 } // 4b K
79 ,{ 0x7f , 0x40 , 0x40 , 0x40 , 0x40 } // 4c L
80 ,{ 0x7f , 0x02 , 0x0c , 0x02 , 0x7f } // 4d M
81 ,{ 0x7f , 0x04 , 0x08 , 0x10 , 0x7f } // 4e N
82 ,{ 0x3e , 0x41 , 0x41 , 0x41 , 0x3e } // 4f O
83 ,{ 0x7f , 0x09 , 0x09 , 0x09 , 0x06 } // 50 P
84 ,{ 0x3e , 0x41 , 0x51 , 0x21 , 0x5e } // 51 Q
85 ,{ 0x7f , 0x09 , 0x19 , 0x29 , 0x46 } // 52 R
86 ,{ 0x46 , 0x49 , 0x49 , 0x49 , 0x31 } // 53 S
87 ,{ 0x01 , 0x01 , 0x7f , 0x01 , 0x01 } // 54 T
88 ,{ 0x3f , 0x40 , 0x40 , 0x40 , 0x3f } // 55 U
89 ,{ 0x1f , 0x20 , 0x40 , 0x20 , 0x1f } // 56 V
90 ,{ 0x3f , 0x40 , 0x38 , 0x40 , 0x3f } // 57 W
91 ,{ 0x63 , 0x14 , 0x08 , 0x14 , 0x63 } // 58 X
92 ,{ 0x07 , 0x08 , 0x70 , 0x08 , 0x07 } // 59 Y
93 ,{ 0x61 , 0x51 , 0x49 , 0x45 , 0x43 } // 5a Z
94 ,{ 0x00 , 0x7f , 0x41 , 0x41 , 0x00 } // 5b [
95 ,{ 0x02 , 0x04 , 0x08 , 0x10 , 0x20 } // 5c ¥
96 ,{ 0x00 , 0x41 , 0x41 , 0x7f , 0x00 } // 5d ]
97 ,{ 0x04 , 0x02 , 0x01 , 0x02 , 0x04 } // 5e ^
98 ,{ 0x40 , 0x40 , 0x40 , 0x40 , 0x40 } // 5f _
99 ,{ 0x00 , 0x01 , 0x02 , 0x04 , 0x00 } // 60 `
100 ,{ 0x20 , 0x54 , 0x54 , 0x54 , 0x78 } // 61 a
101 ,{ 0x7f , 0x48 , 0x44 , 0x44 , 0x38 } // 62 b
102 ,{ 0x38 , 0x44 , 0x44 , 0x44 , 0x20 } // 63 c
103 ,{ 0x38 , 0x44 , 0x44 , 0x48 , 0x7f } // 64 d
104 ,{ 0x38 , 0x54 , 0x54 , 0x54 , 0x18 } // 65 e
105 ,{ 0x08 , 0x7e , 0x09 , 0x01 , 0x02 } // 66 f
106 ,{ 0x0c , 0x52 , 0x52 , 0x52 , 0x3e } // 67 g
107 ,{ 0x7f , 0x08 , 0x04 , 0x04 , 0x78 } // 68 h
108 ,{ 0x00 , 0x44 , 0x7d , 0x40 , 0x00 } // 69 i
109 ,{ 0x20 , 0x40 , 0x44 , 0x3d , 0x00 } // 6a j
110 ,{ 0x7f , 0x10 , 0x28 , 0x44 , 0x00 } // 6b k
111 ,{ 0x00 , 0x41 , 0x7f , 0x40 , 0x00 } // 6c l
112 ,{ 0x7c , 0x04 , 0x18 , 0x04 , 0x78 } // 6d m
113 ,{ 0x7c , 0x08 , 0x04 , 0x04 , 0x78 } // 6e n
114 ,{ 0x38 , 0x44 , 0x44 , 0x44 , 0x38 } // 6f o
115 ,{ 0x7c , 0x14 , 0x14 , 0x14 , 0x08 } // 70 p
116 ,{ 0x08 , 0x14 , 0x14 , 0x18 , 0x7c } // 71 q
117 ,{ 0x7c , 0x08 , 0x04 , 0x04 , 0x08 } // 72 r
118 ,{ 0x48 , 0x54 , 0x54 , 0x54 , 0x20 } // 73 s
119 ,{ 0x04 , 0x3f , 0x44 , 0x40 , 0x20 } // 74 t
120 ,{ 0x3c , 0x40 , 0x40 , 0x20 , 0x7c } // 75 u
121 ,{ 0x1c , 0x20 , 0x40 , 0x20 , 0x1c } // 76 v
122 ,{ 0x3c , 0x40 , 0x30 , 0x40 , 0x3c } // 77 w
123 ,{ 0x44 , 0x28 , 0x10 , 0x28 , 0x44 } // 78 x
124 ,{ 0x0c , 0x50 , 0x50 , 0x50 , 0x3c } // 79 y
125 ,{ 0x44 , 0x64 , 0x54 , 0x4c , 0x44 } // 7a z
126 ,{ 0x00 , 0x08 , 0x36 , 0x41 , 0x00 } // 7b {
127 ,{ 0x00 , 0x00 , 0x7f , 0x00 , 0x00 } // 7c |
128 ,{ 0x00 , 0x41 , 0x36 , 0x08 , 0x00 } // 7d }
129 ,{ 0x10 , 0x08 , 0x08 , 0x10 , 0x08 } // 7e ←
130 ,{ 0x78 , 0x46 , 0x41 , 0x46 , 0x78 } // 7f →
131 };
132
133 void LcdXY ( int x , int y )
134 {
135 LcdWriteCmd ( 0x80 | x ); //Column
136 LcdWriteCmd ( 0x40 | y ); //Row
137 }
138
139 void LcdWriteString ( char * characters )
140 {
141 while ( * characters ) LcdWriteCharacter ( * characters ++ );
142 }
143
144 void LcdWriteCharacter ( char character )
145 {
146 for ( int i = 0 ; i < 5 ; i ++ ) LcdWriteData ( ASCII [ character - 0x20 ][ i ]);
147 LcdWriteData ( 0x00 );
148 }
149
150 void LcdWriteData ( byte cmd )
151 {
152 digitalWrite ( DC , HIGH ); // DC pin is High for Data
153 digitalWrite ( CE , LOW );
154 shiftOut ( DIN , CLK , MSBFIRST , cmd ); //transmit serial data
155 digitalWrite ( CE , HIGH );
156 }
157
158 void LcdWriteCmd ( byte cmd )
159 {
160 digitalWrite ( DC , LOW ); // DC pin is low for commands
161 digitalWrite ( CE , LOW );
162 shiftOut ( DIN , CLK , MSBFIRST , cmd ); //transmit serial data
163 digitalWrite ( CE , HIGH );
164 }
165
166
167
168 //LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
169
170 void setup () {
171
172 Wire . begin ();
173 //lcd.begin(16, 2);
174
175
176 pinMode ( RST , OUTPUT );
177 pinMode ( CE , OUTPUT );
178 pinMode ( DC , OUTPUT );
179 pinMode ( DIN , OUTPUT );
180 pinMode ( CLK , OUTPUT );
181 digitalWrite ( RST , LOW );
182 digitalWrite ( RST , HIGH );
183
184
185 LcdWriteCmd ( 0x21 ); //LCD extended commands
186 LcdWriteCmd ( 0xB8 ); // set LCD Vop (contrast)
187 LcdWriteCmd ( 0x04 ); // set temp coefficent
188 LcdWriteCmd ( 0x14 ); //LCD bias mode 1:40
189 LcdWriteCmd ( 0x20 ); //LCD basic commands
190 LcdWriteCmd ( 0x0C ); //LCD normal video mode
191
192 //LcdXY(0,0);
193
194 /// buttons
195
196 pinMode ( Button_next , INPUT );
197 digitalWrite ( Button_next , HIGH ); //pull up resistor
198
199 pinMode ( Button_prev , INPUT );
200 digitalWrite ( Button_prev , HIGH ); //pull up resistor
201
202 frequency = 94 . 7 ; //starting frequency
203
204
205
206 frequencyB = 4 * ( frequency * 1000000 + 225000 ) / 32768 ; //calculating PLL word
207
208 frequencyH = frequencyB >> 8 ;
209
210 frequencyL = frequencyB & 0XFF ;
211
212 //delay(1);
213
214 Wire . beginTransmission ( 0x60 ); //writing TEA5767
215
216 Wire . write ( frequencyH );
217 Wire . write ( frequencyL );
218 Wire . write ( 0xB0 );
219 Wire . write ( 0x10 );
220 Wire . write ( 0x00 );
221 Wire . endTransmission ();
222
223 //delay(1);
224
225 }
226
227 void loop ()
228 {
229
230 unsigned char buffer [ 5 ];
231
232 //lcd.setCursor(0, 0);
233
234 Wire . requestFrom ( 0x60 , 5 ); //reading TEA5767
235
236 if ( Wire . available ())
237
238 {
239 for ( int i = 0 ; i < 5 ; i ++ ) {
240
241 buffer [ i ] = Wire . read ();
242 }
243
244 freq_available = ((( buffer [ 0 ] & 0x3F ) << 8 ) + buffer [ 1 ]) * 32768 / 4 - 225000 ;
245
246 LcdWriteString ( "FM " );
247 //lcd.print("FM ");
248 LcdWriteString ( dtostrf ( freq_available / 1000000 , 5 , 2 , string ));
249
250 //lcd.print((freq_available/1000000));
251
252 frequencyH = (( buffer [ 0 ] & 0x3F ));
253
254 frequencyL = buffer [ 1 ];
255
256 if ( search_mode ) {
257
258 if ( buffer [ 0 ] & 0x80 ) search_mode = 0 ;
259
260 }
261
262 //if (search_mode==1) LcdWriteString(" SCAN");//lcd.print(" SCAN");
263 //else {
264 //LcdWriteString("NO SCAN");//lcd.print(" ");
265 //}
266
267 //lcd.setCursor(0, 1);
268 LcdXY ( 0 , 1 );
269
270
271 //LcdWriteString("Level: ");//lcd.print("Level: ");
272 //LcdWriteCharacter((buffer[3]>>4));
273 //LcdWriteString("/16");
274 //lcd.print((buffer[3]>>4));
275 //lcd.print("/16 ");
276
277 if ( buffer [ 2 ] & 0x80 ) LcdWriteString ( "STEREO " ); //lcd.print("STEREO ");
278 else LcdWriteString ( "MONO " ); //lcd.print("MONO ");
279
280 }
281
282 ///// buttons read
283
284 //////////// button_next//////////
285 if ( ! digitalRead ( Button_next ) &&! b ) {
286
287 frequency = ( freq_available / 1000000 ) + 0 . 10 ;
288
289 frequencyB = 4 * ( frequency * 1000000 + 225000 ) / 32768 + 1 ;
290
291 frequencyH = frequencyB >> 8 ;
292 frequencyL = frequencyB & 0XFF ;
293
294 Wire . beginTransmission ( 0x60 );
295
296 Wire . write ( frequencyH );
297 Wire . write ( frequencyL );
298 Wire . write ( 0xB0 );
299 Wire . write ( 0x1F );
300 Wire . write ( 0x00 );
301
302 Wire . endTransmission ();
303
304 //////////////////////
305
306 b = 100 ;
307
308 };
309
310 if ( ! digitalRead ( Button_next ) && b == 1 ) {
311
312 ///scannnn UP
313
314 search_mode = 1 ;
315
316 Wire . beginTransmission ( 0x60 );
317
318 Wire . write ( frequencyH + 0x40 );
319 Wire . write ( frequencyL );
320 Wire . write ( 0xD0 );
321 Wire . write ( 0x1F );
322 Wire . write ( 0x00 );
323
324 Wire . endTransmission ();
325
326 /////////////////
327
328 b = 100 ;
329
330 };
331
332 if ( ! b == 0 ) b -- ;
333
334 //////////// button_prev//////////
335 if ( ! digitalRead ( Button_prev ) &&! c ) {
336
337 frequency = ( freq_available / 1000000 ) - 0 . 10 ;
338
339 frequencyB = 4 * ( frequency * 1000000 + 225000 ) / 32768 + 1 ;
340
341 frequencyH = frequencyB >> 8 ;
342 frequencyL = frequencyB & 0XFF ;
343
344 Wire . beginTransmission ( 0x60 );
345
346 Wire . write ( frequencyH );
347 Wire . write ( frequencyL );
348 Wire . write ( 0xB0 );
349 Wire . write ( 0x1F );
350 Wire . write ( 0x00 );
351
352 Wire . endTransmission ();
353
354 c = 100 ;
355
356 };
357
358 if ( ! digitalRead ( Button_prev ) && c == 1 ) {
359
360 ///scannnn DOWN
361
362 search_mode = 1 ;
363
364 Wire . beginTransmission ( 0x60 );
365
366 Wire . write ( frequencyH + 0x40 );
367 Wire . write ( frequencyL );
368
369 Wire . write ( 0x50 );
370 Wire . write ( 0x1F );
371 Wire . write ( 0x00 );
372 Wire . endTransmission ();
373
374 c = 100 ;
375
376 };
377
378 if ( ! c == 0 ) c -- ;
379
380 ////////////////////
381
382 }
LM
Lothar M.
(lkmiller)
Moderator
(Firma: Titel)
Persönliche Seite
06.07.2015 22:52
#4189895
Was steht da dick und fett direkt über der Texteingabebox? 1 Antwort schreiben
2 Wichtige Regeln - erst lesen, dann posten!
3
4 * Längeren Sourcecode nicht im Text einfügen,
5 sondern als Dateianhang
BTW: wie schnell ist dein "Wire"?
A
Alf
Gast
06.07.2015 22:56
#4189900
Ich kann nicht erkennen, was du da für wichtige Wire.Transmissions
aussendest, aber:
Eine sichere Tastenerkennung ohne einen Timer-Interrupt,
der z.B. alle 1...50 ms den Zustand der Tasten abfragt, ist
unzuverlässig, wenn der µC auch manchmal für längere Zeit mit
was ganz anderem beschäftigt ist.
Wenn man die Tastenerkennung in diesem Timer-Interrupt
fix bearbeitet, stört das kaum bei den anderen Aufgaben.
Du musst nur ein paar Register bereitstellen, in denen die
Tasten-Aktionen für die Hauptschleife festgehalten werden.
In der Hauptschleife wird irgendwann in den Registern nachgeschaut,
was angefordert wurde - und darauf reagiert. - Und das bearbeitete
Register gelöscht, sonst wird es eine Endlos-Reaktion...
Erklär doch mal, was hier 1 if ( ! digitalRead ( Button_next ) &&! b ) {
2
3 ....
4 b = 100 ;
5
6 };
7
8 if ( ! digitalRead ( Button_next ) && b == 1 ) {
9
10 ....
11 b = 100 ;
12
13 };
14
15 if ( ! b == 0 ) b -- ;
der Sinn der Sache ist. So ganz durchschau ich das noch nicht, welchen
Zweck hier b erfüllen soll.
Ich seh aber das, wenn b erst mal auf 100 ist, es mindestens 99
Durchläufe durch loop benötigt, bis b wieder entweder 0 oder 1 ist. 99
(bzw. 100) Durchläufe in denen offenbar jedesmal per I2C ein Empfänger
nach seiner Frequenz gefragt wird, die dann mittels Floating Point
Arithmetik umgerechnet und aufs Display gegeben wird. Was beides auch
nicht gerade das schnellste zu sein scheint. Und vor allen Dingen: 99
Durchläufe, in denen eine gedrückte Taste zu keiner Aktion führt.
"Kann man das optimieren" ist gut. Man könnte zuallererst mal eine
vernünftige Tastendruckerkennung einbauen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren