mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Adresse?


Autor: Schwarzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal im WIKI nach Bitmanipulation da steht alles drin ;)

Autor: Schwarzi (Gast)
Datum:

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


hmmmmm

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau einfach mal ins reg51.h, da ist doch schon alles richtig
definiert.


Peter

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach dir nichts draus Schwarzi, Jens123 gibt immer so unbrauchbare
Antworten.

Autor: Schwarzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens
Du bist mein Held

Autor: Schwarzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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......... :-)

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schwarzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Christian Zietz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Schwarzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Christian Zietz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.