Code 1ms anhalten
-
Hallo!
Kann mir bitte jemand sagen, wie ich unter C den Code für x Millisekunden anhalten kann? Benötige dies für ein Mikroprozessor-Programm in C. Daher ANSI C und möglichst kurz/einfach.
Danke!
Frodo
-
geht in ansi c nicht.
ist Betriebssystem spezifisch, bzw. wenn du fuer mikorkontroller schreibst, wirds da interrupts oder aehnliches dafuer geben...
-
[ Dieser Beitrag wurde am 14.06.2003 um 21:31 Uhr von volkard editiert. ]
-
Klar, aber ein Interupt ist dafür Overkill.
Muß ein Bit setzen und gleich wieder rücksetzen - Aber für mindestens 1ms oben halten. Am einfachsten wäre es, der Code würde einfach kurz halten.
Keine Alternative??
-
Wie wäre das mit delay() ? Kann ja die dos.h mal includen und schauen ob`s mein Compiler blickt.
-
Diese Lösung ist zwar recht Resourcenfressend, aber das ist bei Mikrocontrollern ohne OS ja sowieso egal....
Achso, der Code stammt übrigens nicht von mir, sondern von den LinuxFocus Autoren:
void delay_ms(unsigned short ms) /* delay for a minimum of <ms> */ /* with a 4Mhz crystal, the resolution is 1 ms */ { unsigned short outer1, outer2; outer1 = 200; while (outer1) { outer2 = 1000; while (outer2) { while ( ms ) ms--; outer2--; } outer1--; } }
mfg grottenolm
-
while ( ms ) ms--;
soll echt die innerste schleife sein?
befremdlich.
-
Original erstellt von <grottenolm>:
Diese Lösung ist zwar recht Resourcenfressend, aber das ist bei Mikrocontrollern ohne OS ja sowieso egal....Ich würd mal sagen gerade dann ist es nicht egal.
-
vn welchen ressourcen redet ihr eigentlich?
cpu-auslastung? man braucht kaum auf andere prozesse rücksicht zu nehmen (es wird kein anderere da sein).
rom? naja, viel größer oder viel kleiner wird die funktion schon nicht. also egal.
strom? sowas wie ein hlt-befehl und interrupts lohnen den aufwand wohl kaum. falls überhaupt verfügbar.
rechenzeit? es ist ne zeitschleife. nur echte freaks optimieren zeitschleifen.
-
while ( ms ) ms--;
soll echt die innerste schleife sein?
befremdlich.@volkard
Warum, meinst du das funktioniert nicht recht oder findest du nur den CodingStyle verwerflich?Mit den Resourcen habe ich die CPU gemeint. Wie Volkard schon schrieb wird auf Mikrocontrollern üblicherweiße nur ein Prozess ausgeführt, da das scheduling und der ganze andere Kram den man dafür benötigt für diese Anwendung zu aufwändig wäre....
mfg grottenolm
-
Original erstellt von <grottenolm>:
[quote]while ( ms ) ms--;
soll echt die innerste schleife sein?
befremdlich.**
@volkard
Warum, meinst du das funktioniert nicht recht oder findest du nur den CodingStyle verwerflich?
**[/QUOTE]
fehler im ablauf. äußere und mittlere sorgen für 200000 aufrufe der inneren. die inner macht nur beim ersten mal ms durchläufe und ab dann nix mehr. und wer ist LinuxFocus und warum machen die sowas?
-
Stimmt, du hast recht.
Ich hätte mir den Code mal genauer ansehen sollen www.linuxfocus.org
Da such mal nach einem AVR Tutorial.Wie genau könnte man das richtig machen?
Ich habe da nämlich nicht wirklich eine Idee....mfg grottenolm
-
//stil zum kotzen, aber so gemacht, um möglichst wenig zu ändern void delay_ms(unsigned short ms) /* delay for a minimum of <ms> */ /* with a 4Mhz crystal, the resolution is 1 ms */ { while ( ms ) { --ms; { unsigned short outer1, outer2; outer1 = 200; while (outer1) { outer2 = 1000; while (outer2) { outer2--; } outer1--; } } }
und drauf achten, daß ein guter compiler die ganze funktion schlicht wegoptimiert.
bei anderer taktfrequenz oder optimierung an 200 und 1000 rumschrauben, und schauen, obs auf ne millisekunde getrimmt werden kann.
ist halt nicht gerade auf den takt genau.
-
Aha, und wie kann man soetwas berechnen?
Wieviele Operationen kann eine 4MhZ getaktete CPU pro Sekunde ausführen?
Sorry für die Fragerei, eigentlich ist das ja Frodos Thread...aber ich muss das unbedingt wissenDanke
mfg grottenolm
-
Original erstellt von <grottenolm>:
Aha, und wie kann man soetwas berechnen?
Wieviele Operationen kann eine 4MhZ getaktete CPU pro Sekunde ausführen?
Sorry für die Fragerei, eigentlich ist das ja Frodos Thread...aber ich muss das unbedingt wissen
Danke
mfg grottenolmasm-code der schleifen angucken, auf ca 20 befehle der inneren schleife schätzen (zählen ist besser). pro befehl sagen wie mal 2 takte (kann man auch einzeln nachgucken bei alten cpus). und 200000 durchläufe mal 20 mal 2 sind 8000000 takte, das sind auf 4MhZ-Prozessor 2 sekunden.
aber sowas rechnet man nicht. man misst einfach.
-
Ok, danke für die Erleuchtung.
(Muss mir mal ASM reinziehen)mfg grottenolm