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
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
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.
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
_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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.