Forum: Mikrocontroller und Digitale Elektronik Bits richtig setzen


von Paulchen Panther (Gast)


Lesenswert?

Hallo,

ich habe hier ein kleines Problem, bei dem ich noch nicht so recht weis 
wie ich es am besten angehen soll um es sicher zu kriegen. Ich habe 
mehrere Sensoren, und versuche aus den Informationen die diese liefern 
eindeutige Bereiche zu definieren.

Mein Programmkonstrukt sieht ungefähr so aus, nur jetzt mehrmals 
hintereinander, wobei sich Bit1 natürlich dementsprechend in Bit2 Bit3 
usw. ändert.

if ( (Bedingung1 == True) && (Bedingung2 == True)

&&

if (Bedingung3 == True) && (Bedingung4 == True)

&&

if (Bedingung5 == True) && (Bedingung6 == True) )

Bit1=TRUE;


Es darf natürlich immer nur 1 Bit (1 Bereich) tatsächlich true sein, 
damit das ganze Konstrukt eindeutig ist.

Ich möchte also eine Überwachung mit rein bauen, daß tatsächlich nur 
immer eines true ist. Wenn keines True ist habe ich einen Zustand 
vergessen (Fehler) und wenn mehr als eines True ist habe ich 
zweideutigkeiten (Fehler).

Mein Gedankenproblem ist nun das, daß bei einem Wechsel von einem 
Bereich in den anderen das eine zurückgesetzt werden muß und das andere 
gesetzt werden muß, so daß es niemals möglich ist, daß zwei Bits 
(Bitarray) gesetzt sind.

Wie würdet Ihr das machen ?

Vielen Dank für ein paar Denkanstöße

von Uwe (de0508)


Lesenswert?

Hallo,

Welche Sprache soll das sein?

Ich verstehe Dein Problem nicht, mach doch bitte eine Logiktabelle, dann 
sieht man schneller was voneinander abhängt.

ok ?

von Noname (Gast)


Lesenswert?

Du drückst Dich bedauerlicherweise ein wenig unglücklich aus. Dazu noch 
Deinen ganzen Beitrag hindurch, dass kein unpassender Ausdruck durch 
einen anderen passenden so ergänzt wird das es zusammen ein Ganzes 
ergibt.

Ich werde der Reihe nach durch Dein Post gehen und an einer gewissen 
Stelle abbrechen, damit Du dort meine Annahmen bestätigen oder ihnen 
widersprechen und Informationen nachreichen kannst.

>Ich habe mehrere Sensoren, und versuche aus den Informationen die diese >liefern 
eindeutige Bereiche zu definieren.

So die Sensoren nicht Informationen über Bereiche (welcher Art auch 
immer) liefern; das wäre extrem ungewöhnlich. Man definiert auch nicht 
aus etwas.

Sensoren liefern Werte. Diese können, diskrete oder kontinuierliche, 
numerische oder nicht-numerische Werte sein. Werte für die sich ein 
Maximum und ein Minimum angeben lässt oder auch nicht.

Wenn ich versuche Dich zu verstehen, dann lautet Dein Satz eigentlich 
so:

"Ich habe mehrer Sensoren, die numerische Werte liefern. Ich möchte 
Bedingungen formulieren, die sich auf Bereiche dieser Werte beziehen".

Ist das so korrekt?

Wenn das so ist, dann versuche doch mal ausgehend von diesem Punkt und 
mit der Terminologie Deine Frage neu zu formulieren.

Ein Hinweis noch: Die Frage nach der Programmiersprache hört sich 
vieilleicht etwas polemisch an, aber zumindest ist das kein "C", was Du 
da geschrieben hast.

Vielleicht wäre es auch gut etwas über Deine Vorkenntnisse zu wissen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paulchen Panther schrieb:
> Mein Programmkonstrukt sieht ungefähr so aus,
Dann zeig doch einfach mal dein )ganzes) Programm und nicht 
irgedwelche willkürlichen Fragemente. Denn oft liegt der Fehler ganz wo 
anders, als der vermutet, der ihn gemacht hat...

> nur jetzt mehrmals hintereinander, wobei sich Bit1 natürlich
> dementsprechend in Bit2 Bit3 usw. ändert.
Und das hört sich wie eine längere Version des Wortes "umständlich" 
an...

von Noname (Gast)


Lesenswert?

Also, ich fabuliere jetzt einfach mal ins Blaue:

Du hast einen Sensor, der numerische Werte liefert. Sagen wir im 
Intervall [0, 100].

