Forum: Mikrocontroller und Digitale Elektronik Mehrere Aktionen über einen Tasterdruck auslösen


von Elia K. (elitscheri)


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; }

von 3.141592653589793238462643383279 (Gast)


Lesenswert?

"expected declaration" sagt doch schon was aus...
Wo ist denn Dein "r" deklariert?

von Hans W. (hans_w30)


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.

von Peter D. (peda)


Lesenswert?


von Elia K. (elitscheri)


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

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.