Hallo, ich versuche seit zwei Wochen, die erweiterte Auflösung beim DS18S20 zu realisieren, und auf LCD auszugeben. Dazu habe ich nach dem Auslesen der Temperatur folgendes mir ausgedacht (nur im positiven Temperaturbereich): - Low Temperatur auslesen, und um eine Stelle nach rechts rotieren - Low Temp. x 16 - Low Temp. - 4 - Count_Remain auslesen, und anschließend diesen Wert von 16 abziehen - Low Temp. + Count_Remain - In der Zwischenzeit ist der Wert natürlich größer als 8 Bit - High- und Low Byte x 10 - High- und Low Byte / 16 Jetzt nur noch die Analyse zu einzelnen Dezimalstellen, und ASCII Offset dazu addieren. Mein Problem ist, dass er die Temperatur anzeigt, aber fehlerhaft, nach folgendem Beispiel: .. 21,8 , 21,9 , 22,0 , 22,1 , 23,2 , 23,3........ Ich bekomme es leider nicht gelöst, die Ursache des Problems zu finden. Im Anhang ist der kommentararme Assemblercode, der eigentlich leicht zu verstehen ist. Ich muss zugeben, dass ist mein erstes größeres Assemblerprogramm, und würde mich über jeden Tip freuen. MFG Mark Schnitzer
Hallo nochmal, also ich werde dass Gefühl nicht los, dass der Temperatur LSB in der Mitte der Subtraktion von 16 - Count_Remain, um 1 nach oben/unten springt, dass dadurch meine ganze Berechnung dann hin ist. Ich habe mittlerweile schon alles hundertmal gecheckt. Das Programm habe ich ausschnittsweise kopiert, ein fiktiven Temperatur- und Count_Remain Wert mir ausgedacht. Da ging es. Aber mit dem Sensor klappt der tupfergleiche Code nicht. MFG Mark
Dann stell fest, welche Werte du vom Sensor kriegst und spiel dein Programm mal mit Papier und Bleistift durch (nachverfolgen welche Berechnungen gemacht werden und welche Zwischenergebnisse sich ergeben). Dann weisst du auch wie und warum dein µC zu den Ergebnissen kommt die er dir schlussendlich anzeigt. Danach kannst du überlegen, wo dein Denkfehler liegt und etwas dagegen tun. Das ganze nennt sich 'debugging', und ist das Salz in der Suppe jedes Programmierers. Aber erst mal musst du feststellen, welche Werte tatsaechlich vom Sensor kommen.
Das ist übrigens beim 18B20 deutlich einfacher als mit dem 18S20. Der liefert die Temperatur direkt in 16tel. Kleine Tips am Rande: - LSR interessiert sich nicht für C (das ist ja grad der Unterschied zu ROR), CLC davor ist also überflüssig. - Ein AVR ist zwar kein 16bitter, aber derart kompliziert wie beispielsweise in minus_vier ist der Umgang damit nun auch wieder nicht: subi temp_low, 4 sbci temp_high, 0 Andere Stellen sind ähnlich, wobei man die Addition einer Konstanten als Subtraktion des negativen Wertes realisiert. Im Interrupt: in temp1, SREG push temp1 Jeder Interrupt vernichtet so den laufenen Inhalt von temp1. Besser push temp1 in temp1, SREG push temp1 Alternativ kannst du auch eines der Register ausschliesslich für Speicherung vom SREG verwenden.
Statt mit .equ temperature_lsb = 0x060 alles in Handarbeit zuzuweisen, kann man das ganz gut dem Assembler überlassen: .dseg temperature_lsb: .byte 1 temperature_msb: .byte 1 TH_register: .byte 1 [...] .cseg
Hallo, @Karl Heinz, vom Sensor bekomme ich nur zwei Werte: Temperaturwert als 8 Bit, und Count_Remain, für die erweiterte Auflösung. Ein Debugging während der Laufzeit geht nicht. @A.K, Ich werde die Codefragmente überarbeiten. Mal sehen ob sich da was tut. Danke für die Tips. Gruß Frank
>multi_zehn: > mov test_low, temp_low > mov test_high, temp_high > lsl temp_low > rol temp_high kann es sein das das andersrum gemeint ist also > mov temp_low,test_low > mov temp_high, test_high mov ist doch mov Ziel,Quelle und ich sehe nicht ganz den Sinn warum du in einer unterroutine zum Multiplizieren erstmal die in Werte(test) speicherst und dann mit den anderen arbeitest. Aber vielleciht ist es ja auch nur der übergeordnete Algorithmus.
Hallo Wolfram, die "Test" Variablen sind nur als Zwischenspeicher gedacht, damit ich mit diesen Werten später eine Addition machen kann. Gruß Frank
> vom Sensor bekomme ich nur zwei Werte: Temperaturwert als 8 Bit, > und Count_Remain, für die erweiterte Auflösung. Ein Debugging > während der Laufzeit geht nicht. Was heist 'geht nicht'. Natürlich gehts. Du hast ein LCD. Was perfekteres als dort mal die Werte die man vom Sensor kriegt auszugeben gibts wohl selten.
> vom Sensor bekomme ich nur zwei Werte: Temperaturwert als 8 Bit, > und Count_Remain, für die erweiterte Auflösung. Da liegt u. U. das Problem. Um die höhere Genauigkeit nutzen zu können, muß man die Temperatur, COUNT_REMAIN und COUNT_PER_C verrechnen. (Also drei Werte!) Die Formel dazu steht im Datenblatt des DS18S20.
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.