mikrocontroller.net

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


Autor: Sebastian S. (rudimentor)
Datum:

Bewertung
0 lesenswert
nicht 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.)
#include <avr/io.h>
#include <util/delay.h>

void LED_an(){
PORTD |= (1<<PD5);
}

void LED_aus(){
PORTD &= ~(1<<PD5);
}

int main(void){

DDRD |= (1<<PD5);
DDRD &= ~((1<<PD2) | (1<<PD3));
uint8_t RegisterD;

while(1){

RegisterD = PIND;
RegisterD = RegisterD & ((1<<PD2) | (1<<PD3));

if(RegisterD == ((1<<PD2) | (1<<PD3))){
          LED_an();
          }
else if(RegisterD == (1<<PD2)){
          LED_an();
          _delay_ms(150);
          LED_aus();
          _delay_ms(150);
          }
else if(RegisterD == (1<<PD3)){
          LED_an();
          _delay_ms(250);
          LED_aus();
          _delay_ms(250);
          }
else {
     LED_aus();
     }
}
return 0;
}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian S. (rudimentor)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian S. (rudimentor)
Datum:

Bewertung
0 lesenswert
nicht 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.
switch(RegisterD){
case ((1<<PD2) | (1<<PD3)):
          LED_an();
          break;
case (1<<PD2):
          LED_an();
          _delay_ms(150);
          LED_aus();
          _delay_ms(150);
          break;
case (1<<PD3):
          LED_an();
          _delay_ms(250);
          LED_aus();
          _delay_ms(250);
          break;
default:
     LED_aus();
}

Autor: Sebastian S. (rudimentor)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.