Forum: Mikrocontroller und Digitale Elektronik C - Schleife für x Sekunden ausführen


von niceguy (Gast)


Lesenswert?

Hallo,

Wie kann man eine Schleife für z.B. 10 Sekunden durchlaufen und dann zur 
nächsten gehen? Ich habe es schon mit einer for-Schleife und einem sehr 
hohen Wert versucht, aber sie ist viel zu schnell fertig und da muss es 
doch einen besseren Weg geben. :)

Vielen Dank
MfG

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Was hast du denn vor?
Scheinbar hast du den Sinn einer Schleife nicht verstanden. Eine 
Schleife wird solange ausgeführt, wie eine Bedingung wahr ist. Du 
müsstest "im Hintergrund" also eine Art Uhr laufen lassen, um die 
Schleife 10sec lang laufen lassen zu können.

Also: Welcher Controller und welche Aufgabe hat diese 
Schleife/Funktion/Software?

von Marcus P. (marc2100)


Lesenswert?

Hi,
je nachdem worauf du programmierst (µC oder PC), solltest du einen TIMER 
nehmen.
Bei nem µC einfach einen Timer per Interrupt die Variable hochzählen bis 
die nötige zeit um ist(wenn zwischendurch nichts zu tun ist 
sleep()-Befehle benutzen)
Auf dem PC gibts dafür unter C <time.h>, damit kannste auch warten.

Gruß
Marcus

von niceguy (Gast)


Lesenswert?

Silvan König schrieb:
> Also: Welcher Controller und welche Aufgabe hat diese
> Schleife/Funktion/Software?

-PIC18F27J53
-Ich will, dass eine gewisse Zeit bei meiner LED-Matrix ein Buchstabe 
leuchtet und nach dieser Zeit soll der nächste Buchstabe leuchten. Also 
wenn ich in der Schleife einen delay einbaue blinkt die LED nur ganz 
kurz, deshalb dachte ich man kann eine Schleife z.B. 10s lang 
durchlaufen lassen.

MfG

von Karl H. (kbuchegg)


Lesenswert?

niceguy schrieb:
> Silvan König schrieb:
>> Also: Welcher Controller und welche Aufgabe hat diese
>> Schleife/Funktion/Software?
>
> -PIC18F27J53
> -Ich will, dass eine gewisse Zeit bei meiner LED-Matrix ein Buchstabe
> leuchtet und nach dieser Zeit soll der nächste Buchstabe leuchten. Also
> wenn ich in der Schleife einen delay einbaue blinkt die LED nur ganz
> kurz, deshalb dachte ich man kann eine Schleife z.B. 10s lang
> durchlaufen lassen.

klassischer Fall für einen Timer.
Du willst nicht 10 Sekunden warten, sondern du willst eine Stoppuhr 
bauen, die 10 Sekunden lang läuft. Du zeigst den Buchstaben an und 
'startest' die Stoppuhr (in Form des Timers). Ist die Uhr abgelaufen 
wird der nächste Buchstabe angezeigt und die Stoppuhr erneut gestartet.

Gewöhn dir das denken in Warteschleifen ab. Das führt zu nichts.

von Jannik O. (jannipanni)


Lesenswert?

ich würde die funktion _delay_ms() nutzen. ist in der lib 
<util/delay.h>, damit kannst du eine bestimmte zeit warten, also z.B. 
_delay_ms(10000) wäre 10 sekunden

von Eumel (Gast)


Lesenswert?

Obi Wan, noch viel lernen du musst!

von Raf (Gast)


Lesenswert?

Benutze lieber Timer als die Delay-Funktion.

von Raf (Gast)


Lesenswert?

Eumel schrieb:
> Obi Wan, noch viel lernen du musst!

thumbs up

von Jannik O. (jannipanni)


Lesenswert?

klar, timer sind einfacher, aber ich denke, wenn man den code mal eben 
schreiben will und nicht viel ahnung davon hat (me :D) dann ist die 
delay-funktion wohl einfacher.

von Raf (Gast)


Lesenswert?

Na gut. Trotzdem macht es Sinn sich ca. eine halbe Stunde in Timer 
einzuarbeiten.
Wenn es schnell gehen muss und man nicht weiter machen will: Delay.
Sonst: Timer

von Eumel (Gast)


Lesenswert?

Vorallem kann man wenn man eh nur auf den Timer wartet den Controller in 
einen seiner sleep Modes schicken. Strom sparen lohnt sich meistens :)

von spontan (Gast)


Lesenswert?

>klar, timer sind einfacher, aber ich denke, wenn man den code mal eben
>schreiben will und nicht viel ahnung davon hat (me :D) dann ist die
>delay-funktion wohl einfacher.


