C - Schleife für x Sekunden ausführen

Gast #2720237
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
Persönliche Seite #2720244
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?
#2720248
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
Gast #2720265
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
#2720348
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.
Gast #2720497
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.
#2720574
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.
Gast #2721689
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
#2721765
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.
Gast #2722936
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?

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