Problem mit dem Lauflicht

Gast #664275
Lesenswert?

Hallo,

ich habe ein Problem und weis nicht mehr weiter.

Ich habe ein Lauflicht Programmiert der mit einer Taste eingeschaltet 
wird und
anderer wieder aus.

Das Problem ist dass der Lauflicht erst durchlaufen muss um ausgehen zu 
können.

Aber sieht selbst:

#include <avr\io.h>

void warte_ms(unsigned int Verzoegern);



int main(void)

{
 DDRB=0b00111111;
 PORTC=0b11111111;
 DDRC=0b00000000;
 PORTD=0b11111111;
 DDRD=0b00000000;



 int X=0b00000001;
 int Zeitwert=2;
 int t;
 int g;

  do
  {
  if (!(PINC & (1<<PINC0)))
    {
    do
     {
      do
       {
       PORTB=X;
       X=X*2;
       warte_ms(Zeitwert);
       }
       while(X<33);
       X=0b00000001;
    }
    while(PINC & (1<<PINC5));
         }
         PORTB =0b00000000;
      }
      while(1);



}


//__________Funktion___Wartezeit_in_ms______________

void warte_ms(unsigned int Zeitwert)  //Lade Funktion "warte_ms" mit dem 
Wert Zeitwert

{
 while(Zeitwert!=0)
  {
   unsigned int j;
   for(j=0;j<1000; j++) {asm("nop");}
   Zeitwert--;
  }
}


Wie kann ich erreichen dass ich das laufen jederzeit unterbrechen kann?
#664531
Lesenswert?

Max wrote:
> Eine Kurze frage.
> Ist die Aufgabe überhaupt, mit Kopf und Fußgesteuerten Schleifen,
> lössbar?

Sicher ist sie das.

Dein Problem ist folgendes:

Die innerste Schleife ist deine Lauflichtschleife.
Die läuft solange durch, bis dein Licht einmal rum ist.
Und erst danach wird geprüft ob der Taster gedrückt ist.

Das muesstest du ändern. Die innerste Schleife soll solange
laufen
* bis das Lauflicht einmal rundum ist
* oder bis eine Taste gedrückt wurde
was auch immer zuerst eintrifft.

Du musst also an der Abbruchbedingung der inneren Schleife
arbeiten. Die wird jetzt etwas komplizierter.

Ist eine gute Übung für einen Anfänger um mit etwas kompliziertern
Schleifenkonstrukten zu arbeiten und um die logischen Operatoren
UND (&&) und ODER (||) kennen zu lernen.
#664536
Lesenswert?

@ Max (Gast)

>Ich habe ein Lauflicht Programmiert der mit einer Taste eingeschaltet
>wird und
>anderer wieder aus.

>Das Problem ist dass der Lauflicht erst durchlaufen muss um ausgehen zu
>können.

>Wie kann ich erreichen dass ich das laufen jederzeit unterbrechen kann?

>Eine Kurze frage.
>Ist die Aufgabe überhaupt, mit Kopf und Fußgesteuerten Schleifen,
>lössbar?

Sicher.
1
#include <avr\io.h>
2
#define F_CPU 1000000L
3
#include <util\delay.h>
4

5
int main(void)
6

7
{
8
 DDRB=0b00111111;
9
 PORTC=0b11111111;
10
 DDRC=0b00000000;
11
 PORTD=0b11111111;
12
 DDRD=0b00000000;
13

14
 uint8_t X=0b00000001;
15
 int Zeitwert=2;
16

17
    while(1) {                          // Endlosschleife
18
        while ((PINC & (1<<PINC0)));    // Warte auf Starttaste
19
        do {
20
            PORTB=X;                    // Port setzen
21
            X <<=1;                     // nach links schieben
22
            if (X==0x40) X=1;           // Reload
23
            _delay_ms(Zeitwert);        // Warten
24
        } while(PINC & (1<<PINC5));     // solange PC5 nicht gedrückt ist
25
        PORTB =0b00000000;              // Port löschen
26
    }
27
}

MfG
Falk
Gast #664573
Lesenswert?

Die Warteschleife haben wir in der Schule gemacht.

Mir geht es bei der Aufgabe richtig mit Kopf und Fußgesteuerten 
Schleifen zu arbeiten.


Ok danke für die Hilfe, da muss ich wohl noch etwas üben.

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