Du hast mehrere Teilintervalle dieses ersten Intervalls, die ich mit 
Buchstaben kennzeichne.

a: [0, 10]
b: [11, 50]
c: [51, 100]

Du willst ein Programm, eine Funktion, einen Ausdruck, der/die/das in 
einer Variable geeigneter Grösse je ein Bit, das einem der genannten 
Bereiche entspricht setzt. Besonderen Wert legst Du darauf, das 
sichergestellt ist, das nie mehrere Bits gleichzeitig gesetzt sind, weil 
das ja bedeuten würde das ein Wert gleichzeitig in mehreren Bereichen 
ist.
1
uint8_t x = HoleSensorWert ();
2
uint8_t Bereichsbits = 0;
3
4
if (x < 11)
5
   Bereichsbits = 1;
6
else if (x < 51)
7
   Bereichsbits = 2;
8
else if (x < 101)
9
   Bereichsbits = 4;
10
else
11
  FehlerBehandlung ();

Was hälst Du davon?

von Paulchen Panther (Gast)


Lesenswert?

Ja,

so ist das gedacht. Ist dann wohl doch verständlich gewesen :)


Die Fehlerbehandlung lagere ich in eine Funktion aus. Diese Funktion 
macht nach Abarbeitung der ganzen if-Konstrukte folgendes:

Sie hüpft einmal durch das ganze Bit-Array (welche ja die Zustände 
signalisieren) und gibt einen Fehler aus, wenn entweder mehr als ein 
Element eine 1 führt oder kein Element eine 1 führt (Zustand wurde 
vergessen).

So weit so schlecht.

Das setzen der Bits (welches eindeutig sein muß) ist aber noch ein 
kleines Problem.

In einer SPS wäre das einfacher zu bewerkstelligen. Dort habe ich ja den 
Zuweisungsoperator "=". In C jedoch weise ich einer Bitvariablen 
entweder ein TRUE oder ein FALSE zu und setze somit die Variable. 
Deshalb muß ich sie irgendwann auch mal wieder rücksetzen.

Ich frage mich gerade wie ich das wohl am schoensten mache.

Angenommen das erste If-Konstrukt lieferte eine 1 (Ich befinde mich also 
innerhalb bestimmter Grenzen), dann setze ich das entsprechende Bit im 
Bit-Array.


Anschließend läuft der Rest der If-Konstrukte durch, welche (im 
Idealfall) feststellen, daß deren Bereiche nicht tangiert werden. 
Deshalb schreiben sie auch nichts in das Bitarray.

Zum Schluß prüft eine Schleife ob tatsächlich nur ein Zustand aktiv ist.

Wenn aber jetzt das erste If-Konstrukt NICHT MEHR erfüllt ist, sondern 
das zweite, dann muß ich eben erst das Bit der ersten 
Bereichsüberwachung zurücksetzen bevor ich das Bit für das zweite 
Konstrukt wieder setze.

Irgendwie fällt mir nichts gutes ein, wie ich das "schön" machen könnte.

von Ben j. (scarab)


Lesenswert?

Wenn du bei einer 8Bit-Variable (entspricht logischerweise 8 Bereichen) 
die Bits so setzt:
1
Bereichsbits = 1<<0;
2
Bereichsbits = 1<<1;
3
Bereichsbits = 1<<2;
4
Bereichsbits = 1<<3;
5
Bereichsbits = 1<<4;
6
Bereichsbits = 1<<5;
7
Bereichsbits = 1<<6;
8
Bereichsbits = 1<<7;

werden die anderen Bits gelöscht.
(Du kannst wenn du das willst auch 1<<5 selbst Auflösen in 32 oder 0x20 
usw.)

von Noname (Gast)


Lesenswert?

>Ist dann wohl doch verständlich gewesen  :)
Ich habe keine Ahnung wie Du darauf kommst. Ich schrieb ja, das ich ins 
Blaue rate und nicht, das ich Dich wie beschrieben verstanden hätte.
Was es da zu grinsen gibt, weiss ich auch nicht.

Ich fühle mich eher verarscht muss ich sagen. Da mache ich mir die Mühe, 
(was ich eigentlich sehr, sehr, sehr selten mache) und rate und meine 
Fähigkeit richtig zu raten hälst DU für Deine Fähigkeit dich korrekt 
auszudrücken. Ein Irrtum.

Na dann viel Erfolg.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Und die Frage, um welche Programmiersprache es sich bei dem 
ursprünglichen Codeschnippsel handeln soll, wurde auch noch nicht 
beantwortet. Es handelt sich auf jeden Fall nicht um C.