Ein sauberes Konzept sind delay-funktionen nie. Ganz egal ob man "eben 
bloß was schreiben will", oder grad zu faul ist, etwas über Timer zu 
lesen.

von Vn N. (wefwef_s)


Lesenswert?

Obi Wan schrieb:
> klar, timer sind einfacher, aber ich denke, wenn man den code mal eben
> schreiben will und nicht viel ahnung davon hat (me :D) dann ist die
> delay-funktion wohl einfacher.

Dann solltest du ihm aber zumindest eine Wartefunktion zeigen, die auch 
funktioniert. Mit den AVR-libs fängst du auf einem PIC wenig an.

von Karl H. (kbuchegg)


Lesenswert?

Obi Wan schrieb:
> klar, timer sind einfacher, aber ich denke, wenn man den code mal eben
> schreiben will und nicht viel ahnung davon hat (me :D) dann ist die
> delay-funktion wohl einfacher.

Einen Code mit einer LED-Matrix schreibt man aber nicht 'mal eben so'. 
Die Chancen stehen gut, dass er dorrt sowieso schon einen Timer im 
Einsatz hat.

Und nein: delay_ms ist nur bei den allereinfachsten Programmen eine 
Lösung. Sobald es ein bischen komplizierter wird, ist es eben keine 
Lösung mehr, sondern ein Problem.

von niceguy (Gast)


Lesenswert?

Obi Wan schrieb:
> ich würde die funktion _delay_ms() nutzen.
delay_ms kenne ich schon, aber ich hab keine Ahnung wie ich damit eine 
Schleife beenden kann. Die LEDs leuchten ja nicht einfach, sondern 
blinken extrem schnell. Wenn man ein delay in der Schleife macht blinken 
die LEDs nur kurz auf und wenn man eines außerhalb macht hat man eine 
Endlosschleife.

Karl Heinz Buchegger schrieb:
> Die Chancen stehen gut, dass er dorrt sowieso schon einen Timer im
> Einsatz hat.
Nein, leider nicht. Ich verstehe das ganze auch nicht wirklich.
Ein Beispiel aus der CCS C-Hilfe:
1
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
2
 //sets the internal clock as source
3
 //and prescale as 8. At 20Mhz timer1 will increment
4
 //every 1.6us in this setup and overflows every
5
 //104.896ms
Wie kommt man da auf 104,896ms? Und was ist das maximale, dass man mit 
48Mhz erreichen kann? Irgendwie finde ich keine Seite, die das für mich 
verständlich erklärt.^^

Danke
MfG

von Ralph (Gast)


Lesenswert?

niceguy schrieb:
> Wie kommt man da auf 104,896ms? Und was ist das maximale, dass man mit
> 48Mhz erreichen kann? Irgendwie finde ich keine Seite, die das für mich
> verständlich erklärt.^^

Datenblatt des µC lesen. Da steht es drin.
Bei Google findest du das nicht.

von Karl H. (kbuchegg)


Lesenswert?

niceguy schrieb:

> Nein, leider nicht. Ich verstehe das ganze auch nicht wirklich.

Dann wirds Zeit.
Eine LED-Matrix bauen zu wollen ohne Timer ist fahrlässige 
Pfusch-Programmierung.

> Ein Beispiel aus der CCS C-Hilfe:
>
1
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
2
>  //sets the internal clock as source
3
>  //and prescale as 8. At 20Mhz timer1 will increment
4
>  //every 1.6us in this setup and overflows every
5
>  //104.896ms
> Wie kommt man da auf 104,896ms? Und was ist das maximale, dass man mit
> 48Mhz erreichen kann? Irgendwie finde ich keine Seite, die das für mich
> verständlich erklärt.^^

Ist zwar nicht für einen PIC (sondern für einen AVR), aber die 
grundsätzlichen Überlegungen sind ja dieselben
FAQ: Timer

Und dann: Datenblatt raus und das Kapitel über die Timer studieren.

von (prx) A. K. (prx)


Lesenswert?

niceguy schrieb:
> -PIC18F27J53

Microchip liefert doch fertige Delayloops bei Compiler gleich mit. Nicht 
in Mikrosekunden sondern in Takten, aber das umzurechnen sollte kein 
Hexenwerk sein.

von niceguy (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Eine LED-Matrix bauen zu wollen ohne Timer ist fahrlässige
> Pfusch-Programmierung.
Das kommt dabei raus, wenn man sowas in der Schule als erstes Projekt 
macht und die Lehrer selbst keine Ahnung von der Programmierung haben...

Hab mir mal den Teil zu Interrupts und Timern durchgelesen, allerdings 
werden die ganzen Variablen davon nicht gefunden.
1
TMR0ON = 1;
Das müsste doch gehen, oder?

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.