Byte per #define vorinitialisieren

OP #3301246
Moin

Habe hier 2 RGB LEDs und wollte diese über ein Define mit einer Farbe 
ansteuern.
Da ich es übersichtlicher gestalten wollte, habe ich es jeweils mit 
diesen beiden Wegen probiert:
1
#define LED_1 (1<<P4OUT3)|(0<<P4OUT2)|(1<<P4OUT1)
2
#define LED_2 ~P4OUT6|P4OUT5|P4OUT4

Doch leider ist bei der Ausgabe auf
1
LED_PORT = (LED_1 | LED_2);
der komplette Port auf 0xFF

Wenn ich die defines nun mit #define LED_1 0x0A und 0x30 mache, 
funktioniert es.

Ich dachte ich hätte Bitmanipulation verstanden...

Danke für eure Hilfe! :)
OP #3301271
Grundlagen sind ja nicht unbekannt, das Verständnis ergibt sich bei mir 
aber besser durch Anwendung.

Ok und warum funkioniert das bei LED_1 nicht?
Es sollte ja dann 0b00001010 sein.

2 Varianten, weil ich ausprobieren möchte was geht und was nicht, auch 
um meinen Code übersichtlicher zu machen.
Ports usw. alles richtig. Leuchtet ja ;)
#3301281
1.) NOT bindet staerker als UND bzw. ODER
2.) UND bindet staerker als ODER
3.) im Zweifel Klammern verwenden!

(4.) MAKROS MAKROS MAKROS!)

1 und 2 sind wie Punkt vor Strich - nur fuer Logik

vermutlich willst du folgendes:
1
#define LED_1 ((1<<P4OUT3)|(0<<P4OUT2)|(1<<P4OUT1))
2
#define LED_2 (~((1<<P4OUT6)|(1<<P4OUT5)|(1<<P4OUT4)))

bzw.:
1
#define LED_1 (_BV(P4OUT3)|_BV(P4OUT1))
2
#define LED_2 (~(_BV(P4OUT6)|_BV(P4OUT5)|_BV(P4OUT4)))

MfG
OP #3301582
Muss noch mal nachhaken, denn im Moment ist es so dass
1
LED_PORT = (0<<P4OUT3) | (0<<P4OUT2) | (1<<P4OUT1);
eine andere Farbe als
1
LED_PORT = 0x02;
ergibt.

Meiner Meinung nach müsste doch beim 1. Ausdruck 0000 0010 rauskommen, 
aber leider ist es 0000 0100.

Was ist an der Bitverschiebung falsch?

Weil in der Chipspezifischen Headerdatei ist das ja so korrekt 
angegeben:
1
enum {
2
  P4OUT0          = 0x0001,
3
  P4OUT1          = 0x0002,
4
  P4OUT2          = 0x0004,
5
  P4OUT3          = 0x0008,
6
  P4OUT4          = 0x0010,
7
  P4OUT5          = 0x0020,
8
  P4OUT6          = 0x0040,
9
  P4OUT7          = 0x0080
10
};
OP #3301641
Na das mit dem enum ist direkt aus der Headerdatei vom MSP zitiert.

Aha, also multiplizieren anstatt schieben.
Hatte das bloß in meinem Kopf verdreht, weil in einer anderen 
Headerdatei
BIT0, BIT1 usw. direkt mit deren Zahlenwerten definiert wurden.
Und so hab ich das einfach "portiert"...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.