Forum: Mikrocontroller und Digitale Elektronik Problem mit dem Lauflicht


von Max (Gast)


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?

von Philipp B. (philipp_burch)


Lesenswert?

Pack' dein Lauflicht in einen Timer-Interrupt (Ein Schritt pro Aufruf). 
Dann kannst du es bequem durch (de-)aktivieren des Timers ein- und 
ausschalten. Warteschleifen dieser Grössenordnung sind sowieso denkbar 
ungünstig, da beschäftigst du den Controller zu 100% mit Däumchendrehen.

von Max (Gast)


Lesenswert?

ok
dann muss ich erstmal lernen was ein Timer Interrupt ist.
Danke für den Tipp

von Max (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von TOM (Gast)


Lesenswert?

warum nicht.
Gewöhn Dir das mit den sinnlosen Warteschleifen erst garnicht an. Der 
Controller tut nichts in der Zeit, nicht mal auf deinen Ausschaltwunsch 
kann er reagieren.

von Falk B. (falk)


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

von Max (Gast)


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.

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.