mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit dem Lauflicht


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max (Gast)
Datum:

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

Autor: Max (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr\io.h>
#define F_CPU 1000000L
#include <util\delay.h>

int main(void)

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

 uint8_t X=0b00000001;
 int Zeitwert=2;

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

MfG
Falk

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.