von Paulchen Panther (Gast)


Lesenswert?

Noname schrieb:
>>Ist dann wohl doch verständlich gewesen  :)
> Ich habe keine Ahnung wie Du darauf kommst. Ich schrieb ja, das ich ins
> Blaue rate und nicht, das ich Dich wie beschrieben verstanden hätte.
> Was es da zu grinsen gibt, weiss ich auch nicht.
>
> Ich fühle mich eher verarscht muss ich sagen. Da mache ich mir die Mühe,
> (was ich eigentlich sehr, sehr, sehr selten mache) und rate und meine
> Fähigkeit richtig zu raten hälst DU für Deine Fähigkeit dich korrekt
> auszudrücken. Ein Irrtum.
>
> Na dann viel Erfolg.


Wenn man deswegen :) so beileidigt sein muß wie du, dann bitteschön. Ich 
habe das jedenfalls nicht böse gemeint.

Du wirst im Leben noch oft beleidigt sein müssen wenn schon zwei 
ASCII-Charakter dazu ausreichen.

von Referenz (Gast)


Lesenswert?

Benjamin F. schrieb:
> Wenn du bei einer 8Bit-Variable (entspricht logischerweise 8 Bereichen)
> die Bits so setzt:
> Bereichsbits = 1<<0;
> Bereichsbits = 1<<1;
> Bereichsbits = 1<<2;
> Bereichsbits = 1<<3;

warum nicht
1
#tpedef
2
struct Bitchen {
3
   uchar B1 : 1;
4
   uchar B2 : 1;
5
...
6
   uchar B8 : 1;
7
};
8
9
union {
10
   Bitchen bits;
11
   uchar all;
12
} bitvar;
13
14
bitvar.B1 = Sensor1;
15
bitvar.B2 = Sensor2;
16
...
17
if (bitvar.all == 0)
18
...
habe jetzt keinen compiler laufen lassen. Aber so ungefähr sollte es 
gehen.

von Paulchen Panther (Gast)


Lesenswert?

In einer Union haben ja alle Elemente den gleichen Offset (wie 
übereinandergelegte Folienstreifen die am linken Ende (oder Rechten) je 
nach Ansicht bündig sind)

Du legst sozusagen also eine 8-bit lange Variable über 8 Einzelne Bits 
und fragst dann ob diese Variable was "überall Nullen sieht"

Habe ich das so richtig verstanden ?

von Noname (Gast)


Lesenswert?

>Wenn man deswegen :) so beileidigt sein muß wie du, dann bitteschön. Ich
>habe das jedenfalls nicht böse gemeint.

Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht" 
fühle.
Dazwischen kennst Du keinen Unterschied?

Das ist der Punkt. Du setzt die Worte ohne Besinnung und Verständnis und 
interpretierst sie genauso.

Mir ist absolut schleierhaft wie Du ohne Konvention über die Bedeutung 
resp. Interpretation von Worten überhaupt sinnvoll programmieren, 
geschweige denn mit Deinen Mitmenschen kommunizieren willst.

von Paulchen Panther (Gast)


Lesenswert?

Andreas Schweigstill schrieb:
> Und die Frage, um welche Programmiersprache es sich bei dem
> ursprünglichen Codeschnippsel handeln soll, wurde auch noch nicht
> beantwortet. Es handelt sich auf jeden Fall nicht um C.

Doch es handelt sich um C. Sollte diese Aussage jetzt für weitere 
Spitzfindigkeiten deinerseits taugen, wie bei "NoName" dann bitte ich 
einfach mal davon Abstand zu nehmen. Das hilft nämlich keinem weiter. 
Andere sehen anscheinend daß es sich um darum handelt.

Ich habe nämlich hier kein Problem mit C, sondern bin auf der Suche nach 
einer Idee, oder einem Algorithmus wenn du so willst.

von Paulchen Panther (Gast)


Lesenswert?

Noname schrieb:
> Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht"
> fühle.
> Dazwischen kennst Du keinen Unterschied?
>
> Das ist der Punkt. Du setzt die Worte ohne Besinnung und Verständnis und
> interpretierst sie genauso.
>
> Mir ist absolut schleierhaft wie Du ohne Konvention über die Bedeutung
> resp. Interpretation von Worten überhaupt sinnvoll programmieren,
> geschweige denn mit Deinen Mitmenschen kommunizieren willst.

Also nochmal:

