8051 Lauflicht mit C

OP #2273623
Lesenswert?

Hallo!

Ich versuche gerade ein Lauflicht in C zu programmieren, allerdings ohne 
erfolg.
Ich glaube es liegt a Timer.
Kann mir jemand hier helfen?

#include <sfr51.h>
void delay (void);
void main()
{
    P0 = 0x01;
    delay();

           P0= P0 >> 1;
            delay();

      if(P0=0x80)
        {
            P0=0x01;
        }


}

void delay (void)
{
    TMOD &=0xF0;
    TMOD |=0x01;
    ET0 =0;
    TH0 =0xFD;
    TL0 =0xFE;
    TF0 =0;
    TR0 =1;
    while(TF0==0);
    TR0=0;

}

Vielen dank.
OP #2273688
Lesenswert?

Sry Joachim hab deine Antwort nicht gesehen.

Hier habe ich die while Schleife vergessen. Aber trotzdem funktioniet es 
nicht.

#include <sfr51.h>
void delay (void);
void main()
{
while(1)
 {
    P0 = 0x01;
    delay();

           P0= P0 >> 1;
            delay();

      if(P0==0x80)
        {
            P0 = 0x01;
        }

 }
}

void delay (void)
{
    TMOD &=0xF0;
    TMOD |=0x01;
    ET0 =0;
    TH0 =0xFD;  --> wenn ich hie die Werte änder sehe ich die LEDs sehr 
schwach blinken (3C)
    TL0 =0xFF; --> (B0)
    TF0 =0;
    TR0 =1;
    while(TF0==0);
    TR0=0;

}
OP #2273700
Lesenswert?

Hallo BerndB

> In main brauchste eine Endlosschleife.
> Der Timer geht so nicht. Den
>musste am Anfang starten.

void main()
{
  while(1)
  {
    delay();
    P0 = 0x01;
    delay();

           P0= P0 >> 1;
            delay();

      if(P0==0x80)
        {
            P0 = 0x01;
        }
   }

}
Ich habe mein void main() überarbeitet, ist das richtig so???

Geht das auch ohne Interrupt? Ich bin eigentlich noch ganz am anfang und 
habe mir die Sprache C soweit wie es geht selber beigebracht.

vielen dank
(Firma: BB) #2273773
Lesenswert?

Hallo,

das mit dem delay(), geht so nicht. Vor der While Schleife musst Du den 
Timer Initialiesieren. In de While Schleife auf das TF0 warten. den 
Timer stoppen. TF0 zurücksetzen. Neuen Timer Startwert setzen. Timer 
starten. LED setzen.

Der Timer Startwert von 0xFDFF ist vermutlich zu hoch. Das hängt 
natürlich vom Takt ab.

Gruß aus JAPAN,

BerndB
#2273789
Lesenswert?

Ich liebe Programmieren per Raten. Es gibt noch ein paar Permutationen 
von i/P0/Schieben/Zuweisen, die du noch nicht probiert hast.

Wie wäre es, wenn du erst mal überlegst, was was ist, und was damit bei 
jedem einzelnen Schritt deines Programms passiert (notfalls mit Papier 
und Bleistift), bzw. welche Schritte eigentlich passieren müssen, damit 
das Gewünschte dabei raus kommt. Mach erstmal ein Ablaufdiagramm.
Gast #2273836
Lesenswert?

jetzt sind wir wieder da  wo wir  ganz  oben
schonmal waren, Meister.

Hies  es nicht Du  sollst  P0 nicht  zuruecklesen?
Was naemlich passiert wenn Du  P0  shiftest?

Du sollst  i shiften  und dann  auf  P0  zuweisen.
Und nix anderes
OP #2273851
Lesenswert?

void main()
{
    int i=0x01;                    // i Anfangswert

while(1)                           //Schleife
  {
           i++;                    // i hochzählen
           delay();                // Unterprogramm delay aufrufen
           P0= i;                  // i in P0 laden
           delay();                // Unterprogramm delay aufrufen
           i << 1;                 // i shiften
           P0 = i;                 // i in P0 laden

      if(i==0x80)                  // wenn i 0x80 erreicht hat
        {
            i = 0x01;              // i auf Anfangswert setzen
        }
           P0 = i;                 // i in P0 laden

  }
}
OP #2273947
Lesenswert?

Hallo Martin,

Ich habe es jetzt nach deine Anweisung ausprobiert, aber es funktioniert 
immer noch nicht.

Ist der Timer richtig(void delay (void)???


#include <sfr51.h>

void delay (void);

void main()
{
    int i=0x01;



while(1)
  {

           P0= i;
           delay();
           i = i << 1;

      if(i==0x80)
        {
            i = 0x01;
        }


  }
}
void delay (void)
{
    TMOD &=0xF0;
    TMOD |=0x01;
    ET0 =0;
    TH0 =0x3C;
    TL0 =0xB0;
    TF0 =0;
    TR0 =1;
    while(TF0==0);
    TR0=0;

}
OP #2274248
Lesenswert?

Hallo Leute,

Danke für die Infos. Hab jetzt doch noch einmal meine LED+Widerstand 
überprüft`und soweit ist alles in Ordnung.

Bitte schaut noch einmal über das programm drüber, da es nicht läuft.
Liegt es vielleicht an der include Datei?

Bei Peter funktioniert das kleine Programm. Versteh aber nicht warum!

// ------------- READS51 generated header --------------
// module  : C:\Programme\Rigel\Reads51\Work\test3\Lauflicht_2.c
// created : 15:06:34, Thursday, June 30, 2011
// -----------------------------------------------------

#include <sfr51.h>

// Deklarierung Unterprogramm---------------------------

void warte (void);

// Hauptprogramm----------------------------------------

main()
{
    int i = 0x01;              //Anfangswert
    while(1)                //Dauerschleife
    {
        warte();            //Aufruf Funktion "Warte"
        i = i<<1;           //Bit um ein Feld nach links schieben
        P0 = i;             //Ausgabe I an Port 0
        warte();            //Aufruf Funktion "Warte"

        if(i == 0x80)       //Prüfe ob die "8hex" anliegt, wenn ja, 
setzte Ausgang wieder zurück
        {
            i = 0x01;       //Ausgang wieder zurück setzen
            warte();        //Aufruf Funktion "Warte"
        }
    }
}

// Unterprogramm----------------------------------------

void warte (void)
{
    int k;
    for (k=0;k<=50;k++)     //Timer 50 mal wiederholen lassen da ein 
Durchlauf hat (eingestellt)
    {
        TMOD = 0x01;        //Starten des Timers 0 als Timer
        TF0 = 0;            //Timer flag auf 0 setzen
        TR0 = 0;            //Timer stop
        TL0 = 0x3C;         //Wert für Timer Flag Überlauf
        TH0 = 0xB0;
        TR0 = 1;            //Timer start
        while (TF0 == 0);   //Wiederhole solange kein Überlauf
    }
}

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