adc - adch & adcl auslesen

OP #212884
Hi,
habe etwas gesucht aber nix zu meinem anfänger problem gefunden.

Ich möchte adcl und adch auslesen.

       in 0x04, r16  ;ADCL - LOW Byte Result
       in 0x05, r17

oder
       in ADCL, r16  ;ADCL - LOW Byte Result
       in ADCH, r17

Building project...
AVRASM: AVR macro assembler 2.0.28 (build 121 Jan 11 2005 10:28:51)
Copyright (C) 1995-2005 ATMEL Corporation
C:\Dokumente und Einstellungen\Tobias Rohde\1sttest\1sttest.asm(1):
Including file 'e:\Programme\Atmel\AVR
Tools\AvrAssembler2\Appnotes\4433def.inc'
C:\Dokumente und Einstellungen\Tobias
Rohde\1sttest\1sttest.asm(29): error: Invalid register
C:\Dokumente und Einstellungen\Tobias
Rohde\1sttest\1sttest.asm(30): error: Invalid register
Assembly failed, 2 errors, 0 warnings


1) Was stimmt nicht beim Auslesen von adch & low?
2) Was bedeutet in der doku der io register, die adresse in Klammern
z.B. beim mega8 für das adch 0x05 (0x25) ?
Angehängte Dateien:
Gast #212886
> 1) hab beim in befehl die reihenfolge der registert vertauscht.
> hätte die bezeichnung als anfänger genau andersrum gemacht von
> in&out...

Wieso? Immer zuerst Ziel dann Quelle. Ist bei jedem anderen ASM-Befehl
mit zwei Operanden genauso, und letzendlich auch in C
(x = y;).

> 2) Was bedeutet in der doku der io register, die adresse in
> Klammern z.B. beim mega8 für das adch 0x05 (0x25)

Das scheinen mir die Memory-Mapped-Adressen zu sein, die sind nämlich
immer um 0x20 höher, da sie auf die 32 normalen Register folgen.
Du solltest aber am besten eh immer nur die Namen verwenden, nicht die
direkten Adressen, da diese sich zwischen den verschiednen Controllern
unterscheiden können.
Gast #212887
1) Wie Du wohl schon festgestellt hast, zuerst Ziel, dann Quelle.
   Bei "IN" ist Zier ein Register und die I/O-Adresse die Quelle.
   Also "IN r16,ADCL" und "IN r17,ADCH".
2) Die I/O-Adressen für die Peripherie beginnt bei Adresse 32 (0x20).
   Von Adresse 0 bis 31 (0x1F) sind die 32 Register, danach kommen
   ab Adresse 0x20 die I/O-Register des Controllers.
   Im Befehl IN und OUT kann man nur 32 Adressen ansteuern.
   Die Adresse 0 im IN- oder OUT-Befehl ist die "echte" Adresse
0x20.
   Man kann auch mit LDS und STS oder LD(D) oder ST(D) auf die I/O-
   Register zugreifen, nur muß man dann die echte Adresse in Klammern
   angeben.

MfG
Andi

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.