Forum: Mikrocontroller und Digitale Elektronik Lauflicht programmieren


von Oliver D. (smasher)


Lesenswert?

Hallo,

also irgendwie steig ich nicht dahinter....

Ich würde gern ein Blinklich programmieren doch irgendwie sind meine 
Lichter immer beide an.

So sieht mein quellcode aus:

sbit led0=0x80;
sbit led1=0x81;
main (void)
{
unsigned int x,y;

for (y=0; y<100000;y++)
{
led0=0;
led1=1;
}

for (x=0; x<100000;x++)
{
led0=1;
led1=0;
}

}

Es sollte ja also immer von 0 bis gezählt werden und solange die LED 
einegschaltet sein. Wenn die For schleife beendet ist, gehts zur 
nächsten, bei der das gleiche nur mit anderer LED passiert. Es ist 
ausserdem immer eine LED ausgeschaltet.
Also sollten die LEDs Wechselweise hin und her springen.
Stattdessen bekomme ich beide Lampen eingeschaltet.
Auch bei utopisch hohen werten für die beiden Variablen kein 
unterschied.

Habt ihr einen Tip?

von ARM-Fan (Gast)


Lesenswert?

Der unsigned int Werteberiech geht nur von 0 bis 0xFFFF bzw. 65535.

von Oliver D. (smasher)


Lesenswert?

Upssala :)

von Oliver D. (smasher)


Lesenswert?

So, ich habe jetzt den unsigned int gegen unsigned long integer
getauscht und den wert auf 4 000 000 000 gesetzt.

Funz immer noch nicht

von Peter D. (peda)


Lesenswert?

Mach ne Schleife drumrum.

Das Main darf nie verlassen werden !


Peter

von Oliver D. (smasher)


Lesenswert?

Achso,
sorry, es ist bereits eine Schleife drumherum.
Hatte ich vergessen mit einzutragen!

von Oliver D. (smasher)


Lesenswert?

Aaah es funktioniert :)

Es lag am Datentyp und an der Zähllänger.

Ich habe nun einfach 2 For schleifen ineinander geschachtelt, sodass 
6500 bis 600 gezählt wird. Also insgesamt 4 For schleifen um abwechselnd 
leds zum leuchten zu bringen.

Nun muss ich nurnoch die Zählzeit anpassen um einen schönen Wechsel zu 
haben.


Danke für die Hilfe!

von Peter D. (peda)


Lesenswert?

Oliver D. wrote:

> Nun muss ich nurnoch die Zählzeit anpassen um einen schönen Wechsel zu
> haben.

Man kann auch nen Timer nehmen, dann muß man nicht planlos rumprobieren, 
sondern kann alle Zeiten auf den Takt genau ausrechnen.


Peter

P.S.:
Genau dafür sind die Timer da.

von Oliver D. (smasher)


Lesenswert?

Ich weiß,

aber leider verstehe ich nicht genaue wie man die Timer verwendet...
Im Datenblatt meines AT89S52 steht ne Tabelle mit adressen der SFRs, 
leider raffe ich nicht was ich genau brauche für den Timer, auch wenn 
ich hier schon mehrere Beispiele dazu hatte.

von Thomas (Gast)


Lesenswert?

braucht man dazu überhaupt einen Timer?
Oder geht das auch ohne?

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> braucht man dazu überhaupt einen Timer?
> Oder geht das auch ohne?

Sachen wir mal so:
Wenn das Ziel nur darin besteht ein paar LED zum blinken zu bringen, 
dann gehts auch ohne.

Übrigens: diese Zählschleifen sind meistens Murks. Wann immer möglich, 
wird der Optimizer des Compilers sein Pflicht tun und sie einfach 
rauswerfen :-)

Im WinAVR gibt es Wartefunktionen: _delay_ms( zeit )
Damit macht man Warteschleifen, wenn man denn unbedingt keinen Timer 
benutzen will.

Aber Hand aufs Herz: Wie oft hat man den Fall, dass ein µC wirklich nur 
ein paar LED blinken lassen soll und sonst nichts.

In allen anderen Fällen ist der Warteschleifenansatz meistens nicht zu 
gebrauchen.

von Thomas B. (Gast)


Lesenswert?

also benutzt man dieses delay nur für Zeitschleifen. Kann man diese 
Schleifen auch in einem Unterprogramm verknüpfen?

mfg Thomas

von jaytharevo (Gast)


Lesenswert?

Natürlich kannst du die delay Funktionen in einer Funktion verwenden.

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.