Forum: Mikrocontroller und Digitale Elektronik 2 Taster simultan betätigen -> seltsame Auswertung des mueC


von Sebastian S. (rudimentor)


Lesenswert?

Hallo erstmal,
ich beschäftige mich erst seit kurzem mit der Programmierung von mueCs 
(ATmega8) und habe direkt mal eine Frage.
Ich habe 2 Taster, eine LED und habe mit dem Tutorial ein bisschen 
experimentiert. Klappt auch super, aber nun kam mir die Idee pro Taster 
eine Blinkfrequenz zu realisieren (funktioniert super) und wenn beide 
simultan gedrückt werden die LED dauerhaft leuchten zu lassen. Hierbei 
kommt es zu einer komischen Auswertung seitens des mueC. Wenn ich beide 
drücke, dann blinkt die LED 1x auf bevor sie dauerhaft Leuchtet. 
Realisiert habe ich das über if Anweisungen, und es scheint so, als wenn 
noch kurzeitig in eine der beiden anderen if Anweisungen reingegangen 
wird?

Wenn ich das als Switch-Case programmiere funktioniert das einwandfrei.

Hier mal der Code:(Falls ein Syntaxfehler da sein sollt, ist der hier 
entstanden.)
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void LED_an(){
5
PORTD |= (1<<PD5);
6
}
7
8
void LED_aus(){
9
PORTD &= ~(1<<PD5);
10
}
11
12
int main(void){
13
14
DDRD |= (1<<PD5);
15
DDRD &= ~((1<<PD2) | (1<<PD3));
16
uint8_t RegisterD;
17
18
while(1){
19
20
RegisterD = PIND;
21
RegisterD = RegisterD & ((1<<PD2) | (1<<PD3));
22
23
if(RegisterD == ((1<<PD2) | (1<<PD3))){
24
          LED_an();
25
          }
26
else if(RegisterD == (1<<PD2)){
27
          LED_an();
28
          _delay_ms(150);
29
          LED_aus();
30
          _delay_ms(150);
31
          }
32
else if(RegisterD == (1<<PD3)){
33
          LED_an();
34
          _delay_ms(250);
35
          LED_aus();
36
          _delay_ms(250);
37
          }
38
else {
39
     LED_aus();
40
     }
41
}
42
return 0;
43
}

Schon mal Danke im Vorraus und schöne Grüße....

von Karl H. (kbuchegg)


Lesenswert?

Sebastian S. schrieb:

> kommt es zu einer komischen Auswertung seitens des mueC. Wenn ich beide
> drücke, dann blinkt die LED 1x auf bevor sie dauerhaft Leuchtet.
> Realisiert habe ich das über if Anweisungen, und es scheint so, als wenn
> noch kurzeitig in eine der beiden anderen if Anweisungen reingegangen
> wird?

Was du als gleichzeitig ansiehst, präsentiert sich für den µC als

Zuerst der eine Taster
dann lange Zeit nichts
dann der andere Taster

Für dich ist 'lange Zeit nichts' weniger als ein Wimpernschlag, für 
deinen µC ist es die Zeit in der er ein paar Runden Däumchen drehen 
kann.

von Sebastian S. (rudimentor)


Lesenswert?

Karl heinz Buchegger schrieb:

> Was du als gleichzeitig ansiehst, präsentiert sich für den µC als
>
> Zuerst der eine Taster
> dann lange Zeit nichts
> dann der andere Taster
>
>Für dich ist 'lange Zeit nichts' weniger als ein Wimpernschlag, für
>deinen µC ist es die Zeit in der er ein paar Runden Däumchen drehen
>kann.

So was habe ich mir auch gedacht, dass ich nicht wirklich motorisch in 
der lage bin für den mueC die Taster gleichzeitig zu betätigen.

ABER...

Warum funktioniert das mit dem switch-case immer ohne Probleme?
Das mit dem ein "paar Runden drehen" müsste sich doch da ähnlich 
verhalten, so dass der mueC die while Schleife auch dort mehrmals 
durchlaufen sollte und ein anderer Case (in der Zeit wo für den mueC nur 
ein Taster gedrückt) abgearbeitet wird.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian S. schrieb:

> Warum funktioniert das mit dem switch-case immer ohne Probleme?

Code?

In deinem Code ist zb die exakte Position der _delays wichtig.

von Sebastian S. (rudimentor)


Lesenswert?

Das heißt also, dass intern bei if und switch case in der Verarbeitung 
etwas anders läuft. Ist ja auch anderer Code... Aber wo würde man denn 
bei den if Anweisungen so ein _delay setzen? Und heißt das im 
Umkehrschluss, dass ich bei der Verwendung von switch-cases keine 
_delays brauche?

Danke schon mal für die Antworten.

PS: Noch mal der Code für den switch case ansonsten wie der andere.
1
switch(RegisterD){
2
case ((1<<PD2) | (1<<PD3)):
3
          LED_an();
4
          break;
5
case (1<<PD2):
6
          LED_an();
7
          _delay_ms(150);
8
          LED_aus();
9
          _delay_ms(150);
10
          break;
11
case (1<<PD3):
12
          LED_an();
13
          _delay_ms(250);
14
          LED_aus();
15
          _delay_ms(250);
16
          break;
17
default:
18
     LED_aus();
19
}

von Sebastian S. (rudimentor)


Lesenswert?

Hat jemand noch einen Hinweis für mich, bezüglich des Timings bei if und 
switch?
Viele Grüße.....

von spess53 (Gast)


Lesenswert?

Hi

>Hat jemand noch einen Hinweis für mich, bezüglich des Timings bei if und
>switch?

Einfach den Assemblercode beider Varianten vergleichen.

MfG Spess

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.