Forum: Mikrocontroller und Digitale Elektronik C, Variable 0xFF wird als !=0xFF erkannt?


von Michael D. (etzen_michi)


Angehängte Dateien:

Lesenswert?

Nabend ...

Ich habe ein Problem welches ich irgendwie nicht verstehe ..

schreibe ich:
1
Byte=0xFF;
2
if(Byte==0xFF) {
3
}
4
Anzeige[ID]=0x10;

so steht "Anzeige[ID]" auf 0x10.
schreibe ich aber:
1
Byte=0xFF;
2
if(Byte==0xFF) {
3
   Anzeige[ID]=0x10;
4
}

so behält "Anzeige[ID]" seinen ursprünglichen Wert.

Habe auch schon mit verschiedenen Optimierungen versucht ...

Erkennt irgendwer den Fehler? - im Programm Berechne();

von Peter II (Gast)


Lesenswert?

> volatile int8_t flag=0, Byte

damit hat byte ein vorzeichen, und eine variable mit 8 bit und 
vorzeichen kann niemals 0xFF sein.

von AND (Gast)


Lesenswert?

Ohne mir den source angeschaut zu haben, ist Byte ein signed char?

Michael D. schrieb:
> Byte=0xFF;
Byte=-127


> if(Byte==0xFF) {
-127==256


>    Anzeige[ID]=0x10;
> }

Versuche mal Byte==-127

von AVerr (Gast)


Lesenswert?

Ich würde auch mit den Variablennamen aufpassen. Du hast eine globale 
Variable namens ID und die Funktion LM75(int8_t ID).
Der Parameter heißt auch ID.
Der Compiler weiss natürlich immer genau, welche ID Variable er 
innerhalb der Funktion benutzt, aber weisst du es denn auch ?

von Michael D. (etzen_michi)


Lesenswert?

Danke ... nun heißt es "uint8_t" ... funktioniert

von Peter II (Gast)


Lesenswert?

in der ISR

 cli();
 sei();

zu verwenden ist auch falsch.

von Michael D. (etzen_michi)


Lesenswert?

AVerr schrieb:
> Ich würde auch mit den Variablennamen aufpassen. Du hast eine globale
> Variable namens ID und die Funktion LM75(int8_t ID).
> Der Parameter heißt auch ID.
> Der Compiler weiss natürlich immer genau, welche ID Variable er
> innerhalb der Funktion benutzt, aber weisst du es denn auch ?

ID ist hier praktischer Weise immer das gleiche ^^. Kommt daher das ich 
da soviel rumprobiert habe weil "plötzlich" nichts mehr ging ^^.


Peter II schrieb:
> cli();
>  sei();
>
> zu verwenden ist auch falsch.

Habe das rein genommen um Fehler aus zu schließen und ich mir immer 
nicht sicher bin ob der Compiler das nicht von selber aufhebt.

von Peter II (Gast)


Lesenswert?

Michael D. schrieb:
> Habe das rein genommen um Fehler aus zu schließen und ich mir immer
> nicht sicher bin ob der Compiler das nicht von selber aufhebt.
der compiler hat damit nichts zu tun, das ist eine fähigkeit von dem µC. 
Jetzt hast du aber einen Fehler eingebaut dann nach dem

sei();

bist du noch kurze zeit in der ISR und da kann jetzt schon der nächste 
IRQ kommen und im schlimmsten fall kann es dadurch zur einen Stack 
overflow kommen.

von Michael S. (rbs_phoenix)


Lesenswert?

AND schrieb:
> Ohne mir den source angeschaut zu haben, ist Byte ein signed char?
>
> Michael D. schrieb:
>> Byte=0xFF;
> Byte=-127
>
>
>> if(Byte==0xFF) {
> -127==256
>
>
>>    Anzeige[ID]=0x10;
>> }
>
> Versuche mal Byte==-127

