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.
Startest du denn überhaupt eine Messung und wartest danach ausreichend lange?
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.
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.
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.
Nein, ist nur ATmega32. Aber das mit dem Überlauf ist interessant. Welcher Typ wäre dann sinnvoll? char, oder?
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.