Hallo Gemeinde,
ich bin etwas an verzweifeln, die Temperatur anzeige spinnt total sie
schwankt von minus bis hin zu über 100 C Celsius, die zahlen hinter der
Temperaturanzeige werden immer mehr und schieben sich weiter.
Wie ich es sehe ist es der Timer zwei, der da stört, wen ich ihn raus
nehme dann ist die Temperatur ruhiger, kann das sein ? und wen, warum
stört er.
Schaut mal bitte in mein Programm vielleicht könnt ihr mir etwas helfen.
gruß Ritzel
>Wie ich es sehe ist es der Timer zwei, der da stört, wen ich ihn raus>nehme dann ist die Temperatur ruhiger, kann das sein ?
Ja.
> und wen, warum stört er.
Weil 1-Wire ein bescheuertes Protokoll ist das
extrem genaues kurzes Timing benötigt. Interrupts
solltest du verbieten wenn du den DS1820 ausliest.
@Ritzel
kenne mich in Bascom nicht aus.
Wie hast du denn den Familiencode sowie den Serialcode des DS1820
herausgefunden?
Im Anhang siehst du wie die Sequenz für einen Sensor lt. Datenblatt
von Maxim.
Wenn den Sensor nicht Parasitär angeschlossen hast kannst den Punkt
mit dem Strong pullup weglassen.
Aber so sollte der Ablauf etwa sein.
Master sendet Reset Impuls ; Also Impuls 480µs, erwartet wird dabei der
; Presence Impuls. Den kann man auch mit dem
; Oszi messen der Rest ist schwieriger.
Master sendet Skip ROM - Command ; Also CC Hex
Master sendet Convert T command ; 44 Hex
Danach wieder!
Master sendet Reset Impuls
Master sendet Scratchpad command ; BE Hex
Danach sendet der DS1820 9 Byte inclusive CRC die dann der Master in
seinem RAM speichert.
Also brauchst schon mal ein Array mit 9 Byte.
Zum Abschluss Master sendet Reset Impuls .
Das alles funktioniert nur bei einem angeschlossenem Sensor.
Du musst dem Sensor genügend Zeit für die Konvertierung geben.
Also nach dem Starten durch
1wwrite &H44
muss eine Pause von 750ms kommen, wenn du die Daten mit 1/16° Auflösung
haben willst. Damit du nicht wirklich warten musst und den zukünftigen
Rest deines programms ausbremst, würde ich den Ablauf so machen:
If Zeit=5 Then
Gosub Temp
1wreset
1wwrite &HCC 'alle Sensoren ansprechen
1wwrite &H44
Endif
In der Sub Temp nimmst du dann die Befehle zur Konvertierung raus.
Warum wird der Timer2 ca. alle 1ms aufgerufen? Du verwendest doch gar
keine ms sondern nur sec. in deinem Programm. Wenn du die ms nicht
brauchst, würde ich den Timer wesentlich seltener aufrufen. Mit Prescale
1024 z.B. nur noch alle 30ms. Dann hast du genügend Zeit, die Sensoren
auszulesen.
Evtl. solltest du dann die Zuweisung
Temp1 = T1 / 10
ans Ende der Sub legen, weil die relativ lange dauern und dadurch die
Einleseroutine des 2. Sensors unterbrochen werden könnte.
Hallo Leute,
nun Interups verbieten ist nicht so einfach, leicht gesagt.
Ich lese die DS1820 mit ein kleines Programm dafür aus, ist nicht das
Problem.
Die wartezeiten habe ich auch schon bis hin zu 750ms eingestellt aber
die Aussetzer kommen auch immer nur zwischen den Messzeiten komischer
weise.
Das mit dieser Anweisung
If Zeit=5 Then
Gosub Temp
1wreset
1wwrite &HCC 'alle Sensoren ansprechen
1wwrite &H44
Endif
geht nicht, weil alle Sensoren einzeln abgefragt werden die durch die
Dsid(1) zugewiesen sind.
1wwrite Dsid(1) , 8
1wwrite Dsid(9) , 8
Ich habe schon andere Programme zu laufen wo ich den Timer 1 zum Zählen
verwendet habe damit kommt keine Probleme in der Anzeige völlig stabil
keine Fehlsprünge, nur mit dem Timer 0 und 2.
Ich kann den Timer 1 aber nicht verwenden, weil ich den in ein anderes
Programm für die PWM verwenden möchte daher der Zähler mit 0 oder 2.
Könnte man noch anders zählen lassen.
Gruß
Ritzel schrieb:> geht nicht, weil alle Sensoren einzeln abgefragt werden die durch die>> Dsid(1) zugewiesen sind.
Du kannst alle Sensoren gleichzeitig konvertieren lassen. Nur das
Auslesen muss natürlich nacheinander stattfinden.
Versuche es doch einmal, dann wirst du schon sehen.
Interrupts unterbinden ist immer die einfachste Variante, aber nicht
unbedingt die beste. Man kann sich auch überlegen, wie man sicherstellen
kann, dass es nicht zu Beeinflussungen kommt.
Jeder der 1wire Befehle, die du benutzt, benötigt etwa 1ms für die
Ausführung. Du musst jetzt versuchen, mit deinem Timer Interrupt
außerhalb dieser Zeiten zu bleiben.
Um zu verhindern, dass die Sub Temp und die LCD Ausgabe mehrfach in
einer Sekunde ausgeführt werden, würde ich die Main loop so machen
Do
If Zeit=5 Then
Gosub Temp
1wreset
1wwrite &HCC 'alle Sensoren ansprechen
1wwrite &H44
Locate 1 , 1 : Lcd "T1 "
Lcd Fusing(temp1 , "##.#") ; " "
Locate 1 , 11 : Lcd "T2 "
Lcd Fusing(temp2 , "##.#") ; " "
Zeit = 0
Endif
Loop
Hallo mue-c,
ach so, ja das hattest du auch noch erwähnt diese raus zu nehmen, auf
dem Testbord scheint es nun stabil zu sein, ich werde es nun mal auf der
anderen Steuerung aufspielen und sehen was es macht, danke Dir.
Gruß Ritzel