mikrocontroller.net

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


Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Startest du denn überhaupt eine Messung und wartest danach ausreichend 
lange?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.