www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik delayloops in c einbinden


Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.