www.mikrocontroller.net

Forum: Compiler & IDEs 16Bit TCNTx auslesen - ASM-Code vs. GCC-Compiler


Autor: Fren Mallow (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

Es geht um Codeoptimierung wegen Laufzeit..

Im Datenblatt des ATMega168 stehen auf Seite 106 Codeschnipsel zum
Auslesen des 16Bit Timerstands:

Assembler:
..
in r16,TCNT1L
in r17,TCNT1H
..

Der "in"-Befehlt braucht 1 Cycle

Für C steht als Beispiel:
..
int i;
i = TCNT1;
..

Nun zum eigentlichen Problem..

Der C-Code, wird nach dem compilieren zu folgendem:
..
lds r24,0x0084
lds r25,0x0085
..

Der "lds"-Befehl benötigt im Gegensatz zum "in"-Befehl 2 Cycles,
bis er abgearbeitet ist. Das gefällt mir schon mal nicht.
Wenn ich in C einen 8Bit Timer abfrage, dann kommt allerdings der
"in"-Befehl im Assembler-Code.. dh. der Compiler macht diesen
"Mist" nur beim 16Bit Timer..

Hat jemand ne Idee?

Wie müsste ich das r24 und r25 Register im C-Code ansprechen, falls ich
mich für Inline-Assembler entscheide, wenn das der einzigste Weg ist,
die 1-Cycle Befehle anstatt der 2-Cycle Befehle zu erhalten?

Danke im Vorraus

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ATmega168 kann TCNT1 nicht mit in /out ansprechen. Das geht nur bis
zur I/O-Adresse 3Fhex.
Das Beispiel im Manual ist ein Bug, wahrscheinlich aus dem ATmega16
Manual kopiert. Bei dem lässt sich TCNT1 nämlich per in/out ansprechen.
Am besten gleich an Atmel weiterleiten.

Zum weiteren Verständnis:
schau Dir dazu die Header-Files iom32.h und iomx8.h in Deinem gcc-Dir
an:

#define TCNT1   _SFR_IO16(0x2C)    // mega16
#define TCNT1   _SFR_MEM16 (0x84)  // mega168

Viele Grüße, Stefan

Autor: Fren Mallow (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thx.. muss ich also mit 2cycles per 8bit leben

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.