Joachim Drechsel schrieb:
> Franz Maier schrieb:
>> Was ist falsch daran?
>
> Nicht falsch. Eher Verschwendung von Rechenzeit ;)
:-)
Ich würd ruhig das Attribut falsch vergeben.
Das Problem ist, dass das Loslassen des Tastendrucks in den ersten 100ms
nach prüfen auf 'Taste low' erfolgen muss.
Bei dem simplen Testprogramm ist das kein Thema. Da steckt der µC die
meiste Zeit in den delays drinnen. Die Wahrscheinlichkeit, dass der
Taster genau in diesem Zeitfenster seinen Zustand wechselt ist daher
hoch.
Sobald aber die Hauptschleife umfangreicher wird, wird die
Wahrscheinlichkeit höher, dass das Loslassen eben nicht genau in diesem
Zeitraum erfolgt. Und dann detektiert dieses Verfahren das Loslassen in
diesem Fall nicht mehr.
Man kann es ganz leicht testen
1 | int main(void)
|
2 | {
|
3 | DDRB &= ~( 1 << PB0 ); /* PIN PB0 auf Eingang Taster) */
|
4 | PORTB |= ( 1 << PB0 ); /* Pullup-Widerstand aktivieren */
|
5 |
|
6 | while( 1 ) {
|
7 |
|
8 | if (debounce(&PINB, PB0))
|
9 | {
|
10 | /* Falls Taster an PIN PB0 gedrueckt */
|
11 | /* LED an Port PD5 an- bzw. ausschalten: */
|
12 | PORTD = PORTD ^ ( 1 << PD5 );
|
13 | }
|
14 |
|
15 | _delay_ms( 1000 );
|
16 | }
|
17 | }
|
wenn du da nach 10 Minuten nicht auszuckst, weil sich die LED bei
Dauertests nicht zuverlässig umschalten lässt, dann musst du eine
Engelsgeduld haben.
Da existiert also ein subtiler Zusammenhang zwischen dem _delay_ms( 1000
); in der Hauptschleife und der Zuverlässigkeit der Tastenerkennung.