Forum: Mikrocontroller und Digitale Elektronik Mit Taster aus der Schleife


von Dennis (Gast)


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

von holger (Gast)


Lesenswert?

char lauflicht(void)
{
  while(1)
  {

lauflicht() wird nie wieder verlassen. Deshalb geht das mit
deinem Taster nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

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.

von holger (Gast)


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
}

von Falk B. (falk)


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.

von Falk B. (falk)


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

von holger (Gast)


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

von Stefan S. (chiefeinherjar)


Lesenswert?

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

von c-- (Gast)


Lesenswert?

Stefan S. schrieb:
> For-Schleife

Das ist auch nur eine verkappte While-Schleife.
1
for(int i=0; i<10; i++) {}
1
{
2
  int i=0;
3
  while(i<10) {
4
5
    i++;
6
  }
7
}

von Joachim B. (jar)


Lesenswert?

Dennis schrieb:
> meine verdrahtung als anhang, ich hoffe man kann alles erkennen.

nö, ist + irgendwie beschaltet?

ich sehe den Taster nach + aber an + sehe ich nichts

Shifttaste defekt?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Joachim B. schrieb:
> ich sehe den Taster nach + aber an + sehe ich nichts

Rechts kann man auf der oberen Versorgungsbahn eine Anschluß-Platine 
erahnen.

Brille nicht geputzt?

:)

MfG

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Joachim B. (jar)


Lesenswert?

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

von Nicolas K. (ccodex)


Lesenswert?

Das ist einfach mit einer Statemachine zu realisieren. Dann kann man 
auch noch ein bisschen mit verschiedenen Arten von Lauflichtern das 
ganze probieren.

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.