mikrocontroller.net

Forum: Compiler & IDEs Grundsatzfrage zur BIT-Manipulation


Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter P. (bonsaibaum)
Datum:

Bewertung
0 lesenswert
nicht 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, ...)

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier ist ideal für sowas:

Beitrag "Wartezeiten effektiv (Scheduler)"


Peter

Autor: KoF (Gast)
Datum:

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

Beitrag "SPS Betriebssytem"

Autor: speedcat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
uint16_t flags;

void set_flag(uint8_t bitnumber) {
  flags |= (1 << bitnumber);
}

void clear_flag(uint8_t bitnumber) {
  flags &= ~(1 << bitnumber);
}

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

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.