Adresse?

Gast #131145
Lesenswert?

Hi Leute ich habe eine Frage:

Das Register SCOn zb hat die Adresse 98Hex

und ist wie folgt "ausgebaut":

7    6    5     4     3     2     1      0
SM0  SM1  SM2   REN   TB8   RB8   TI    RI


Nun meine Frage:

Unter welcher Adr. erreiche ich das Bit RI oder TI?

RI:
Ist das sbit TI = 0x98 oder 0x99

TI:
Ist das sbit RI = 0x99 oder 0x9A


Wäre dankbar für jede Antwort!

Schwarzi
Gast #131150
Lesenswert?

Also wenn ichs richtig gesehen habe geht das ganze so:


sfr SCON = 0x98;

sbit RI = 0x98;
sbit TI = 0x99;

usw.............. Hoffe das es so funktioniert!

@Peter: Ja schon klar nur die Header-Datei von Atmel schreibt

Sbit (TI,0x98, 1) und das versteht das Keil nicht.......deshalb hab
ichs umschreiben müssen !

MfG schwarzi
Gast #131151
Lesenswert?

warum sollten denn die 8 einzelnen bits eines 8bit Registers
unterschiedliche Adressen haben?
Oder hab ich die Frage nicht verstanden.
Also eigentlich ist der Verweis aufs wiki doch gar nicht so verkehrt.
Um die Bits in dem einen Register zu manipulieren musst du ja im Grunde
die Bits an der entsprechenden Adresse manipulieren. Sprich mit einer
entsprechenden Bitmaske verodern bzw. verunden. Mach dir auch noch mal
den Unterschied zwishen Bits und Byte klar, dann müsste die Verwirrung
weggehen.
Gast #131154
Lesenswert?

@Schwarzi:

Die Bits sind die Daten im Register. Ein Register besteht aus 8 Bits.
Ein Register ist exakt unter einer Adresse gespeichert. Die Bits im
Register haben Werte:

Bit 0 = Wert 1 = 0x01
Bit 1 = Wert 2 = 0x02
Bit 2 = Wert 4 = 0x04
Bit 3 = Wert 8 = 0x08
Bit 4 = Wert 16 = 0x10
Bit 5 = Wert 32 = 0x20
Bit 6 = Wert 64 = 0x40
Bit 7 = Wert 128 = 0x80

Ist in Deinem Beispiel das Bit "RI", also Bit Nummer 0 im Register
SCOn gesetzt, und all anderen Bits sind gelöscht, hat das Register SCOn
an der Adresse 0x98 den Wert 0x01. Is das Bit "TI", also Bit Nummer 1
gesetzt, alle anderen Bits gelöscht, ist der Wert des Registers 0x02.
Sind alle Bits im Register gesetzt, ist der Wert 0xFF, sind nur die
Bits "RI" und "TI" gesetzt, ist der Wert des Registers 0x03.

Alles klar?

Bits sind Werte im Register; Ein Register hat 8 Bits; Ein Register hat
exakt eine Adresse.
Gast #131155
Lesenswert?

Ja danke für die Antwort ist mir aber alles klar!

Nur ich kann doch das RI auch einfach so setzten ohne das Register SCON
zu maskieren?!

Das geht ja nur wie muss man das schreiben bzw. definieren !?


Trotzdem danke für die antwort!  Spitze erklärt!
Gast #131156
Lesenswert?

Ich glaube ihr redet aneinander vorbei. Es geht ja wohl um ein
8051er-Derivat?
Da gibt tatsächlich die Möglichkeit mit dem Befehl SETB einzelne Bits
zu setzen, mit CLR zu löschen, mit CPL zu toggeln usw. Dabei hat jedes
Bit seine EIGENE Bitadresse, die sich von der Byteadresse des Registers
unterscheidet.

Zu Schwarzis Frage:
Bitadresse von TI = 0x99
Bitadresse von RI = 0x98

Christian
Gast #131157
Lesenswert?

@Schwarzi:

Offensichtlich ist Dir nicht alles klar...

In welcher Sprache willst Du das Register setzen? In C? Das geht so:

SCOn = SCOn | 2;

Kürzer:

SCOn |= 2;

Wenn das Bit "TI" als Bitnummer in den Headers definiert ist:

SCOn |= (1<<TI);

In der avr-libc gibt's dafür auch ein Makro (find' ich aber nicht so
toll):

SCOn |= _BV(TI);
Gast #131158
Lesenswert?

Ja Christian du hast recht wird haben an einander vorbeigeredet :-) bzw.
geschrieben! So wie ichs oben gschrieben habe und so wie Christian so
funktioniert es!


Trotzdem allen einen recht herzliches Dankeschön für eure Hilfe und
Antworten!


MfG Schwarzi
#131159
Lesenswert?

Schwarzi,

Sbit (TI,0x98, 1) scheint ein Macro zu sein, d.h. irgendwo muß noch die
dazu gehörende Macro-Definition stehen.

Aber warum nimmst Du die *.h-Files nicht von Keil ?


@Michael (ein anderer),

die 8051-er haben die Besonderheit, daß alle IO-Register, deren Adresse
/8 teilbar ist, auch Bit-adressierbar sind.

Z.B. von Register 0x88 haben die einzelnen Bits die Adressen
0x88..0x8F.


Peter
Gast #131160
Lesenswert?

@Peter Dannegger:

Das ist ja lustig. Das wusste ich in der Tat noch nicht... (man lernt
eben wirklich nie, nie, niemals aus).

Wie funktioniert das dann genau? Welche Werte finden sich im Register
an der "Bit-Adresse"? 0x00 und 0xFF? Oder werden die jeweils nicht
benutzten Bitnummern bei Schreiben ignoriert und beim Lesen sind die
immer null, so dass man sich ein maskieren sparen kann?


@Schwarzi:

Ja, offensichtlich haben wir aneinander vorbeigeredet... Mir ist aber
auch nicht aufgefallen, dass in Deinem Posting kein Prozessortyp
angegeben war und ich deshalb, ohne es zu bemerken, von einem AVR
ausgegangen bin...

Klassisches Missverständnis. ;-)
Gast #131161
Lesenswert?

@Michael:
Nein, an den Bitadressen findet man keine kompletten Bytes (also 0x00,
0xFF oder sonst was) sondern nur ein Bit (also 0 oder 1). Der 8051 hat
Bitmanipulationsbefehle (SETB, CLR, CPL, Sprungbefehle usw.) die mit
diesen Bitadressen arbeiten.

SETB RI
bzw.
SETB 0x98

würde also das Bit 0 (RI) im Register mit der Byte-Adresse 0x98 (SCON)
setzen,

SETB 0x99

das Bit 1 (TI) an der selben Byteadresse.

Christian

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