Ein signed Char geht aber von -128 bis 127. Das Bit "2^7" gibt das 
Vorzeichen an und die 0 gehört zu den positiven Zahlen. Also wäre es 
-128. Doch das ist es auch nicht, da 11111111 eine -1 ist. 0 - 1 = -1. 
00000000 - 00000001 = 11111111. So hab ich es jedenfalls in den 
C-Grundlagen-Vorlesungen beigebracht bekommen.

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


Lesenswert?

AND schrieb:
> Michael D. schrieb:
>> Byte=0xFF;
> Byte=-127
Das ist wie (schon erwähnt) falsch...

>> if(Byte==0xFF) {
> -127==256
Fast richtig...
0xff = 255(unsigned) = -1(signed)

Ich würde das hier vorschlagen:
   if((unsigned)Byte==0xFF) {
Oder das:
   if(Byte==-1) {
Oder am besten durchgängig das:
   uint8_t Byte;

Michael Skropski schrieb:
> Das Bit "2^7" gibt das Vorzeichen an
> und die 0 gehört zu den positiven Zahlen.
> So hab ich es jedenfalls in den
> C-Grundlagen-Vorlesungen beigebracht bekommen.
Das ist eine vereinfachte Halbwahrheit...

Es sollte besser heißen:
Am MSB kann man sehen, ob es eine negative Zahl ist. Es geben aber 
durchaus auch andere Bits (nämlich ALLE) eine negative Zahl an. Denn 
sonst wäre es ja so:
:
:
4  00000100
3  00000011
2  00000010
1  00000001
0  00000000
-1 10000001
-2 10000010
-3 10000011
-4 10000100
:
:

Und:
Null ist Null. Null hat kein Vorzeichen. Es ergibt sich einfach nur 
"automatisch". Man hätte in der Historie den Zahlenbereich auch einfach 
genau andersrum definieren können, dann wäre Null quasi eine negative 
Zahl:
:
:
4  11111100
3  11111101
2  11111110
1  11111111
0  00000000
-1 00000001
-2 00000010
-3 00000011
-4 00000100
:
:

von Simon K. (simon) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Ich würde das hier vorschlagen:
>    if((unsigned)Byte==0xFF) {
Urgs!

> Oder das:
>    if(Byte==-1) {
Urgs!

> Oder am besten durchgängig das:
>    uint8_t Byte;
So macht es Sinn!

Warum sollte man eine Variable namens "Byte" vorzeichenbehaftet anlegen? 
Der Fehler ist hier bereits, dass der Name nicht zum Typ passt. Alles 
was danach folgt ist quasi nur "Folgefehler" ;-)

von Michael S. (rbs_phoenix)


Lesenswert?

Lothar Miller schrieb:
> Michael Skropski schrieb:
>> Das Bit "2^7" gibt das Vorzeichen an
>> und die 0 gehört zu den positiven Zahlen.
>> So hab ich es jedenfalls in den
>> C-Grundlagen-Vorlesungen beigebracht bekommen.
> Das ist eine vereinfachte Halbwahrheit...
>
> Es sollte besser heißen:
> Am MSB kann man sehen, ob es eine negative Zahl ist. Es geben aber
> durchaus auch andere Bits (nämlich ALLE) eine negative Zahl an. Denn
> sonst wäre es ja so:

Ja, da hast du natürlich Recht. Ich meinte eher, dass, wenn bei einem 
signed char das MSB 1 ist, ist es eine negative Zahl, aber da 0 Binär 
00000000 ist und somit auch das MSB 0 ist, "gehört" es zu den positiven 
Zahlen bzw. gehört es nicht zu den negativen Zahlen.

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


Lesenswert?

Michael Skropski schrieb:
> aber da 0 Binär 00000000 ist
Es ist nur dann und deshalb so, wenn und weil sich alle dran halten.

Es gab in der Historie aber durchaus auch andere Zahlenmodelle, wo es 
wirklich eine positive und eine negative Null gab...

> es zu den positiven Zahlen bzw. gehört es nicht zu den negativen Zahlen.
Aber welches Vorzeichen kommt denn bei -1 * +1 (minus mal plus) heraus?
Richtig: minus.
Und welches Vorzeichen kommt bei -1 * +0 (minus mal plus) heraus?
Ein positives, weil 0 positiv ist?
Kurios, erzähl das aber keinem Mathematiker...

von Michael S. (rbs_phoenix)


Lesenswert?

Lothar Miller schrieb:
> Und welches Vorzeichen kommt bei -1 * +0 (minus mal plus) heraus?
> Ein positives, weil 0 positiv ist?
> Kurios, erzähl das aber keinem Mathematiker...

Mir ist das schon bewusst, dass das mathematisch falsch ist ;)
Deswegen schrieb ich das "gehört" auch in "". 0 ist als 00000000 
definiert, zumindest in den Standard C-Datentypen wie int, char, usw. 
Und da die Zahl als negativ definiert ist, sobald das MSB auf 1 ist, ist 
die 0 eben nicht negativ (halt auch nicht positiv).
Es sollte aber klar sein, was ich meine ;)


Lothar Miller schrieb:
> Es gab in der Historie aber durchaus auch andere Zahlenmodelle, wo es
> wirklich eine positive und eine negative Null gab...

War da dann -0 +1 = +0? ^^


Lothar Miller schrieb:
> Es ist nur dann und deshalb so, wenn und weil sich alle dran halten.

Naja die Zahlensysteme sollten schon definiert sein. Eine 10 dezimal 
sollte auch immer eine 10 sein, somit eine 0 auch eine 0. Und so wie bei 
Dezimal die Stellenwertigkeit ... 10^2 10^1 10^0 (, 10^-1 10^-2 ...) 
ist, ist es bei Binär nunmal ... 2^3 2^2 2^1 2^0 (, 2^-1 2^-2 ...). Da 
ist die Folge, dass 00000000b 0d sein muss (oder es ist keine Binäre 
Zahl).

von Rolf Magnus (Gast)


Lesenswert?

Michael Skropski schrieb:
> 0 ist als 00000000 definiert, zumindest in den Standard C-Datentypen wie int,
> char, usw. Und da die Zahl als negativ definiert ist, sobald das MSB auf 1 ist, 
ist
> die 0 eben nicht negativ (halt auch nicht positiv).

C erlaubt auch das Einerkomplement und m.W. eine 
Sign/Magnitude-Darstellung. Die können beide eine negative 0 darstellen, 
und die besteht dann nicht nur aus 0-Bits.

> Lothar Miller schrieb:
>> Es gab in der Historie aber durchaus auch andere Zahlenmodelle, wo es
>> wirklich eine positive und eine negative Null gab...
> War da dann -0 +1 = +0? ^^

Nein, warum sollte es?
Übrigens: Bei floatingpoint-Typen ist es auch heute noch üblich, daß es 
+0 und -0 gibt.

> Lothar Miller schrieb:
> Naja die Zahlensysteme sollten schon definiert sein. Eine 10 dezimal
> sollte auch immer eine 10 sein, somit eine 0 auch eine 0. Und so wie bei
> Dezimal die Stellenwertigkeit ... 10^2 10^1 10^0 (, 10^-1 10^-2 ...)
> ist, ist es bei Binär nunmal ... 2^3 2^2 2^1 2^0 (, 2^-1 2^-2 ...). Da
> ist die Folge, dass 00000000b 0d sein muss (oder es ist keine Binäre
> Zahl).

Alles, was nur aus den Ziffern 0 und 1 besteht, ist eine binäre Zahl. 
Siehe  auch http://de.wikipedia.org/wiki/Binärcode
Da muß ein Bit keine feste Wertigkeit haben. Dazu gehören auch ganz 
andere Codes, wie 1-aus-n oder der Gray-Code. Was du meinst, ist das 
Dualsystem.
( http://de.wikipedia.org/wiki/Dualsystem )
Und bei vorzeichenbehafteten Zahlen benutzt man eben andere Kodierungen 
(heute meist das Zweierkomplement, dessen positiver Zahlenbereich genau 
wie im Dualsystem gespeichert ist).

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.