PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Register ansprechen ->



peterbauer
03.03.2009, 18:48
Hallo zusammen,

ich frage mich gerade, was eigetnlich genau passiert, wenn ich z.B. einen PORT auslese oder beschreibe.

Angenommen ich beschreibe PORTB würde ich das wie folgt machen:


PINB = 0x34; // oder ähnlich


Meine Frage ist eigentlich, was steckt hinter PINB

In iom32.h ist PINB wie folgt definiert:


#define PINB _SFR_IO8(0x16)

_SFR_IO8 ist in sfr_defs.h zu finden:


#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

und ab diesem Punkt kann ich es nicht mehr nachvollziehen. Angenommen ich wüsste die Adresse von PORTB, könnte ich diesen dann direkt auslesen? Was genau macht der Compiler an dieser Stelle?

Danke!

Peter

PicNick
03.03.2009, 19:10
Letztlich macht er genau das, was du oben angeführt hast.
Es ist das Bereich, in dem die "special-function-register" (SFR) sind, als basis definiert
(irgendwo steht noch "#define __SFR_OFFSET nnn " )
Das PortB ist offenbar in diesem Bereich an der Stelle 0x16
Also
1 PINB = 0x34
2 _SFR_IO8(0x16) = 0x34
3 ((0x16) + nnn) = 0x34

peterbauer
03.03.2009, 19:39
Danke Dir,

aber was genau macht der Compiler damit?

Da steht ja jetzt eigetnlich nur eine Zahl, also die 0x16 + offset der wir irgendeine andere Zahl zuweisen. Wie wird wird das jetzt umgesetzt?

Grüße,

Peter

PicNick
03.03.2009, 19:49
Die Zahl versteht er als Adresse, d.h. er schreibt den wert 0x34 dorthin.