Forum: Compiler & IDEs Delay_Wertübergabe


von Pierre G. (bqube)


Lesenswert?

Guten narbend,

Versteh ich das richtig, wenn ich der Delay Funktion eine Variable 
übergeben möchte schreibe ich einfach selbst eine Funktion die den Wert 
so lange verringert bis ich meine Zeit gewartet hab ?
1
void sleep ( uint8_t ms )
2
{
3
    for(; ms > 0; ms--) _delay_ms(1);
4
}
5
 
6
int main( void )
7
{
8
    int x = 0;                  // Variable als Wartezeit erstellen
9
    DDRB = ( 1 << PB0 );        // PB0 an PORTB als Ausgang setzen
10
 
11
    while( 1 ) {                // Endlosschleife
12
        PORTB ^= ( 1 << PB0 );  // Toggle PB0 z.B. angeschlossene LED
13
        sleep(x); 
14
        x++;       
15
    }
16
    return 0;
17
}

Mfg Bqube

von Marcel P. (souko)


Lesenswert?

Guten Abend,

genau, funktioniert !

von Justus S. (jussa)


Lesenswert?

ist die Frage, wie genau du das delay brauchst...die For-Schleife gibt 
es ja nicht umsonst...

von Pierre G. (bqube)


Lesenswert?

Meine Angst liegt bei der Genauigkeit der Zählung

Sagen wir mal ich habe 1000us die ich warten will und dazu verwende ich 
die oben genannte for schleife, weil der Wert in einer Variable steht. 
Dann warte ich am Ende ja bestimmt keine 1000us mehr sonder 1020 oder so 
in der Art.

Oder sehe ich das falsch


Mfg Bqube

von Marcel P. (souko)


Lesenswert?

Nein, mit der oben genannten Schleife wartest du eher ms statt us ;-)

Ne, aber im Ernst. wenn es hier auf µs ankommt, dann denke ich, wird das 
Springen in die Schleife, das durchlaufen dieser und das zurück springen 
ja auch Zeit verbraten.

Bei 10-20 µs denke ich ist das nicht sehr viel, aber sobald es größer 
wird, kann es schon zu den von dir genannten Ausmaßen kommen.

Wobei es auch hier von der Geschwindigkeit deines Prozessors abhängt.

von Pierre G. (bqube)


Lesenswert?

So hab ich mir das nun gedacht

Wert der Variable an die Funktion Übergeben
1
WARTEN(SUM);
Funktion ausführen // So lage warten bis us nicht mehr größer ist als 0
1
void WARTEN ( uint16_t us )
2
{
3
    for(; us > 0; us--) _delay_us(1);
4
}

Und dann würde es ganz normal weiterlaufen

Wenn ich euch und die Funktion richtig verstanden habe.

Mfg Bqube

von Marcel P. (souko)


Lesenswert?

sollte so funktionieren.

Aber die Genauigkeit leidet hier, je größer deine Wartezeiten werden.
Nur ob man sich hier in nennenswerten Bereichen bewegt, dazu sollten mal 
die Leute mit richtig Erfahrung was sagen ;-)

von Pierre G. (bqube)


Lesenswert?

Genau das würde mich mal Interessieren aber ich glaube nicht das es bei 
meinem Projekt so Tragisch sein wird denn ich erzeuge ein Summensignal 
mit 8 Kanälen wo jeder kanal eine Maximale länge von 2ms hat und darbei 
paar us dürften nicht schaden :)

Es ist ein Attiny26 der mit 8Mhz Betrieben wird

Mfg Bqube

von Marcel P. (souko)


Lesenswert?

Naja, Prinzipiell kann man das ja sogar ausrechnen.

du kannst ja mal deinen compilierten Code Disassemblieren. Dann siehst 
du welche Assembler-Anweisungen für die schleife zuständig sind, und im 
Datenblatt steht, wie viele Takte der Proz braucht für jeden Befehl (die 
meisten brauchen einen einzigen Takt)

Dann kannst du mit deinem CPU-Frequenz und der Anzahl der Takte genau 
ausrechnen wie lange deine Schleife wirklich braucht.

Ich hab aber hier nochwas gefunden:

Beitrag "Delay: Exakt n Ticks erzeugen (avr-gcc)"

ich glaube sehr viel genauer gehts nicht mehr.

Und ich habe mir auch schon oft sagen lassen, das manche zeitkritische 
Dinge einfach nur in Assembler zu machen sind. (Ich selber kann kein 
Assembler - nur einen Befehl - NOP ;-)  )

von Peter D. (peda)


Lesenswert?

Pierre Gnauck schrieb:
> ich erzeuge ein Summensignal
> mit 8 Kanälen wo jeder kanal eine Maximale länge von 2ms hat

Für Signalerzeugung ist der Timer mit Compare-Interrupt gedacht.
Delay hat da nichts verloren.

Wenn Du auf den ATtiny261 wechselst, hast Du auch 10- bzw. 16-Bit Timer.

von Karl H. (kbuchegg)


Lesenswert?

Pierre Gnauck schrieb:

> meinem Projekt so Tragisch sein wird denn ich erzeuge ein Summensignal
> mit 8 Kanälen wo jeder kanal eine Maximale länge von 2ms hat und darbei
> paar us dürften nicht schaden :)

Das klingt nach einer Variante einer Servo-Ansteuerung.

Lies mal hier nach, wie man sowas richtig macht
Modellbauservo Ansteuerung

Völlig ohne Delay, der Timer macht die ganze Arbeit mit ein bischen 
Hilfe durch eine ISR.
Und das beste daran: der macht das völlig im Hintergrund, ohne dass dir 
der µC durch die dauernden Delay blockiert wird.
Allerdings: Peter hats schon gesagt - mit lediglich 8 Bit Timern wirst 
du da eher nicht glücklich werden. Schlechte µC Wahl.

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.