Forum: Mikrocontroller und Digitale Elektronik Zusammenfassen von Bits in IAR für AVR


von Jhonny Stupid (Gast)


Lesenswert?

Hallo,

folgendes Problem:

Es sind an einem AVR über mehrere Ports verteilt LEDs angeschlossen. Die 
LEDs bilden jedoch physikalisch eine Balkenanzeige. Um den Code auf 
verschiedenen Hardware'en an denen die LEDs der Balkenanzeige an 
unterschiedlichen Portpins angeschlossen sind leichter anpassen zu 
können, hab ich mir folgendes gedacht.

Setzen mehrere LEDs mit einem Befehl:
1
Balkenanzeige = 0x83;

Setzen der äußerst rechten LED (wobei die anderen unberührt bleiben):
1
Balkenanzeige.LED0 = 1;
oder der 5ten LED:
1
Balkenanzeige.LED4 = 1;

In einem Headerfile sollen die einzelnen LEDs bestimmten Ports 
zugewiesen werden, so das beim Portieren nur die Portpin Zuordung 
geändert werden muss.
Portbits werden im IAR std.mäßig z.B. so gesetzt
1
PORTE.Bit0 = 1;

Was ich nun bräuchte wäre eben eine struct, union, oder sowas welche 
eben die oben genannten Bedingungen erfüllt...

Danke.

von Karl H. (kbuchegg)


Lesenswert?

Jhonny Stupid schrieb:

> Was ich nun bräuchte wäre eben eine struct, union, oder sowas welche
> eben die oben genannten Bedingungen erfüllt...

Die gibt es nicht.

von Jhonny Stupid (Gast)


Lesenswert?

Wie kann ich denn dann sowas elegant lösen?

von Karl H. (kbuchegg)


Lesenswert?

In C?

Ich fürchte da wird dir nichts anderes übrig bleiben, als jede Led 
einzeln zu behandeln. Aber nicht mit der IAR member Syntax, sondern mit 
der kanonischen


    PORTx |= ( 1 << LEDNR );    // setzen
    PORTx &= ~( 1 << LEDNR );    // löschen

von Jhonny Stupid (Gast)


Lesenswert?

Ja, das hab ich auch so getan. ABER das hat zur Folge das das Setzen der 
LED Nr.8 eben 8 Takte braucht, das der LED Nr.1 nur 2... Aufgrund 
dessen, daß der Compiler eben erst die 1 um soundsoviel (je nach Stelle 
im Register) schiebt.

Switch Case wäre noch ne Möglichkeit... finde ich aber auch etwas 
unelegant.

Kann man nicht irgendwie ein Pointerarray erstellen, welches auf die 
einzelnen Bits definiert wird?

in der Art:
1
*Bit0 = PORTC.BIT0;

???

von Schiko (Gast)


Lesenswert?

Jhonny Stupid schrieb:
> Setzen mehrere LEDs mit einem Befehl:Balkenanzeige = 0x83;

Wenn es feste Werte(Zeichen) sind, wie wärs mit verschiedenen 
EEPROM-Einträgen je Hardware?
Einmalig auslesen und gut

Schiko

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.