ATmega128 Erweiterte E/A

Dies ist das erste Mal, dass ich mit einem "größeren" Mikrocontroller, ATmega128, arbeite. Bisher habe ich mit ATmega328, ATmega8 usw. gearbeitet.

Beim Lesen des Datenblattes habe ich einige Punkte nicht verstanden

  • Dieser AVR-Befehlssatz kann maximal 64 E/A-Adressen unterstützen. Warum das? Nimmt der AVR-Befehlssatz 6 Bits für eine E/A-Position auf?

  • Um die erweiterten E/A im ATmega128 (160 zusätzliche) unterzubringen, wurden diese 160 Speicherplätze direkt nach den 64 vorhandenen dem internen SRAM zugeordnet. Von den 4 KB SRAM, die ATmega128 bereitstellt, werden also 160 von diesen erweiterten E/A-Positionen belegt. Was passiert, wenn die ATmega103-Kompatibilitätssicherung gesetzt ist (standardmäßig programmiert)? Habe ich dann Zugriff auf diese 160 Standorte?

  • Wie genau greife ich auf diese erweiterten Standorte zu? Das Datenblatt verlangt die Verwendung von LD/LDS/LDD und ST/STS/STD. Irgendwelche Beispiele dazu, da ich noch nie zuvor Assembler verwendet habe. Ich bin etwas verwirrt, wie sich das in meinen C-Code-Workflow integrieren würde? Nehmen wir an, ich muss auf DDRF und PORTF zugreifen. Muss ich ihre Adresse (im SRAM) im Voraus wissen oder gibt es ein Makro in avr-gcc?

Alle Codebeispiele oder Links zum Lesen und Verstehen oben wären großartig!

Antworten (1)

Dieser AVR-Befehlssatz kann maximal 64 E/A-Adressen unterstützen. Warum das? Nimmt der AVR-Befehlssatz 6 Bits für eine E/A-Position auf?

Die meisten AVR-Befehle setzen ihre Argumente als Teil des Maschinencodeworts . IN, OUT, SBI, und CBIhaben nicht mehr als 6 Bits für Argumente zur Verfügung.

Um die erweiterten E/A in ATMega128 (160 zusätzliche) unterzubringen, wurden diese 160 Speicherplätze direkt nach den 64 vorhandenen dem internen SRAM zugeordnet. Von den 4 KB SRAM, die ATMega128 bereitstellt, werden also 160 von diesen erweiterten E/A-Standorten belegt.

Falsch. Alle 4kiB sind verfügbar, 160 Adressen weiter oben.

Was passiert, wenn die ATMega103-Kompatibilitätssicherung gesetzt ist (standardmäßig programmiert)? Habe ich dann Zugriff auf diese 160 Standorte?

Nein. Sie verlieren die 160 erweiterten Register (und der SRAM bewegt sich zurück, um sie zu füllen) plus die letzten 96 Bytes des SRAM.

Wie genau greife ich auf diese erweiterten Standorte zu?

Mit normalen Speicherzugriffsanweisungen.

Das Datenblatt verlangt die Verwendung von LD/LDS/LDD und ST/STS/STD. Irgendwelche Beispiele dazu, da ich noch nie zuvor Assembler verwendet habe.

LDS R1, $61
ORI R1, $08
STS R1, $61
LDS R1, $62
ANDI R1, $F7
STS R1, $62

Ich bin etwas verwirrt, wie sich das in meinen C-Code-Workflow integrieren würde? Nehmen wir an, ich muss auf DDRF und PORTF zugreifen. Muss ich ihre Adresse (im SRAM) im Voraus wissen oder gibt es ein Makro in avr-gcc?

AVR Libc erledigt das alles für Sie.

DDRF |= _BV(PF3);
PORTF &= ~_BV(PF3);
Also deprogrammiere ich im Grunde nur die ATMega103-Kompatibilitätssicherung in ATMega128 und verwende dann wie gewohnt den erweiterten PORTC/G/F. richtig?
Auf C-Niveau ja.