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.
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.
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
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
@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
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.
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.
> 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.
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
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
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...
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...
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.