Forum: Mikrocontroller und Digitale Elektronik 8051 sbit?


von dommes (Gast)


Lesenswert?

hi leude, ich bin gerade dabei mit cvavr ein c-programm zu schreiben. 
dabei möchte ich einen SHT75 auslesen. µC ist ATmega8. Die Werte sollen 
per LCD (2x16) ausgegeben werden. Auf der Sensirion homepage: 
www.sensirion.com gibts c-code für einen 80c51 / Keil-compiler.
Ich versuche gerade diesen Code zu verstehen und für meine Anwendung 
umzuschreiben. Auf der ersten Seite des Sample Codes werden 2 defines 
gemacht. #define DATA P1_1 und SCK P1_0.  P1_0 und P1_1 sind in der 
headerdatei at89s53.h definiert. Da steht:
 sbit P1_0 = 0x90;
 sbit P1_1 = 0x91;

Was macht sbit!!??? Ich habe mir hierzu die Hilfe des Keil Compilers 
durchgelesen, verstehe es aber einfach nicht.
Weiss es vielleicht jemand von euch und kann es mir erklären!?
Mfg Thomas P.

von Joe (Gast)


Lesenswert?

Das ist der Pin P1.0 sowie P1.1 des Port 1. Der 8051 ist BIT 
Adressierbar, eine seiner Stärken.

Das läßt sich nicht so direkt für den ATMEGA übernehmen. Hier mußt du 
das entsprechende BIT maskieren.

von jÜrgen (Gast)


Lesenswert?

wenn du z.b. schreibst:

sbit var;
.
.
.
.
 P1.5 = var;
.
.
.
.

eben, wie Joe schon schrieb...

Wichtig ist, das nicht jeder Port so einfach bit-adressierbar ist... 
soweit ich mich entsinne ist P3 dessen nicht mächtig... -> Datasheet 
lesen ^^

lg jÜrgen

von Cri G. (crigri)


Lesenswert?

hi dommes!

mit sbit kannst du, wie schon erwähnt, jeden einzelnen port-pin des 
8051er einzeln ansprechen und setzen oder lesen.

z.B.: sbit Motor_Out = P1^0;
      Motor_Out = 1;

Mit dieser Anweisung kannst du den Pins beliebige Namen verpassen und 
die dann so bearbeiten.

Mfg Cri

von Ralf (Gast)


Lesenswert?

@Jürgen:

Doch doch, P3 ist auch bitadressierbar.
Bei größeren Derivaten, die mehr Ports haben ist das nicht unbedingt der 
Fall. Ein Standard-8052er kanns auf jeden Fall.

Z.B. Kanns der P89C51ED2 von Philips für den Port5 (der wars glaub ich) 
nicht, der ED2 von Atmel kann es wiederum.

Wie du gesagt hast, Datenblatt lesen hilft auf jeden Fall weiter.

Prinzipiell lässt sich sagen, dass jedes SFR-Register, dessen Adresse 
auf x0 oder x8 endet, bitadressierbar ist, und dort liegen auch P0-P3 
des Standard-8052. Derivate MÜSSEN sich an diese Definition halten.
Wo andere Ports, also P4 - Pn abgelegt werden, bleibt dem Hersteller 
überlassen, meist liegen die aber auf einer bitadressierbaren Adresse.

Ralf

von johnny.m (Gast)


Lesenswert?

Wenn ich das richtig verstanden habe, willst Du den Code für den ATMega8 
mit CVAVR umschreiben. Das ist an sich kein Problem. CVAVR besitzt (im 
Unterschied zum AVR-GCC, den Joe vermutlich meinte) ebenfalls für die 
Bitadressierung eine vereinfachte Schreibweise. Da muss nix maskiert 
werden. Die Definitionen sind bereits in den entsprechenden 
Header-Dateien enthalten. Deshalb ist keine sbit-ähnliche Deklaration 
erforderlich. Portpins kann man in CVAVR einfach mit
1
PORTx.n = 0;
2
//oder
3
PORTx.n = 1;
ansprechen. Per #define kann man dem Pin auch einen "sprechenden" Namen 
verpassen:
1
#define LED0 PORTB.0
2
#define TASTER PORTC.7
Allerdings sind diese Schreibweisen (Makro-Erweiterungen) mit 
PORTx.PINNUMMER nicht ANSI-C-konform, sondern Compiler-spezifisch, was 
die Portabilität des Codes verhindert. Zur ANSI-C-konformen Schreibweise 
(Maskierung mit Shift-Operatoren) siehe AVR-GCC-Tutorial auf dieser 
Seite.

von dommes (Gast)


Lesenswert?

