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();
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
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 ?
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.
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.
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.
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
:
:
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" ;-)
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.
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...
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).
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).