Forum: Mikrocontroller und Digitale Elektronik Adresse?


von Schwarzi (Gast)


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

von Jens123 (Gast)


Lesenswert?

Schau mal im WIKI nach Bitmanipulation da steht alles drin ;)

von Schwarzi (Gast)


Lesenswert?

Sit mir echt nicht klar! Da steht doch nichts über meine Frage drinnen?
Wie ich Bits toggle und so weiß ich doch!


hmmmmm

von Peter D. (peda)


Lesenswert?

Schau einfach mal ins reg51.h, da ist doch schon alles richtig
definiert.


Peter

von Jens (Gast)


Lesenswert?

Mach dir nichts draus Schwarzi, Jens123 gibt immer so unbrauchbare
Antworten.

von Schwarzi (Gast)


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

von chrissy (Gast)


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.

von Jens123 (Gast)


Lesenswert?

@Jens
Du bist mein Held

von Schwarzi (Gast)


Lesenswert?

Ich will ja nichts maskieren oder so sondern einfach das ich das bit TI
oder so setzten kann .......... es geht um die adresse wo es zu finden
is......... :-)

von Michael (ein anderer) (Gast)


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.

von Schwarzi (Gast)


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!

von Christian Zietz (Gast)


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

von Michael (ein anderer) (Gast)


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);

von Schwarzi (Gast)


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

von Peter D. (peda)


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

von Michael (ein anderer) (Gast)


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. ;-)

von Christian Zietz (Gast)


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

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.