Atmega32U4 sts statt out

Gast #2203175
Lesenswert?

Hi Leute.

Habe vor kurzem ein Programm von einem Atmega32 auf einen Atmega32U4 
migriert.
Es ging um ein Programm bei dem Zeiten sehr kritisch sind und ich an 
manchen stellen mit inline assembler arbeiten muss, um eine bestimmte 
Laufzeit einzuprägen, also Compiler unabhängig machen muss.

Leider habe ich gemerkt, dass der Atmega32U4 bei Zugriffen auf die 
"peripherie" Register (also sowas wie PORTD) mit sts statt wie beim 
Atmega32 mit out schreibt. sts braucht zwei statt einem Takt.

Was ist der Vorteil für eine solche Architektur? Also was bezweckte 
Atmel mit dieser Entscheidung? Dass alle Register im gleichen Adressraum 
liegen?

In der Instruction Set Summary des Atmega32U4 Datenblattes gibt es den 
Befehl out immer noch. Habe es noch nicht ausprobiert aber kann ich ihn 
dann also trotzdem benutzen? Wenn ja muss ich dann die gleiche 
Registernummer angeben?

Warum entscheidet der Compiler sts statt out zu nehmen?
Gast #2203184
Lesenswert?

Hi

>Was ist der Vorteil für eine solche Architektur? Also was bezweckte
>Atmel mit dieser Entscheidung? Dass alle Register im gleichen Adressraum
>liegen?

Liegen sie sowieso. Alle IO-Register sind mit sts ansprechbar. Der 
Unterschied ist, das out nur einen begrenzten Adressbereich (0...$3F) 
ansprechen kann. Das entspricht den Adressen im IO-Raum von $20...$5F. 
Höhere Adressen können also nur mit sts/lds angesprochen werden.

>sts braucht zwei statt einem Takt.

Nein. Hat zwei statt ein Word Länge.

MfG Spess
Gast #2203189
Lesenswert?

Das hab ich im Datenblatt gefunden:

When using the I/O specific commands IN and OUT, the I/O addresses $00 - 
$3F must be used. When addressing I/O regis-
ters as data space using LD and ST instructions, $20 must be added to 
these addresses. The ATmega16U4/ATmega32U4 is
a complex microcontroller with more peripheral units than can be 
supported within the 64 location reserved in Opcode for
the IN and OUT instructions. For the Extended I/O space from $60 - $1FF 
in SRAM, only the ST/STS/STD and LD/LDS/LDD
instructions can be used.


spess53 schrieb:
>>sts braucht zwei statt einem Takt.
>
>
>
> Nein. Hat zwei statt ein Word Länge.

Du hast recht, das erklärt auch warum doppelt so lang gebraucht wird.

Bei mir ging es um das UDR1 Register, dass ich als SPI Register 
verwende. Dieses liegt bei $CE, also nicht im unteren Adressraum. Zuvor 
habe ich das SPDR Register benutzt welches im Adressraum $00 - $3F 
liegt. Also geht es damit nicht... Schade...

Danke für die schnelle Antwort.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren