Forum: Mikrocontroller und Digitale Elektronik delayloops in c einbinden


von Bob (Gast)


Lesenswert?

Hallo ich benutze gerade den iccavr(demo) und möchte testen ob man mit 
dem programm delayloops erstellte pausen in mein c code ienbinden kann.

Ich hab das avr-gcc faq mal durchgelesen und da steht, dass es probleme 
geben kann. (wenn ich das richtig verstanden habe (bin ein anfänger))

wenn mir jemand ein beispiel geben könnte wäre ich sehr dankbar

von Peter D. (peda)


Lesenswert?

Delay Loops in C sind prinzipiell unmöglich.
In C ist nämlich die Laufzeit von Instruktionen nicht festgelegt.

Behelfen kann man sich damit, das man eine Schleife programmiert und 
sich dann den erzeugten Assemblercode ansieht und dessen Laufzeit 
ermittelt.

Dieses ist dann aber ausschließlich für diesen Compiler, diese Version, 
diesen Optimierungslevel, dieses Speichermodell gültig !!!

Deshalb sollte man, wenn immer nur irgend möglich, einen freilaufenden 
Timer dafür mitverwenden.

Ansonsten kommt noch In-Line-Assembler in Betracht.


Peter

von crazy horse (Gast)


Lesenswert?

also in CodeVision gibts die Funktionen delay_µs() und delay_ms(), die 
arbeiten ziemlich genau. Gilt natürlich nur, wenn man dem Compiler die 
tatsächliche Taktfrequenz mitteilt.

von Bob (Gast)


Lesenswert?

Danke für die Antworten.
Inline Assembler?!?! Was ist das und wie macht man das?

Kann man die Funktionen vonC  CodeVision auch in anderen Compilern 
verwenden und wie sagt man dem Compiler die Taktfrequenz??

Danke

von crazy horse (Gast)


Lesenswert?

_delay_ms:
000060 91e9      ld   r30,y+
000061 91f9        ld   r31,y+
000062 9630      adiw r30,0
000063 f039        breq __delay_ms1
          __delay_ms0:
000064   +    __DELAY_USW 0x3E8
000064 ee88      LDI  R24,LOW(0x3e8)
000065 e093      LDI  R25,HIGH(0x3e8)
          __DELAY_USW_LOOP:
000066 9701       SBIW R24,1
000067 f7f1        BRNE __DELAY_USW_LOOP
            .ENDM
000068 95a8      wdr
000069 9731      sbiw r30,1
00006a f7c9        brne __delay_ms0
          __delay_ms1:
00006b 9508        ret

hab mal ein Stückchen vom Assemblerfile herauskopiert.
Die Anpassung an die Taktfrequenz geschieht in den Registern R24/R25 in 
der Art, daß die delay_usw_loop 1ms dauert.
Die Schleife benötigt 4 Takte, also Ladewert=Takt (Hz)/1000/4.
Diese 1ms-Schleife wird so oft ausgeführt, wie der Funktion übergeben 
wurde (R30/R31)

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.