Mehrere Aktionen über einen Tasterdruck auslösen

OP #2143520
Lesenswert?
• ▲
▼
Hallo liebes Forum

Ich bin noch ein ziemlicher Frischling in Sachen Mikrocontroller hab 
aber meine ersten Gehversuche schon unternommen.
Momentan sitze ich schon eine Weile an einer einfachen Tasterabfrage, 
welche beim 1. Tastendruck eine LED (LED1) einschalten soll.
Beim 2. Tastendruck wird diese LED ausgeschaltet und eine andere wird 
dafür eingeschaltet.
Beim 3. Tastendruck wird schließlich der komplette Port wieder 0 gesetzt 
und das ganze kann von vorne beginnen.
Ich habe das ganze mit switch case gelöst, wobei bei jedem Tastendruck 
eine Variable um 1 erhöht wird und ich daher in den nächsten case 
springe.

Meine erste Frage: Wie hättet ihr das ganze gelöst?? Gibt es vielleicht 
noch etwas eleganteres als switch case?

Zusätzlich habe ich zwischen den Abfragen eine Wartezeit eingeplant, 
welche ich über 2 andere Taster im Laufenden Betrieb erhöhen und 
verkürzen können möchte. Der Kompiler liefert mir dabei aber immer 
folgende Fehlermeldung:

main.c:64: error: expected expression before '}' token
main.c:64: error: expected declaration or statement at end of input

Solange ich die oberen if-Abfragen weglasse funktionierts, sobald ich 
sie mit rein tu klappt es nicht mehr. Kann mir dabei vielleicht jemand 
helfen oder hatte schon ein ähnliches Problem?? Was für eine 
Eingabe/Deklaration erwartet denn der Kompiler.

Bereits im Voraus vielen Dank



Hier noch der Code:


#include <avr/io.h>

#include <util/delay.h>


int main(void){

int i,e;
i=1;
e=10;


DDRD  = 0b11100000; // Led 1 & LED 2 & Summer als Ausgang


while(1){


if (PIND&(1<<PD3){          // Wenn Taster 2 gedrückt wird dann um 5ms 
erhöhen
  r=r+5;
    }

  if ( PIND&(1<<PD4){         // Wenn Taster 3 dedrückt wird dann um 5ms 
kürzen
  r=r-10;}



switch (i)            // Switch für mehrmaliges Drücken des selben 
Tasters
{

  case 1:
  if(PIND&(1<<PD2)){        // 1. mal drücken: LED 1 an
  PORTD|=(1<<PD5);
  _delay_ms(e);
  i=2;            // i++ - case 2
  }

  case 2:            //2.mal drücken: LED 2 an
  if(PIND&(1<<PD2)){
  PORTD&=(0<<PD5);      // LED 1 aus machen
  PORTD|=(1<<PD6);
  _delay_ms(e);
  i=3;}            // i++ - case 3

  case 3:            // 3.mal drücken:

  if(PIND&(1<<PD2)){
  PORTD&=0x00;        // PORTD auf o setzen
  _delay_ms(e);        // springt wieder zu case 1
  i=1;
  }

    }



 }


 return 0; }
#2143877
Lesenswert?
• ▲
▼
1
while(1){
2

3

4
if (PIND&(1<<PD3){          // Wenn Taster 2 gedrückt wird dann um 5ms
5
erhöhen
6
  r=r+5;
7
    }
8

9
  if ( PIND&(1<<PD4){         // Wenn Taster 3 dedrückt wird dann um 5ms
10
kürzen
11
  r=r-10;}
Ich würde eher sagen du hast zwei Klammern vergessen.
wie schon pi über mir gesagt hat Fehler lesen.´Gedanken machen wo könnte 
der Fehler sein. Fehler finden ;-)
1
if (PIND&(1<<PD3) ) {.....
genauso bei deiner 2ten if abfrage.
OP #2144341
Lesenswert?
• ▲
▼
Danke euch beiden für die schnelle Beantwortung. Es lag wirklich nur an 
den Fehlenden 2 if Klammern. Naja weiter unten hab ich sie fleißig 
gesetzt aber oben fehlten sie. Ich hab einfach bei der Fehlermeldung an 
der total falschen Stelle rumprobiert aber nun läufts fantastisch. Muss 
mich wohl noch ein wenig an die Sprache meines Kompilers gewöhnen :-)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.