PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitmuster auf verschiedene Ports aufteilen



Arkon
26.10.2011, 11:31
Moin,

ich habe mal wieder Frage an euch:

Ich möchte ein "binäres Muster" aus einem Array auf Pins verschiedener Ports ausgeben. Vorstellen kann man sich das, als würde ich an jedem Pin eine LED hängen, die ich in dem gewünschten Muster leuchten lassen möchte.

Als Bsp sei:

muster[0] = 10101
Ausgänge liegen auf PB1,PB2,PB3,PC1,PC2,PC3

Die Belegung der Pins ließe sich nur mit größerem Aufwand ändern, wesshalb ich auf eine Softwarelösung hoffe.

Gruß
Christopher

-schumi-
26.10.2011, 18:17
PORTB = PORTB & 0b11110001; // PB1/2/3 ausschalten
PORTC = PORTC & 0b11110001; // PC1/2/3 ausschalten


if (muster[0] & 1) // Falls Bit 0 von muster[0] gesetzt ist...
PORTC = PORTC | 0b00001000; // ... PC3 einschalten
if (muster[0] & 2) // Falls Bit 1 von muster[0] gesetzt ist...
PORTC = PORTC | 0b00000100; // ... PC2 einschalten
if (muster[0] & 4) // usw. usf.
PORTC = PORTC | 0b00000010;
if (muster[0] & 8)
PORTB = PORTB | 0b00001000;
if (muster[0] & 16)
PORTB = PORTB | 0b00000100;
if (muster[0] & 32)
PORTB = PORTB | 0b00000010;


Zwar nicht allzu elegant, sollte aber funktionieren (habs jetzt nicht probekompiliert)

Gruß

[EDIT]
Das hier sollte auch funktionieren:


PORTB = PORTB & 0b11110001; // PB1/2/3 ausschalten
PORTC = PORTC & 0b11110001; // PC1/2/3 ausschalten

PORTC = PORTC | (0b00001000*(muster[0] & 1)) | (0b00000100*((muster[0] & 2)/2)) | (0b00000010*((muster[0] & 4)/4));
PORTB = PORTB | (0b00001000*((muster[0] & 8)/8)) | (0b00000100*((muster[0] & 16)/16)) | (0b00000010*((muster[0] & 32)/32));

Bin mir aber nicht ganz sicher, obs wirklich so hinhaut...

PicNick
27.10.2011, 09:56
Vergesst aber nicht, dass die Port-Pins auch ev. auf Null gesetzt werden müssen.
a la
PORTC &= ~0b00001000

radbruch
27.10.2011, 11:19
Oder so vielleicht:


uint8_t muster=0b101010;

PORTB = PORTB & 0b11110001; // PB1/2/3 ausschalten
PORTC = PORTC & 0b11110001; // PC1/2/3 ausschalten

PORTC = PORTC | (muster & 0b111)<<1;
PORTB = PORTB | (muster & 0b111000)>>2;

Arkon
27.10.2011, 20:53
Danke für die Tipps. Sobald ich Zeit und die betreffende Hardware wieder zur Verfügung habe werde ich die Vorschläge testen.