Ich habe die Frage nicht gestellt um mit notorisch beleidigten Menschen 
eine Diskussion über die Interpretation von ASCII-Charaktern zu 
beginnen. Sei einfach beleidigt und kümmere dich nicht weiter um die 
Frage oder höre auf in Foren zu lesen wenn dich ein :) schon aus der 
Fassung bringt.

von Referenz (Gast)


Lesenswert?

Paulchen Panther schrieb:
> Habe ich das so richtig verstanden ?

jau, der Debugger ist dein Freund und wird dir helfen.

von Noname (Gast)


Lesenswert?

>Ich habe die Frage nicht gestellt um mit notorisch beleidigten Menschen
>eine Diskussion über die Interpretation von ASCII-Charaktern zu
>beginnen. Sei einfach beleidigt und kümmere dich nicht weiter um die
>Frage oder höre auf in Foren zu lesen wenn dich ein :) schon aus der
>Fassung bringt.

Ich glaub wir lassen das wirklich.
Also viel Glück noch. Du wirst es brauchen.

von Paulchen Panther (Gast)


Lesenswert?

Du auch :)

von Freund von Freud (Gast)


Lesenswert?

Noname schrieb:
> Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht"
> fühle.
> Dazwischen kennst Du keinen Unterschied?
> ...

Schau mal dort vorbei, dort zeigt man Verständnis. ;-)

von Freund von Freud (Gast)


Lesenswert?

Freund von Freud schrieb:
> Noname schrieb:
>> Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht"
>> fühle.
>> Dazwischen kennst Du keinen Unterschied?
>> ...
>
> Schau mal dort vorbei, dort zeigt man Verständnis. ;-)
>
>
>
>     Beitrag melden | Bearbeiten | Löschen |

Mist. link vergessen:
http://www.psychologieforum.de/

von Paulchen Panther (Gast)


Lesenswert?

:)

von Noname (Gast)


Lesenswert?

Meine Güte. Wie kreativ.

von Paulchen Panther (Gast)


Lesenswert?

if( (gefuehl >= 0-verarscht) && (gefuehl <= 0+beleidigt) )

Dazwischen = TRUE;

else Dazwischen = FALSE;


Hört halt jetzt endlich auf hier weiterzulesen und dich künstlich 
aufzuregen.

von Ben j. (scarab)


Lesenswert?

Paulchen Panther schrieb:
> Hört halt jetzt endlich auf hier weiterzulesen und dich künstlich
> aufzuregen.

Der einzige der sich hier künstlich Aufregt bist du, und zwar über ein 
einziges Wort von Noname.

Bei dieser Gelegenheit muss ich Noname gleich mal meine Bewunderung 
zusprechen da er es geschafft hat den 1. Beitrag anscheinend richtig zu 
deuten. Ich selbst lag ganz falsch und ich denke vielen Mitlesern ging 
es ähnlich.

von Ben j. (scarab)


Lesenswert?

Referenz schrieb:
> Benjamin F. schrieb:
>> Wenn du bei einer 8Bit-Variable (entspricht logischerweise 8 Bereichen)
>> die Bits so setzt:
>> Bereichsbits = 1<<0;
>> Bereichsbits = 1<<1;
>> Bereichsbits = 1<<2;
>> Bereichsbits = 1<<3;
>
> warum nicht
>
1
> #tpedef
2
> struct Bitchen {
3
>    uchar B1 : 1;
4
>    uchar B2 : 1;
5
> ...
6
>    uchar B8 : 1;
7
> };
8
> 
9
> union {
10
>    Bitchen bits;
11
>    uchar all;
12
> } bitvar;
13
> 
14
> bitvar.B1 = Sensor1;
15
> bitvar.B2 = Sensor2;
16
> ...
17
> if (bitvar.all == 0)
18
> ...
19
>
> habe jetzt keinen compiler laufen lassen. Aber so ungefähr sollte es
> gehen.

Ich selbst nehme dann doch eher Makros für sowas wie z.B.
1
 
2
SET_BIT(Bereichsbits, BIT1);
3
CLR_BIT(Bereichsbits, BIT2);
4
CLR_ALL(Bereichsbits);
die dann im ganzen Projekt über nen Standard-Header sowieso mitgeladen 
werden. Jedes mal ne union zu definieren wenn man mal n Bitfeld hat wäre 
mir zu aufwendig, is aber eher eine Frage persönlicher Vorlieben ;)

von Referenz (Gast)


Lesenswert?

Wie laufen diese Anwseiungen bei Deinem Konstrukt:
> bitvar.B1 = Sensor1;
> bitvar.B2 = Sensor2;
> ...
> if (bitvar.all == 0)
> ...

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.