PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Simples waitms() mit delay.h. For Schleife Zeitraubproblem



muraad
29.08.2004, 19:57
Also ich habe mir mit den Funktionen aus delay.h eine simple waitms() Funtkion geschrieben. Damit wollte ich auf meinem RNControl die LEDs im Sekunden Takt an und wieder ausschalten. Und das eine halbe Minute.
mit waitms(1000) dauerte es aber fast doppelt solange als fast eine Minute. Gestoppt habe ich einfach mit nem Funkweker den ich daneben gestellt hab. Durch rumrechnen und probieren ging es dann endlich mit
waitms(647) das das ganze wirklich fast auf die Sekunde genau eine halbe Minute dauert. Anscheinend verbrauchen die for Schleifen fast die hälfte der Zeit. Meine Frage ist jetzt eigentlich ob ich in der Funktion
waitms() nicht einfach die Variable ms mit 0,647 multiplizieren kann.
Gruß Muraad

29.08.2004, 21:21
Bezieht sich die delay - Funktion vielleicht auf eine bestimmte Quarzfrequenz?

muraad
29.08.2004, 21:46
Ja tut mir leid hab ich vergessen zusagen. Ist für 16Mhz. Die Berechnung steht aber im Quelltext und müsste sich für 4Mhz und 8Mhz ziemlich leicht ändern lassen.
Muraad

Gottfreak
09.09.2004, 19:07
In deiner Funktion Waitms läufst du 1000 mal durch eine For-Schleife, die delay_loop_2(4) ausführt. Der Fehler durch die zusätzliche Zeit, die die Schleife benötigt(könnte man ja testweise mal messen), ließe sich geringer halten, wenn du 100mal delay_loop_2(40) nähmest(ich glaube, du könntest sogar ganz ohne for delay_loop_2(4000) schreiben(die Variante, die bei GCC dabei ist, hat int als Parameter.).).

TillHoffmann
09.09.2004, 19:41
Du könntest einen Timer verwenden. Dann ist die Zeit "exakt".
Frag aber nicht wie, ich bin gerade auch am rätseln.

muraad
10.09.2004, 16:30
Erstmal danken Gottfreak. delay_loop_2(4000), eigentlich zu einfach, hät ich echt selber sehen können. (*,)
Ach und TillHoffmann, du musst den gewünschten Timer nur mit Prescaler und vielleicht richtigen Startwert auf die gebrauchte Frequenz bringen, so dass der Timer z.B. alle 1ms überläuft. Wenn du willt kann ich dir mal ein Windows Programm (rnavr.zip) mailen das ich hier irgendwo im Forum gefunden hab, aber nicht mehr weis wie der Link war. Das Programm berechnet dir bei gegebenen Parametern die Richtigen Werte (für Prescaler usw.)
z.B. bei XMhz, TimerX soll Xmal in der Sekunde überlaufen.
Gruß Muraad ]

TillHoffmann
11.09.2004, 19:03
Hallo muraad,

vielen Dank für das Angebot, aber bei mir funktionieren die Timer jetzt schon.
Aber ich hab eine Abweichung vom 10%. Katastrophe. Und ich wollte eine Uhr programmieren

11.09.2004, 19:23
Tja, dann hast du entweder den internen Oszillator verwendet oder Fehler beim Programmieren gemacht. Gib genauere Angaben zu deinem Programm und der verwendeten Hardware und dir wird geholfen.

Gruß, Alex

muraad
12.09.2004, 21:40
Oder dein Quarz hat einfach die Falsche Hertz Zahl. Dann ist es egal wie man den Timer einstellt und es kommt nie ne 100% sek,ms,us was auch immer Teilung raus.