mikrocontroller.net

Forum: Compiler & IDEs delay-zeit in float.


Autor: bastle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, wird diese delay so verarbeitet wie ich erwarte oder muss die 
gerundet werden (atmega32,8mhz) : _delay_us(4.5);

mfg

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht so.

Autor: bastle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe hier den code "main.lss" eingesehen und sehe, das die delay und 
portd zb nicht als asm-code erscheint, wie ich den asm-code von diesen 
einsehen?
  _asm_ volatile (
  9e:  89 e4         ldi  r24, 0x49  ; 73
  a0:  8a 95         dec  r24
  a2:  f1 f7         brne  .-4        ; 0xa0 <main+0xe>

  _delay_us(27.5);

  PORTD |= (1 << sync);

.....
......

wie genau ist die delay_us als float-zahl eigentlich?

mfg

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit WinAVR-20071222 sieht das anders aus.

test.c - C-Quellcode

#include <avr/io.h>
#include <util/delay.h>

#define sync 3

int main(void)
{
  _delay_us(27.5);
  PORTD |= (1 << sync);
}


Übersetzt wurde mit den Einstellungen MCU=Atmega128, -Os, F_CPU=8000000.

test.lss - Ausschnitt Disassemblerlisting

000000ce <main>:
  ce:  89 e4         ldi  r24, 0x49  ; 73
  d0:  8a 95         dec  r24
  d2:  f1 f7         brne  .-4        ; 0xd0 <main+0x2>
  d4:  93 9a         sbi  0x12, 3  ; 18
  d6:  80 e0         ldi  r24, 0x00  ; 0
  d8:  90 e0         ldi  r25, 0x00  ; 0
  da:  08 95         ret


Wegen eines Bugs in der neusten GCC-Toolchain sind die C-Quellcodezeilen 
nicht enthalten.

In Adresse ce bis d2 ist die _delay_us Inline-Funktion. Aus 27.5 µs bei 
8 MHz wurde der Schleifenzähler 0x49 berechnet.

Die Genauigkeit könnte man überprüfen, indem man die Laufzeit dieses 
Abschnitts im AVR-Studio im Debugger mit dessen Stoppwatch  misst. Man 
kann auch die Taktzyklen der einzelnen Befehle im AVR Instruction Set 
Manual nachschlagen und das mit Stift und Papier ausrechnen.

Und bei Adresse d4 ist das Manipulieren des Ports.

Autor: bastle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...WinAVR-20071222....

wo hast du die version vom 22.12.07 her, ich habe nur die vom 21.12.07?

habe festgestellt, das die genauigkeit mindestens  immer aus einen 
durchlauf besteht "brne" ( ich glaube der keinste durchlauf hat 3 zyclen 
):
ldi  r24, 0x01
dec  r24
brne  .-4

also bei 0,5µs (8mhz) hat er einen durchlauf, sind 3 zyclen, müsste aber 
4 zyclen haben. der compiler baut selber keine nop rein.

dieses machst sich noch nicht einmal bei meinem fbas-bildaufbau 
bemerkbar.

also ich bin sehr zufrieden mit dieser zeitmessung.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WinAVR-20071221 habe ich auch. Ich hatte Tomaten auf den Augen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ bastle (Gast)

>wie genau ist die delay_us als float-zahl eigentlich?

Das landen des Schleifenzählers dauert 1 Takt. Ein Durchlauf dauert 3 
takte, bis auf den letzten, der dauert nur zwei. Bei _delay_ms() dauert 
das Laden des Schleifenzählers 2 Takte, ein Durchlauf vier, der letzte 
3.

MFG
Falk

Autor: bastle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dieses habe ich aus einem warteschleifen-generator : 8mhz, und 0,5µs

; =============================
;   Warteschleifen-Generator
;     4 Zyklen:
; -----------------------------
; warte 3 Zyklen:
          ldi  R17, $01
WGLOOP0:  dec  R17
          brne WGLOOP0
; -----------------------------
; warte 1 Zyklus:
          nop
; =============================

dann stimmt der ja nicht?oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bastle wrote:
> dieses habe ich aus einem warteschleifen-generator : 8mhz, und 0,5µs
>
> ; =============================
> ;   Warteschleifen-Generator
> ;     4 Zyklen:
> ; -----------------------------
> ; warte 3 Zyklen:
>           ldi  R17, $01
> WGLOOP0:  dec  R17
>           brne WGLOOP0
> ; -----------------------------
> ; warte 1 Zyklus:
>           nop
> ; =============================
>
> dann stimmt der ja nicht?oder?


Warum soll das nicht stimmen?
Hier werden 4 Taktzyklen verbraten. Bei 8 Mhz dauern diese
4 Zyklen 0.5µs.

  ldi     1 Takt
  dec     1 Takt   -> das Ergebnis davon ist 0
  brne    1 Takt   weil der Branch nicht genommen wird
  nop     1 Takt
         --------
          4 Takte

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man hätte natürlich auch der Einfachheit gleich 4 NOPs nehmen können. 
;-)

Autor: bastle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Man hätte natürlich auch der Einfachheit gleich 4 NOPs nehmen 
können....

bei meiner einstellung -0s wird kein nop eingefügt sondern es wird 
mindestens immer eine schleife erstellt bei delay_µs( )........

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, _delay_us() und _delay_ms() machen wirklich nur einfache
Schleifen.  Es ging ja hier eher um deinen Warteschleifen-
Generator (wo auch immer er her ist).

Autor: bastle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Ja, _delay_us() und _delay_ms() machen wirklich nur einfache
Schleifen.....

reicht auch vollkommen aus, wenn ich auf 0,5µs runtergehen kann bei 
8mhz. gute leistung für winvr-c.

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.