Mit Taster aus der Schleife

Gast #5098635
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
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 #5098660
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.
Angehängte Dateien:
Gast #5098669
>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
@ 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
@ 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
>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;)
#5098685
Um mal ein weiteres Stichwort zu liefern: Ich würde das ganze mit einer 
For-Schleife machen.
Und innerhalb der For-Schleife das Aktualisieren der LEDs machen und 
direkt anschließend abfragen, ob ein Taster gedrückt wurde. So als Idee 
für einen offensichtlichen Anfänger. Jeder fängt eben mal klein an ;)
(Firma: matzetronics) #5098804
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.
#5099171
Patrick J. schrieb:
> Rechts kann man auf der oberen Versorgungsbahn eine Anschluß-Platine
> erahnen.
> Brille nicht geputzt?

doch, erahnen kann man vieles, aber hier sinnlos rumraten ist oft wenig 
hilfreich.

Es gibt genug faule Threads die niemanden helfen weil alle Hilfswilligen 
ihr eigenes Schaltbild DENKEN :P

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.