Verstehen Sie das Atmega168P-Datenblatt

Ich bin dabei, das oben erwähnte Dokument von hier aus durchzulesen .

Auf Seite 21, zweiter Absatz in Abschnitt 8.5 I/O Memory, ist Zeile 6 wie folgt angegeben:

Bei Verwendung der I/O-spezifischen Befehle IN und OUT müssen die I/O-Adressen 0x00 - 0x3F verwendet werden.

Auf Seite 224 Assembly Code Examplehat Zeile 1 der Tabelle, erste Spalte, die letzte Zeile jedoch wie folgt:

out TWCR, r16

Aber gemäß der Aussage auf Seite 21 ist die obige Anweisung falsch, da TWCR die Speicheradresse hat, 0xBCwie sie auf Seite 396, Zeile 6 angegeben ist.

Ist hier etwas falsch, oder verstehe ich das falsch?

Bitte helfen Sie.

Bearbeiten: Definitionsdatei

Antworten (1)

Du verstehst es falsch. Ja, TWCR hat eine Speicheradresse von 0xBC, aber das ist nicht seine IO-Adresse.

Es gibt zwei Möglichkeiten, auf den Port zuzugreifen – über IO und über den Speicher. Wenn Sie in C dieser Adresse einen Wert zuweisen, ändert es stattdessen die Adresse in die IO-Adresse und verwendet eine In- oder Out-Anweisung anstelle von Lade- oder Speicheranweisungen.

-- bearbeiten --

Wenn Sie sich die Definitionsdatei ansehen, die Sie gepostet haben, gibt es Folgendes:

; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
....
.equ    TWCR    = 0xbc  ; MEMORY MAPPED

Ich vermute eigentlich, dass das Datenblatt falsch ist. Es wäre nicht verwunderlich, wenn dieser ganze Abschnitt über das TWI wörtlich aus einem anderen Datenblatt kopiert würde, dessen TWI-Schnittstelle IO-abgebildet und nicht speicherabgebildet ist, wie z. B. der ATMega32. Es ist nicht ungewöhnlich.

Aber ich spreche von Assembly, nicht von C.
Ja, aber Sie verwechseln auch Speicheradressen und E / A-Adressen. Die Speicheradresse ist 0xBC, die IO-Adresse jedoch nicht. Ich weiß nicht, in welcher Datei die IO-Adressen definiert sind, oder ich würde es nachschlagen.
Ich verwende C nur als Beispiel - Sie schreiben an die Speicheradresse , und es ändert sie in die io- Adresse und verwendet OUT.
Ich habe einen Link zur Definitionsdatei hinzugefügt. Es fällt mir schwer, es zu verstehen.
Genau, als ich versuchte, einen Testcode in Atmel Studio zu debuggen, wurde der Fehler "außerhalb des Bereichs" angezeigt.
Das Problem, das sie haben, ist, dass der OUT-Opcode nur 6 Bits zum Speichern der Adresse hat: 10111PPrrrrrPPPP out P,rDie maximale Adresse, die er verwenden kann, ist also 2^6-1 oder 63 (0x3F). Sie füllten das bald auf, also mussten sie sich andere Möglichkeiten einfallen lassen, dies zu tun. Einige Chips verwenden OUT für einige Peripheriegeräte, einige für andere, und es gibt keine (oder wenig) Gemeinsamkeiten zwischen ihnen.