Hi!
Danke für eure Hilfe!
Was der Code in meinem Beispiel jetzt dann genau macht, habe ich aber 
leider immer noch nicht verstanden... :(
Wenn ihr zum Beispiel schreibt:

sbit Motor_Out = P1^0;
Motor_Out = 1;

Heisst das, dass in der ersten Zeile der Pin0 von Port1 Motor_Out 
genannt wird und in der 2ten Zeile auf 1 bzw. high gesetzt wird !?? Oder 
beschreibt die erste Zeile, dass ich den Pin 0 vom Port1 Motor_Out nenne 
und mit sbit setze?Woher weiß der Compiler aber eigentlich was P1^0 ist?

Was bedeutet das ganze dann in meinem Beispiel:

 sbit P1_0 = 0x90;

Ist 0x90 die Addresse von Port1 und Pin 0 wird gesetzt !??

Ich verstehs echt net, was muss ich tun...?

--->johnny.m: Wenn ich das richtig verstanden habe, willst Du den Code 
für den ATMega8 mit CVAVR umschreiben.

Ja genau das will ich!Ob der Code ANSI konform ist oder nicht ist für 
mich sekundär, hauptsache das Programm läuft und ich kanns per ISP auf 
meinen ATmega brennen.

von johnny.m (Gast)


Lesenswert?

> sbit Motor_Out = P1^0;
> Motor_Out = 1;

> Heisst das, dass in der ersten Zeile der Pin0 von Port1 Motor_Out
> genannt wird und in der 2ten Zeile auf 1 bzw. high gesetzt wird !??

Genau.

> Was bedeutet das ganze dann in meinem Beispiel:

>  sbit P1_0 = 0x90;

> Ist 0x90 die Addresse von Port1 und Pin 0 wird gesetzt !??

0x90 ist die Adresse des nullten Bits in P1. Wie schon von Joe 
angedeutet, ist ein Teil des I/O-Space im 8051 direkt bitadressierbar, 
d.h. mit bestimmten Anweisungen lassen sich einzelne Bits direkt 
ansprechen. Die sbit-Deklaration macht genau das.

von dommes (Gast)


Lesenswert?

Ah ok, jetzt hab ichs glaub ich gerafft!! Das S in Sbit bedeutet also 
nicht dass er ein bit Setzt.Sondern: Diesem Bit wird eine Addresse im 
Speicher zugewiesen, in der ich das bit dann auf 1 oder 0 setzen kann. 
Hier wäre es dann zum Beispiel: P1_0 = 1 für setzen des Pin0 von Port1.
Ist die Speicheraddresse 0x90 eine besondere Addresse oder einfach 
irgendeine freie?

Für mich würde das dann heißen, ich muss statt

 #define DATA P1_1 und #define SCK P1_0

einfach nur schreiben:

 #define DATA PortC.4 und #define SCK PortC.5

da beim ATmega8 die 2-wire-bus pins SDA = PC4 und der SCL = PC5 sind.

An diese Pins habe ich auch schon hardwaremäßig die data und die clk 
leitung meines Sensors angeschlossen...

So müsste es dann passen oder!?

guß thomas

von dommes (Gast)


Lesenswert?

hmm mist, CodeVision schluckt den Befehl:

 #define DATA PortC.4     net!

Das heisst dann das was Johnny.m geschrieben hat:
PORTx.n = 0;
//oder
PORTx.n = 1;

funktioniert mit Codevision nicht!?

Weiss jemand wies anders geht?

gruß thomas

von johnny.m (Gast)


Lesenswert?

Doch, das geht. C ist aber case-sensitiv, und es ist ein verdammt großer 
Unterschied, ob Du PORTC oder PortC schreibst. Außerdem muss natürlich 
die entsprechende Headerdatei eingebunden sein...

von johnny.m (Gast)


Lesenswert?

Ich sehe grad, dass es zumindest teilweise mein Fehler war: Ich hätte 
natürlich oben anstatt "PORTx.n" besser "PORTX.n" geschrieben. Dann wäre 
es eindeutiger gewesen...

von johnny.m (Gast)


Lesenswert?

Und noch was: Das "s" von "sbit" kommt von "Special Function". Es deutet 
darauf hin, dass es, anders als eine "normale" bit-Variable (die man bei 
Keil und im CVAVR ebenfalls zur Verfügung hat, was aber auch nicht 
ANSI-konform ist), ein Bit eines Special Function Registers ist.

von dommes (Gast)


Lesenswert?

alles klar, das geht jetzt! Vielen Dank @ johnny.m

Beitrag #7223873 wurde von einem Moderator gelöscht.
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.