Forum: Mikrocontroller und Digitale Elektronik Controller reagiert nicht immer auf Tasterdruck


von Thomas (Gast)


Lesenswert?

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.

von Bastler (Gast)


Lesenswert?

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.

von 6a66 (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

Thomas,

/was man tun kann ?/
Bitte stelle den gesamten Code ein !

von Ulrich F. (Gast)


Lesenswert?

6a66 schrieb:
> Wenn Du uns gute Informationen gibts können wir auch gute Antworten
> liefern!

Meine Glaskugel stimmt der guten Antwort von Bastler zu!

von Peter D. (peda)


Lesenswert?

Thomas schrieb:
> Woran kann das denn liegen?

Ne ordentliche Entprell-Lib (im Timerinterrupt) nehmen.

von oldmax (Gast)


Lesenswert?

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..

von Harald W. (wilhelms)


Lesenswert?

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).

von Wolle G. (wolleg)


Lesenswert?

Vielleicht hat der schnöde Taster eine Macke.
Ich hatte schon mehrere Tasterausfälle sogar an einer 
Markenwaschmaschine. Taster getauscht, fertig.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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"?

: Bearbeitet durch Moderator
von Alf (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
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.