Forum: Mikrocontroller und Digitale Elektronik Einfache wait Funktion


von Plip (Gast)


Lesenswert?

Hallo,

ich habe eine einfache wait-Funktion geschrieben:
1
void wait(const uint16_t val)
2
{
3
    uint16_t cnt = val;
4
    while(cnt--)
5
        ;
6
}

Der Controller ist ein PIC16f und ich benutze die MPLAB X IDE.

Jetzt möchte ich gerne das Verhältnis von Counter zu realer Zeit wissen. 
Mir ist klar, dass ich diese über die Anzahl der Command-cycles für die 
Schleife und den Arbeitstakt berechnen kann(Die Zeit für den 
Funtionsaufruf vernachlässige ich mal, muss nicht besonders genau sein). 
Im Datenblatt steht die Anzahl der Cycles für die einzelnen Assembler 
Kommandos. Jetzt fehlt mir also noch die Info, wie mein Code in 
Assembler aussieht. Woher bekommen ich diese Information?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Plip schrieb:

> Jetzt möchte ich gerne das Verhältnis von Counter zu realer Zeit wissen.
> Mir ist klar, dass ich diese über die Anzahl der Command-cycles für die
> Schleife und den Arbeitstakt berechnen kann(Die Zeit für den
> Funtionsaufruf vernachlässige ich mal, muss nicht besonders genau sein).
> Im Datenblatt steht die Anzahl der Cycles für die einzelnen Assembler
> Kommandos. Jetzt fehlt mir also noch die Info, wie mein Code in
> Assembler aussieht. Woher bekommen ich diese Information?

wenn du Glück hast, wird deine wait-Funktion "lichtschnell" sein: Der 
Compiler erkennt dann nämlich, daß im Schleifenrumpf nix passiert und 
optimiert dir diesen weg. Somit ist deine Wait-Funktion immer gleich 
schnell, nämlich nur die (zu vernachlässigende) Dauer des 
Funktionsaufrufs lang.

von Karl H. (kbuchegg)


Lesenswert?

Plip schrieb:
> Hallo,
>
> ich habe eine einfache wait-Funktion geschrieben:
>
1
> void wait(const uint16_t val)
2
> {
3
>     uint16_t cnt = val;
4
>     while(cnt--)
5
>         ;
6
> }
7
>
>
> Der Controller ist ein PIC16f und ich benutze die MPLAB X IDE.
>
> Jetzt möchte ich gerne das Verhältnis von Counter zu realer Zeit wissen.

Bei einem guten Compiler ist das 0.
Der wirft dir das alles nämlich einfach raus, weil es ausser Zeit 
verbraten keinen Zweck erfüllt.


Und PS: wait Funktionen werden überbewertet.
Oft ist in der µC-Programmierung ein 'wait' nicht die Lösung, sondern 
Teil des Problems.
PS2: Die Library, die mit deinem Compiler mitgekommen ist, wird sehr 
wahrscheinlich eine tatsächlich funktionierende wait-Funktion 
beinhalten. Manchmal heißt die auch 'sleep' oder 'delay'

von Peter D. (peda)


Lesenswert?

Die Laufzeit von C-Code ist unvorhersehbar. Das funktioniert also nur 
zufällig mal.

Besser sind folgende Möglichkeiten:
1. Dein Compiler enthält eine delay.h
2. Du benutzt einen Timer.
3. Du schreibst selber Inline Assembler Macros dafür


Peter

von Plip (Gast)


Lesenswert?

Ok, ich habs mit nem Timer gelöst...

Besten Dank!

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.