Forum: Mikrocontroller und Digitale Elektronik mehrer bits in #define


von Johannes (Gast)


Lesenswert?

Hi,
wie kann ich mehrere bits in einem define zuordnen?
Also ich möchte gerne bestimmte einstellungen für verschiedene benutzer 
zuordnen. Dazu möchte ich verschiedene Bits in verschiednene Register 
zuordnen und dann mit HEX werten beschreiben (das ganze mit einem 
dsPIC30F in c)
z.B.
1
#define PRIO C1TX0SIDbits.SID10_6
damit kann ihc nun schreiben
1
PRIO = 0x05;
wie kann ich denn mehrere bits definieren? ist so etwas überhaupt 
möglich?

Johannes

von PittyJ (Gast)


Lesenswert?

define ist eine reiner Textersetzung. Letzendlich kannst du eine ganzen 
Roman hinter
#define KriegUndFrieden ....
setzen

von Witkatz :. (wit)


Lesenswert?

Mit #define ordnest du überhaupt keine bits zu. Mit #define wird dem 
Präprozessor ein Ersatztext für die symbolische Konstante PRIO 
mitgeteilt.

Deine Frage bezieht sich denke ich mal auf Bitfelder. Die Bitbreite wird 
in der Deklaration der Struktur definiert.
http://microchip.wikidot.com/tls2101:bit-fields

von Johannes (Gast)


Lesenswert?

ich glaube, es ist falsch verstanden worden.
ich möchte z.B. der variable PRIO
C1TX0SIDbits.SID10_6 und C1TX0SIDbits.SID5
zuweisen. Wie schreibe ich das denn?
1
#define PRIO C1TX0SIDbits.SID10_6 C1TX0SIDbits.SID5
das ergibt einen error.
zusammengesetzt geht auch nciht, mit komma geht auch nicht

von Johannes (Gast)


Lesenswert?

ja, das mit den bitfeldern wollte ich auch zuerst machen. Aber da hapert 
es, da ich nur bits vom selben Register beschreiben kann und ich auch 
zwei mal welche brauche, die bits von verschiednene Register benötigen.

Johannes

von Witkatz :. (wit)


Lesenswert?

Johannes schrieb:
> #define PRIO C1TX0SIDbits.SID10_6 C1TX0SIDbits.SID5
> das ergibt einen error.

Das #define ist so noch nicht fehlerhaft. PRIO wird vom Präprozessor zu 
"C1TX0SIDbits.SID10_6 C1TX0SIDbits.SID5" im Quelltext ersetzt, was dann 
zu Compilerfehlern führt.

Vielleicht kannst du das was du vor hast mit einem Makro lösen, nach dem 
Muster:
#define PRIO(parameter1, parameter2) ersatztext

: Bearbeitet durch User
von dummschwaetzer (Gast)


Lesenswert?

#define PRIO (C1TX0SIDbits.SID10_6+C1TX0SIDbits.SID5)

von Johannes (Gast)


Lesenswert?

ah, mit + hatte ich es auch versucht und mit () auch. aber beides 
zusammen hatte ich nicht porbiert. So funktioniert es.
Andere frage, wäre es denn möglich, ein Bitfeld zu erstellen, welches 
sich über zwei Register zieht? das wäre nämlich für mich eine schönere 
Variante.
schon einmal Dankeschön

von Witkatz :. (wit)


Lesenswert?

Johannes schrieb:
> mit + hatte ich es auch versucht und mit () auch

So sieht es für mich aus. Wildes Syntaxherumprobieren...
Ich würde es so machen:
1
#define PRIO(SID) {C1TX0SIDbits.SID10_6 = obere5BitsDerSIDschiebenUndMaskieren; C1TX0SIDbits.SID5_0 = untere6BitsDerSIDMaskieren;}

http://microchip.wikidot.com/tls2101:macros

: Bearbeitet durch User
von Johannes (Gast)


Lesenswert?

Witkatz :-) schrieb:
> So sieht es für mich aus. Wildes Syntaxherumprobieren

Ja, gebe ich auch zu

Witkatz :-) schrieb:
> ohne Verständnis
> von C Grundlagen.

meiner meinung nach nein, aber das sieht jeder anders

werde mir aber deinen Vorschlag auch noch mal angucken. Danke dafür

von Rolf Magnus (Gast)


Lesenswert?

Johannes schrieb:
> ich glaube, es ist falsch verstanden worden.
> ich möchte z.B. der variable PRIO
> C1TX0SIDbits.SID10_6 und C1TX0SIDbits.SID5
> zuweisen. Wie schreibe ich das denn?
> #define PRIO C1TX0SIDbits.SID10_6 C1TX0SIDbits.SID5
> das ergibt einen error.

Es wurde doch oben schon erwähnt: #define macht nichts weiter als eine 
ganz einfache Textersetzung. Überall, wo du PRIO hinschreibst, wird 
der Präprozessor das einsetzen, was in der define-Zeile rechts davon 
steht, sonst nichts.

Wenn du also schreibst:
1
#define PRIO C1TX0SIDbits.SID10_6 C1TX0SIDbits.SID5
und dann irgendwo:
1
PRIO = 0x05;

dann hättest du an der zweiten Stelle einfach stattdessen auch schreiben 
können:
1
C1TX0SIDbits.SID10_6 C1TX0SIDbits.SID5 = 0x05;

Warum das nicht geht, sollte klar sein.

von Rolf Magnus (Gast)


Lesenswert?

Johannes schrieb:
> ah, mit + hatte ich es auch versucht und mit () auch. aber beides
> zusammen hatte ich nicht porbiert. So funktioniert es.

Ich sehe eigentlich nicht, wie das funktionieren soll, denn dann würde 
die obige Zeile mit der Zuweisung vom Präprozessor ersetzt durch:
1
(C1TX0SIDbits.SID10_6+C1TX0SIDbits.SID5) = 0x05;
was noch weniger Sinn ergibt, da das Ergebnis einer Addition nicht links 
von einer Zuweisung stehen darf.

von Johannes (Gast)


Lesenswert?

Ja, habe es mit dem #define sein gelassen und funktionen geschrieben.
trotzdem danke für eure antworten

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.