Forum: Mikrocontroller und Digitale Elektronik ST Z, R27 identisch mit OUT PortB, R27 AVR ATMega


von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
eine Frage an die Erfahrenen mit ATMEGA / AVRs:
(ATmega8, DDRB=Ausgang)

LDI     R27, $55
LDI  R30, $38
LDI  R31, $00

Führen die folgenden Befehle zum gleichen Ergebnis?

a)  ST  Z, R27
b)  OUT  PortB, R27

Viele Grüße und einen Guten Rutsch ins Jahr 2010 wünscht Herbert

von spess53 (Gast)


Lesenswert?

Hi

Nein. Die Adresse von PortB im Adressraum ist $18.

MfG Spess

von Jörg G. (joergderxte)


Lesenswert?

Wenn 0x0038 die SRAM-Adresse von PORTB ist (musst du in's Datenblatt 
schauen), dann ja.

Man kann das so schreiben :
1
    ldi r30, low(PORTB)
2
    ldi r31, high(PORTB)
3
    ; ...
dann ist es dasselbe.

hth, Jörg

von spess53 (Gast)


Lesenswert?

Hi

Korrektur: $38 ist richtig.

>Man kann das so schreiben :

>    ldi r30, low(PORTB)
>    ldi r31, high(PORTB)
>    ; ...

>dann ist es dasselbe.

Nein. 'PortB' ist als $18, also der IO-Adresse, definiert. Z muss aber 
mit der Speicheradresse geladen werden. Und die ist $38.

MfG Spess

von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
Danke für die schnellen Antworten.

Jetzt bin ich noch mehr verwirrt:
Im ATmega8 Datenblatt steht auf Seite 287 (Register Summary) für PortB
0x18 (0x38).
Dabei fällt mir auf, das in den Klammern immer Hex +20 steht.
Auf der Seite davor bzw. danach steht aber nichts, was die Klammern 
bedeuten.

LDI  R27, $55
LDI  R30, $38
LDI  R31, $00

Führen die folgenden Befehle zum gleichen Ergebnis?

a)  ST  Z, R27             (das wäre also $0038, Z=R31,R30) < $55
b)  OUT  PortB, R27        (das wäre also $18) < $55

Letztendlich hätte ich gern gewußt, ob in beiden Fällen an PortB $55 
erscheinen wird.

Viele Grüße Herbert

von spess53 (Gast)


Lesenswert?

Hi

>Dabei fällt mir auf, das in den Klammern immer Hex +20 steht.
>Auf der Seite davor bzw. danach steht aber nichts, was die Klammern
>bedeuten.

Du musst dir das Ganze wie einen durchgehenden Adressraum vorstellen:

$00..$1F           Register 0..31
$20..RAMSTART      IO-Register
RAMSTART...RAMEND  RAM

Die unteren 64 Io-Register haben zusätzlich noch die IO-Adressen 
$00-$3F, die z.B. von 'in'/'out' verwendet werden.

MfG Spess

von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
also kann ich PortB über beide Möglichkeiten "umschalten".
Ich habs mal als Inline ASM mit in den Quelltext eingefügt.
Per Debugger erscheint jedenfalls in beiden Fällen der Wert am
virtuellen PortB.
Danke für die Erklärungen.
Viele Grüße Herbert

PS: Warum ??? Ich versuche gerade zu verstehen, was der Compiler aus 
meinem Quelltext macht und wie der die Ports dann anspricht in einer 
LIB, da ich keine IN/OUT Befehle in der LST Datei gefunden habe, sondern 
die Adressierung über Z.
Hat mich etwas stutzig gemacht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.