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
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, ...)
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
Das kann dir eventuell helfen. Massenhaft Makros zur Bitmanipulation wie in einer SPS. Inkl. Verzögerungen und Co Beitrag "SPS Betriebssytem"
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
Seh dir dazu wirklich mal die SPS-Makros für AVRs an (siehe Link weiter oben) . Die sollten dir erheblich bei deinen Aufgaben helfen.
@ 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
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.