Forum: Compiler & IDEs Code gibt immer den gleichen Binärcode aus


von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Mein Code soll den Temperatursensor DS1820 auslesen. Ob es wirklich 
funktioniert weiß ich noch nicht. Irgendwo ist noch ein Fehler beim 
return oder er kommt mit dem Typ nicht zurecht. Ka an was es liegt. Die 
Ausgabe am Segment ist immer 11000111. Woher das kommt konnte ich noch 
nicht rausfinden.

Gleich als Hinweis: Der Code ist so gut wie nicht eingerückt. Ich weiß 
dass euch das nicht gefällt, aber ich komme damit einfach besser 
zurecht.

von Benedikt K. (benedikt)


Lesenswert?

Startest du denn überhaupt eine Messung und wartest danach ausreichend 
lange?

von Gast (Gast)


Lesenswert?

Ja hier werden die Daten empfangen-->
int wert1 = empfang();
int wert2 = empfang();

Ob er jetzt was sendet und empfängt ist ja erst mal egal. Das Problem 
ist ja dass aus der empfang Funktion kein sinnvoller Wert zurück kommt. 
Sondern immer nur 11000111. Zumindest glaube ich dass es innerhalb der 
Funktion so kommt. Irgendwoher muss der Wert ja kommen.

von Gast (Gast)


Lesenswert?

Ich habe es gerade nochmal probiert. An der Funktion liegt es wohl auch 
nicht.

Am Ende der Funktion habe ich folgendes angegeben.
zahl1 = 11111111;

Dann sollte ja eigentlich 8x eine 1 angezeigt werden. Aber es kommt 
wieder nur dieser komische Code.

von Thorsten (Gast)


Lesenswert?

Ich gehe mal davon aus, dass du auf einem System mit 16 Bit arbeitest. 
Das bedeutet, dass du in einem unsigned int Werte von 0 bis 65.535 
speichern kannst.

Du versuchst aber in der Funktion empfang() in einem unsigned integer 8 
dezimale Stellen unterzubringen, z.B. dein zuletzt angesprochenes zahl1 
= 11111111. Das passt nicht, irgendwann läuft der Wert über und es 
entsteht ein ganz anderer Wert als derjenige den du erwartest, 
wahrscheinlich kommt der raus, den du immer rausbekommst.

von Gast (Gast)


Lesenswert?

Nein, ist nur ATmega32. Aber das mit dem Überlauf ist interessant. 
Welcher Typ wäre dann sinnvoll? char, oder?

von Thorsten (Gast)


Lesenswert?

ok, also sogar nur 8-Bit. Aber warum speicherst du den Wert eigentlich 
in dezimaler Form ab, wenn es dir doch nur um Nullen und Einsen geht? 
Speicher den Wert doch binär ab, dann reichen die 8-Bit vollkommen aus.

von Gast (Gast)


Lesenswert?

Welchen Datentyp muss ich dann dafür auswählen? Mit den verschiedenen 
Zahlensystemen habe ich immer noch etwas Probleme. Einmal funktioniert 
etwas gleich, dann wieder gar nicht.

von Thorsten (Gast)


Lesenswert?

Unsigned integer ist schon vollkommen richtig. Nur die Art wie du 
speicherst ist falsch. Deine Speicherung basiert auf dem dezimalen 
System, leicht zu erkennen an der Multiplikation mit 10 in der Funktion 
empfang(). Du musst dir aber darüber klar werden, dass ein uC im binären 
System arbeitet.

Wenn du nun z.B. schreibst "101", dann heißt das für dich 1*10^2 + 
0*10^1 + 1*10^0. Für einen uC sieht das ganze aber ganz anders aus, für 
den ist 101 = 1*2^2 + 0*2^1 + 1*2^0, entsprechend einer 5 im dezimalen 
System.

Anstatt mit 10 zu multiplizieren, musst du stattdessen mit 2 
multiplizieren. Dann sollte das ganze passen. Ich hab mir dein Programm 
aber nun nicht im speziellen angeschaut, so dass ich nicht weiß, was das 
auf andere Programmteile für Folgen hat. Es kann sein, dass du deinen 
gesamten Code entsprechend anpassen musst. Aber ich denke, das ist auch 
eine gute Übung um das mit den Zahlensystemen besser zu verstehen. Das 
Thema solltest du dir am besten nochmal zu Gemüte ziehen, da es meiner 
Meinung nach zu den Grundlagen gehört, um einen uC verstehen zu können.

von Gast (Gast)


Lesenswert?

Wie die einzelnen Zahlensysteme gehen weiß auf einige Stellen auswendig. 
Also das ist nicht das Problem. Nur die Umrechnung im µC selbst, macht 
mir hin und wieder Probleme. Aber mit deiner Erklärung wird mir jetzt 
einiges klarer.

Thx! Bin dann mal weiter coden. Falls noch ein Problem ist, melde ich 
mich nochmal.

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Da bin ich nochmal. Paar Tage was anderes zutun, und kann heute erst 
wieder weiter machen. Das richtige ausgeben der einzelnen Bits 
funktioniert jetzt super :-)

Irgendwo habe ich aber noch ein kleines Problem beim empfangen der Bits 
vom DS1820. Leider kann ich immer nur Mist auslesen -> 11100000 usw.

Convert wurde gesendet, genau auch der Befehl zum Temperatur messen. 
Aber irgendwie stimmt da was mit den Timings noch nicht so ganz. 
Wahrscheinlich zwischen letzten Befehl senden und auslesen. Oder auch 
beim Empfang der einzelnen Bits!? Entweder zulange oder zu kurz 
gewartet. Ich weiß es nicht.

Das Datenblatt ist mir dabei auch nicht sehr hilfreich, zumindest finde 
ich es einfach nicht genau. Im Forum hier, finden sich auch immer wieder 
unterschiedliche Zeiten.

Wenn ich zwischen den einzelnen Bits empfangen ein _delay_us(80); drin 
habe, kommt auch ein ziemlich wirrer Code raus, egal bei welchem Byte. 
Das 1. Byte soll laut Datenblatt ja nur 0x00 oder 0xFF sein, und sonst 
nichts dazwischen.

von Gast (Gast)


Lesenswert?

Achso: Das Resetsignal wird korrekt empfangen, er ist also richtig 
eingebaut und antwortet auch. Genauso empfange ich ja auch 1er und 0er 
nur falsch.

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.