Forum: Compiler & IDEs Grundsatzfrage zur BIT-Manipulation


von UBoot-Stocki (Gast)


Lesenswert?

Hi,

ich arbeite momentan an einer Rolladensteuerung. Mein Baustein soll für 
6 Rolläden 12 Eingänge und 12 Ausgänge haben.

Die Hauptaufgabe im Programm wird es sein, die 12 Eingangs-BITs zu 
verknüpfen und das ganze zeitabhängig (Doppelklick etc.) an die 12 
Ausgangs-BITs zu übergeben.

Kurzum es wird eine Hardcore-zeitgesteuerte-BIT-Pfriemelei !

Wie geht man die BIT-Manipuliation den in C am Besten an?

Ich könnte z.B. mit Unions/Strukturen arbeiten.
Ich habe schon erste Erfolge mit DEFINES für jedes BIT
Ich könnte aber auch für jedes "BIT" eine eigene Funktion schreiben
Oder mit verketteten Listen ?
Oder? Oder? Oder? ...

Wer kann mir einen Tipp geben, wie Profis das machen ? Was ist in C der 
eleganteste Weg ?

Gruß

Andreas

von Peter P. (bonsaibaum)


Lesenswert?

Hallo Andreas,

ich bin auch gerade dabei sowas zu proggen. Meine halt allerdings 'nur' 
5 Rolläden zu steuern. Ich werde das ganze über struct / union machen, 
da es für mich einfacher zu behirnen ist.

lg
    Peter

Ps: wie machst du die Anbindung der Ein-/Ausgänge ? (Schieberegs, 
direkt, ...)

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

ich habe in Summe 16 Rolläden. Diese werden von 3 Steuerungen in drei 
Stockwerken bedient. Die Steuerungen werden über einen "Bus" verbunden 
um z.B. mit einem Tastendruck alle Rölläden im ganzen Haus zu 
schliessen.

Jede Steuerung hat einen Mega16. Drei Ports werden für die Rolläden 
benutzt. Ich mache nichts mit Schieberegistern etc...

Gruß

Andreas

von Peter D. (peda)


Lesenswert?

Das hier ist ideal für sowas:

Beitrag "Wartezeiten effektiv (Scheduler)"


Peter

von KoF (Gast)


Lesenswert?

Das kann dir eventuell helfen.
Massenhaft Makros zur Bitmanipulation wie in einer SPS.
Inkl. Verzögerungen und Co

Beitrag "SPS Betriebssytem"

von speedcat (Gast)


Lesenswert?

hallo,

in meinem derzeitigen projekt brauche ich auch ne menge bits um 
software-flags zu realisieren. ich hab mir einfach ein paar
kleine funktionen geschrieben die in einer globalen variablen die
bits setzten, lesen und löschen können. die nummer des jeweiligen bits
wird per #define festgelegt, dann hat's einen schönen namen. in den
funktionen läuft dann alles mit |= oder &=~ und (1<<bitnummer). ist
bestimmt nicht die schnellste möglichkeit, läuft aber zuverlässig.
(achja, und bei mehr als 16 bit sollte sowas wie (uint_32t) vor die 
eins, zumindest bei meinem avrgcc.

gruß,
speedcat

von KoF (Gast)


Lesenswert?

Seh dir dazu wirklich mal die SPS-Makros für AVRs an (siehe Link weiter 
oben) . Die sollten dir erheblich bei deinen Aufgaben helfen.

von Falk B. (falk)


Lesenswert?

@ UBoot-Stocki (Gast)

>ich arbeite momentan an einer Rolladensteuerung. Mein Baustein soll für
>6 Rolläden 12 Eingänge und 12 Ausgänge haben.

>Die Hauptaufgabe im Programm wird es sein, die 12 Eingangs-BITs zu
>verknüpfen und das ganze zeitabhängig (Doppelklick etc.) an die 12
>Ausgangs-BITs zu übergeben.

>Wie geht man die BIT-Manipuliation den in C am Besten an?

Für solche eher zeitunkritischen Sachen würde ich mit einfachen 
Funktionen arbeiten, das ist dann auch im Quelltext sehr intuitiv. In 
einer globalen Variable werden dann die Flags gespeichert.
1
uint16_t flags;
2
3
void set_flag(uint8_t bitnumber) {
4
  flags |= (1 << bitnumber);
5
}
6
7
void clear_flag(uint8_t bitnumber) {
8
  flags &= ~(1 << bitnumber);
9
}

Wenn mehr als 16 Bit benötigt werden muss die 1 als 1L geschrieben 
werden (böse Stolperfalle).

>Ich könnte aber auch für jedes "BIT" eine eigene Funktion schreiben

Naaa, wozu denn das?

>Was ist in C der eleganteste Weg ?

Willst du einen Religionskrieg auslösen? ;-)

MFG
Falk

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

Erstmal vielen Dank für die vielen Infos.

@Peter: Ja, so ein Scheduler macht Sinn. Das werde ich auch so ähnlich 
lösen

@KoF: So habe ich mir das mit den defines auch gedacht. Nicht schlecht, 
was Du da gemacht hast ...

@Falk: Wie Bits gesetzt oder gelöscht werden ist mir klar ;-)
Der Gedanke mit den Funktionen ist folgender: Für jeden Rolladen sind ja 
(wenige) definierte Dinge zu tun. Ich könnten nun die Logik, die ich 
normalerweise mit BIT-Verknüpfungen abbilden würde, in eine 
"Rolladenfunktion" stecken und diese dann einfach Aufrufen. Dazu müsste 
ich aber dann (wahrscheinlich) die Funktion 6x Kopieren und die 
BIT-Positionen anpassen was (auch ohne Krieg) unelegant wäre ...

Gruß

Andreas

von Falk B. (falk)


Lesenswert?

@  UBoot-Stocki (Gast)

>normalerweise mit BIT-Verknüpfungen abbilden würde, in eine
>"Rolladenfunktion" stecken und diese dann einfach Aufrufen.

Und warum tust das nicht einfach?

> Dazu müsste ich aber dann (wahrscheinlich) die Funktion 6x Kopieren
> und die BIT-Positionen anpassen was (auch ohne Krieg) unelegant wäre ...

???
Warum übergibst du die Position nicht einfach als Parameter?

MFG
Falk

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.