Ansicht:   

#159394

frenchcancan [Gast]

04.09.2009, 11:11:43

C programmierung, problem mit input bitmaske (pc.coding)

ich habe folgendes Problem zu lösen.
Ein CProgramm läuft auf eine Borasd mit digitalen Eingängen (inputs) und Ausgängen.
Es gibt eine Reihe von 8 digitalen inputs, die auf 0 oder auf 1 sind. Pro Input habe ich ein bit:

char input_zustand:


0000 0000: alle input auf 0

1111 1111: alle inputs auf 1

0001 0001: erster und vierter input sind auf 1.


Ich muss ein Programm laufen lassen, aber nur, wenn ein bestimmter Zustand der inputs gegeben ist. Welcher Zustand das ist, wird vom Benutzer in einer Maske festgelegt.

und zwar könnte er zu Beispiel eine 1 eingeben, wenn der Zustand 1 sein muss
Eine 0, wenn der Zustand 0 sein muss. und eine 2, wenn der Zustand egal ist.

Allerdings komme ich mit dieser lösung dann nicht mehr mit einer bitmaske aus, weil ich nicht mehr 0 oder 1 habe. ich muss wohl ein array[8] nehmen.

Ich hätte gern soetwas gehabt:

if (input_zustand) & (input_maske)
	programm_laufen_lassen();
else
	meldung_voraussetzungen nicht erfüllt();



Aber mit einer Maske aus 0,1 udn 2 geht es natürlich nicht.
Ich kann natürlich in einer Schleife prüfen lassen, ob input_maske[x] und (input_zustand&2^x) übereinstimmen, aber vielleicht geht es eine elegantere Lösung?
Hat jemand eine Idee, wie man es am schlauesten machen könnte?

Vielen Dank im Voraus, falls jemand eine Idee hat,

frenchcancan

#159402

Schneidbrenner [Gast]

04.09.2009, 13:28:34

@ frenchcancan

C programmierung, problem mit input bitmaske

Leider verstehe ich nicht so ganz, worauf du hinauswillst.

Jede Bitmaske kannst du als eine vorzeichenlose Integer-Zahl (unsigned) ansehen und behandeln. Umgekehrt enthält jeder Integer-Wert zugleich ein Bitmuster.

Bitmuster 0000 = Zahlenwert 0
Bitmuster 0001 = Zahlenwert 1
Bitmuster 0010 = Zahlenwert 2
Bitmuster 0011 = Zahlenwert 3
Bitmuster 0100 = Zahlenwert 4
usw.

So entspricht Bitmuster 0001.0001 dem Zahlenwert 9.

Ob zwei Bitmasken übereinstimmen, kannst du somit einfach mit dem Operator == auswerten:

if ((unsigned) bitmaske_1 == (unsigned) bitmaske_2) ...

#159512

Solderdot

05.09.2009, 09:06:42

@ frenchcancan

C programmierung, problem mit input bitmaske

Wenn ich\'s recht verstehe, gibt der Kunde 2 Dinge vor:
1) ob ein Bit relevant ist
2) Den Zustand eines relevanten bits

Das kannst Du mit 2 Bitmasken lösen.
In der ersten setzt Du jedes Bit, welches relevant ist, in der zweiten, ob das Bit 1 oder 0 sein muss. In der zweiten Maske setzt Du jedes Bit, das nicht relevant ist, einfach auf 0.

Dann verundest Du den aktuellen Zustand am Port mit der Relevanz-Maske und vergleichst das Ergebnis mit der Zustandsmaske.

Beispiel:

Kunde Sagt, bei Bit0=0, Bit1=1 soll Aktion A ausgeführt werden, Bit 2 bis 7 egal. Dann sieht Deine Relevanz-Maske so aus: 0x03, und die Zustandsmaske hat den Wert 0x02.

Wenn an Deinem Port nun 0xFF anliegt, ist das Ergebnbis der Verundung 0x03, und da das nicht 0x02 ist, wird die Aktion nicht ausgeführt.

Wenn am Port hingegen 0xFE anliegt, ist das Ergebnbis der Verundung 0x02, und Deine Aktion wird ausgeführt.

Gruß
-- Solderdot

#159926

frenchcancan [Gast]

08.09.2009, 08:30:36

@ Solderdot

Danke schön an beide!

Ich werde es mit 2 bitmasken machen
maske1: muss an sein
maske2: muss aus sein.

und durch die Kombination der beiden weiß ich, welche egal sind.

Vielen dank für die Hilfe
frenchcancan

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz