Verständnisproblem delay.h !!HILFE!!

Gast #283799
Lesenswert?
• ▲
▼
Hallo Männers,

ich brauche mal eure Hilfe, bevor ich hier noch eine Koffeinvergiftung
und/oder graue Haare bekomme.
Zum Problem: Ich will mit der oben geposteten delay.h eine Verzögerung
von ca 200 bis 600 µs bewerkstelligen.
Als Hardware benutze ich einen ATmega 128 mit 16 MHz Taktfrequenz.

Die Funktion " _delay_us(double __us)" ist klar, hier wird der
übergebene Wert auf die Funktion " _delay_loop_1" angepaßt.
Laut Aussage des Kommentars kann ich mit _delay_us eine max Verzögerung
von 768µs / 16MHz = 48 µs erreichen.

Ergo, muß ich in der Funktion "_delay_loop_1" etwas "drehen".
Und damit sind wir bei meinem Problem:

static _inline_ void
_delay_loop_1(uint8_t __count)
{
  _asm_ volatile (
    "1: dec %0" "\n\t"
    "brne 1b"
    : "=r" (__count)
    : "0" (__count)
  );
}

Es wäre schön, wenn mir jemand von Euch diese 6 Zeilen mal erklären
könnte, und vielleicht auch die andere Funktion (_delay_loop_2).
Ich weiß, das hier mit dem 8Bit-Counter bzw. 16Bit-Counter etwas
decrementiert wird, kann das aber beim besten Willen nicht
nachvollziehen!! C ist das scheinbar nicht und Assembler auch nicht,
oder nur zum Teil.... Vielleicht ist das so was wie ne Makro-Anweisung
oder ähnlich, naja ich hoffe auf Euch!!!
Wenn ich das kapiert habe, kann ich mich entscheiden, ob ich mir was
neues einfallen lasse, oder hier weiter Zeit investiere.

Übrigens, die Datei "delay.h" stammt aus dem letzten WinAVR und
sollte bei jedem, der diesen nutzt mit dabei sein.

vielen Dank für Eure Mühe!

mfg

Asterix-007
Angehängte Dateien:
Moderator Persönliche Seite #283801
Lesenswert?
• ▲
▼
> C ist das scheinbar nicht und Assembler auch nicht, oder nur zum
> Teil.... Vielleicht ist das so was wie ne Makro-Anweisung oder
> ähnlich, naja ich hoffe auf Euch!

Es ist der sogenannte inline-Assembler.  Doku findest du in der
avr-libc-Doku.

Kurz:

Das Register __count wird decrementiert, bis es 0 ist.  Über die
sogenannte constraint "r" wird der Compiler angewiesen, für __count
auch tatsächlich ein Register bereitzustellen (und nicht etwa eine
Speicherzelle im RAM).  Das ist notwendig, weil nur damit die
DEC-Anweisung funktioniert.

Da die DEC-Anweisung einen Taktzyklus braucht und der anschließende
Rücksprung BRNE zwei Zyklen (solange er springt), hat man drei
Taktzyklen pro __count-Wert.

Ansonsten: volle Zustimmung, benutze _delay_ms(0.2).  Bitte schalte
die Optimierung ein, damit die Gleitkomma-Rechnerei vom Compiler
erledigt wird.  Falls du Probleme hast, bei mehr als einem Aufruf von
_delay_ms() doch noch Gleitkommarechnungen mit reingezogen zu
bekommen, aktualisiere bitte deine Bibliothek auf avr-libc-1.2.6.
Gast #283802
Lesenswert?
• ▲
▼
@ Jörg:

Danke für die Hilfe! Das Prinzip hatte ich mir schon so gedacht, aber
ich konnte den Quellcode nicht zuordnen bzw. deuten!

Die neue Lib habe ich mir schon geladen, und die Hilfe habe ich auch
schon aktiviert! Aaaaber, wie bekomme ich die Library
"eingebastelt"????
Ich habe schon versucht sie irgendwo einzufügen, aber dat war wohl
nix...;-))

Gibst du mir noch einen Tip??

Danke!

Asterix-007

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.