Mit Taster aus der Schleife

Gast #5098635
Lesenswert?

Hey Leute,

bin grad dabei mir C programmierung bei zu bringen mit einem Arduino 
Uno. Ich hab ein code geschrieben mit dem man mit einem Taster druck in 
eine lauflicht schleife geht und mit dem gleichen taster druck diese 
schleife wieder unterbricht aber ich bekomms nicht hin diese schleife zu 
unterbrechen. Der bleibt in der schleife hängen und ich habs bisher 
nicht hin bekommen diese zu unterbrechen. Vielleicht kann mir einer von 
euch helfen :). Hier der code:

char lauflicht(void)
{
  while(1)
  {
  PORTB = 0x01;
  _delay_ms(100);
  PORTB = 0x02;
  _delay_ms(100);
  PORTB = 0x04;
  _delay_ms(100);
  PORTB = 0x08;
  _delay_ms(100);
  PORTB = 0x10;
  _delay_ms(100);
  PORTB = 0x20;
  _delay_ms(100);
  PORTB = 0x40;
  _delay_ms(100);
  PORTB = 0x80;
  _delay_ms(100);
  }

}

int main(void)
{
  DDRB = 0xFF;
  DDRD = 0xFF;

  while(1)
  {
    if(PIND & (1<<PD2))
    {
      lauflicht();
    } else
    {
      PORTB = 0x01;
    }
  }
}

Wie man sieht steht da nichts was auf eine unterbrechung hinweißt, das 
liegt daran das ich den code raus genommen hab, weil nichts 
funktioniert. Ich hoffe einer kann mir helfen :)
(Firma: matzetronics) #5098656
Lesenswert?

Dennis schrieb:
> DDRD = 0xFF;

Damit definierst du alle Pins an PortD auf Ausgang - vermutlich willst 
du das nicht.

Dennis schrieb:
> lauflicht();
Siehe vorheriges Posting von holger.
Die Abfrages des Knöpfchens checkt auch im Moment auf Taster gegen Plus. 
Bitte poste mal deine Verdrahtung.
Ebenso sollte es auch noch eine Fehlermeldung geben, weil lauflicht() 
einen return Wert vom Typ char hat. Sollte sowas wie 'Control reaches 
end of non-void function' bringen.
Gast #5098669
Lesenswert?

>Ich weiss das er momentan die while schleife nicht verlassen kann.

Bau lauflicht() um:
1
void lauflicht(void)
2
{
3
  static uint8_t state = 0;
4

5
  state++;
6
  switch(state)
7
  {
8
    case 1: PORTB = 0x01; break;
9
    case 2: PORTB = 0x02; break;
10
    case 3: PORTB = 0x04; break;
11
    case 4: PORTB = 0x08; break;
12
    case 5: PORTB = 0x10; break;
13
    case 6: PORTB = 0x20; break;
14
    case 7: PORTB = 0x40; break;
15
    case 8: PORTB = 0x80; state = 0; break;
16
    default: state = 0; break;
17
  }
18
  _delay_ms(100);
19
}
#5098670
Lesenswert?

@ Dennis (Gast)

>Ich weiss das er momentan die while schleife nicht verlassen kann. Aber
>mit if und break könnte man doch vlt daraus kommen oder nicht ?! Hab
>meine verdrahtung als anhang, ich hoffe man kann alles erkennen.

Naja, ein paar LEDs kann man sich gerade noch so ohne Bild vorstellen.

Dein Problem liegt im mangelnden Grundlagenwissen. Das sieht sieht man 
schon bei Mitternacht an deinen vielen _delay_ms() ;-)

Lies den Artikel Multitasking, dann wirst du dein Problem lösen 
können.
#5098671
Lesenswert?

@ holger (Gast)

>>Ich weiss das er momentan die while schleife nicht verlassen kann.

>Bau lauflicht() um:

Vorsagen war schon in der Schule Mist. Der OP sollte sich selber mal ne 
Kopf machen, wenn man ihn die richtigen Stichworte gibt.

Nur selber denken macht geistig fett (tm).
Gast #5098676
Lesenswert?

>Vorsagen war schon in der Schule Mist. Der OP sollte sich selber mal ne
>Kopf machen, wenn man ihn die richtigen Stichworte gibt.

Er wird schon merken dass das auch noch nicht optimal ist.
Darüber kann er dann immer noch nachdenken;)
(Firma: matzetronics) #5098804
Lesenswert?

AVRs sind mit Tastern gegen Plus etwas anspruchsvoller, da muss dann 
nämlich noch ein extra Pulldown mit ein paar kOhm vom Portpin gegen 
Masse.
Die meisten anderen von uns verdrahten ihre Taster gegen Masse, 
aktivieren den internen Pullup des AVR und fragen dann auf 0 statt auf 1 
ab.

Übrigens ein wenig obacht. Wenn der Taster gegen +5V schaltet, der MC 
aber nur mit 3,3V gespeist wird, geht das nicht gut aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren