Forum: Mikrocontroller und Digitale Elektronik Bascom DS 1820 Temperatursensor Problem


von Basti (Gast)


Lesenswert?

Hallo,

ich habe erstmal ein kleines Testprogramm geschrieben, um erstmal zu 
sehen ob die Temperatursensoren funktionieren. Und sie funktionieren 
Perfekt.

Hier mal der reine Do Loop Schleife Code
1
Do
2
3
         1wreset                                            ' Bus reseten damit alle Sensoren hören
4
         1wwrite &HCC                                       ' &HCC = alle Sensoren am Bus werden angesprochen   / &H55 einen bestimmten Baustein ansprechen mit 1wverify Dsid1-3(1) oder 1wwrite &H55 ' 055H = Match ROM command, also Baustein auswählen For I = 1 To 8 : 1wwrite Dsid(i) : Next I
5
         1wwrite &H44                                       ' Sensoren veranlassen die Temperatur zu messen
6
7
         Waitms 750
8
9
         1wverify Dsid1(1)                                  'Spreche den ersten Sensor an
10
      If Err = 1 Then
11
      Locate 10 , 33
12
      Lcd "Fehler"                                          'Err = 1 dann stimmt etwas nicht
13
      Elseif Err = 0 Then
14
      1wwrite &HBE                                          ' Kommando READ SCRATCHPAD
15
      Gosub Berechnung
16
      Temp1 = Fusing(dg2 , "#.#")                           'Ergebnis in Temp1 als String ablegen und ab der zweiten kommastellen abschneiden
17
      Locate 10 , 33
18
      Lcd Temp1 ; " C"                                      ' Zeige Text aus Tabelle Data1 von Stelle index(1)
19
      End If
20
21
         1wverify Dsid2(1)                                  'Spreche den ersten Sensor an
22
         If Err = 1 Then
23
         Locate 12 , 33
24
         Lcd "Fehler"                                       'Err = 1 dann stimmt etwas nicht
25
         Elseif Err = 0 Then
26
         1wwrite &HBE                                       ' Kommando READ SCRATCHPAD
27
         Gosub Berechnung
28
         Temp2 = Fusing(dg2 , "#.#")                        'Ergebnis in Temp1 als String ablegen und ab der zweiten kommastellen abschneiden
29
         Locate 12 , 33
30
         Lcd Temp2 ; " C"                                   ' Zeige Text aus Tabelle Data1 von Stelle index(1)
31
         End If
32
33
         Loop
34
35
         End
36
37
Berechnung:
38
39
 Dsid2scratchpad(1) = 1wread(9)                             ' lese 9 bytes in das Array  (byte9=checksumme)
40
 If Dsid2scratchpad(9) = Crc8(dsid2scratchpad(1) , 8) Then  ' überprüfe Checksumme (9 Byte) wenn OK dann
41
 Itmp = Dsid2scratchpad(1) And 1
42
 If Itmp = 1 Then Decr Dsid2scratchpad(1)
43
 Dg = Makeint(dsid2scratchpad(1) , Dsid2scratchpad(2))      ' erstes und 2 Byte (LSB+MSB) zusamm fügen &H0A + &H02 = &HA2 = 162
44
 Dg = Dg * 50
45
 Dg = Dg - 25
46
 Dg1 = Dsid2scratchpad(8) - Dsid2scratchpad(7)
47
 Dg1 = Dg1 * 100
48
 Dg1 = Dg1 / Dsid2scratchpad(8)
49
 Dg = Dg + Dg1
50
 Dg2 = Dg / 100
51
 End If
52
53
 Return



Jetzt möchte ich das ganze aber in das eigentliche Programm einsetzen, 
wo aber viele andere Dinge zusätzlich gemacht werden. Unter anderem 
DCF77 auswertung, Helligkeitsauswertung, Tastenauswertung etc. Dann 
funktionieren die Sensoren scheinbar nur noch sporadisch. Also manchmal 
wird mir "Fehler" angezeigt, wie ich es einprogrammiert habe, wenn der 
Sensor nicht angeschlossen ist oder der Sensorwert Nr. 1 nimmt plötzlich 
den Sensorwert Nr.2 an. Ich kopier den ganzen oberen Code (der Solo 
absolut perfekt und stabil läuft) in die Do Loop schleife des anderen 
Programmes und dann läuft es schon nicht mehr richtig. Also so:

Do

Dcf77 Auswertung
Tasterauswertung

Temperaturauswertung
.
Helligkeitsauswertung
...

loop

Wieso funktioniert dann der Code nicht mehr. Ich kopier den 1:1 und auch 
die Initialisierungssequenz am Anfang des Programmes wird mit der 
Initialisierungssequenz vom "Soloprogramm" 1:1 ergänzt.

Stimmt da dann etwas mit dem Timing nicht mehr? Wobei das eigentlich 
nicht sein kann.

von Werner (Gast)


Lesenswert?

Basti schrieb:
> Wieso funktioniert dann der Code nicht mehr.

Soll das eine Frage sein? Wie soll das hier jemand wissen, ohne den Code 
zu kennen.

> Stimmt da dann etwas mit dem Timing nicht mehr? Wobei das eigentlich
> nicht sein kann.

Schon möglich. Aber wenn es nicht sein kann, weil du es möglicherweise 
nachgemessen hast, muß es wohl an was anderem liegen.

von Basti (Gast)


Lesenswert?

Ich habe doch den Code mit in den Post getan. Also den Solocode der 
Temperaturmessung.

Timingprobleme konnte ich dadurch ausschließen, dass ich jeglichen Quarz 
verwenden kann und auch im Programm hier und da mal ein Wait setzen 
kann, ohne dass das programm einen Fehler ausgibt.

Das Programm in welches ich den Code integrieren will funktioniert so 
ebenfalls Solo perfekt. Wenn ich den Temperaturcode einfüge dann 
funktionieren die anderen Funktionien ebenso weiter. Nur eben die 
Temperatur wird falsch ausgelesen. Also kann der Fehler 
höchstwahrscheinlich nur in dem Temperaturcodestückchen liegen, welches 
ich oben im Post integriert habe.

von Peter R. (peterfido)


Lesenswert?

Der Fehler kann fast überall sein. DCF77 klingt für mich nach Interrupt. 
Evtl. treten noch weitere Interrupts auf. Wenn dann der Stack zu klein 
ist oder Variablen doppelt verwendet werden, oder falsch dimensioniert 
sind, dass eine Variable Teile einer anderen überschreibt zum Beispiel. 
Ohne kompletten Code kann ICH da nur spekulieren und nur eingeschränkt 
helfen.

Auch Hardwareursachen können verantwortlich sein. Z.B. lange Leitungen 
zum Display, welche die Leitungen vom 1Wire beeinflussen.

von Basti (Gast)


Lesenswert?

Hm

also ich habe jetzt vor der Abfrage der Sensoren die Interrupts mit 
"Disable Interrupts" ausgeschaltet und nach der Abfrage wieder 
eingeschaltet.

Und woaa siehe da jetzt läuft es seit ein paar Minuten ohne einen 
Fehler.
Danke das war wohl der Fehler, dass interrupts die Kommunikation 
behindern.

Nur DCF77 will sich jetzt scheinbar nicht mehr Synchronisieren. Aber mal 
abwarten. Das ganze läuft ja erst 5 Minuten. Obwohl normalerweise bei 
mir sich DCF inerhalb 2 Minuten Synchronisiert hat.

von Basti (Gast)


Lesenswert?

Schade da will sich ncihts mehr Synchronisieren.
Wenn ich die Interrupts für die abfrage ausschalte, dann störe ich damit 
die Kommunikation mit DCF77.

Jetzt ist die große frage: WIe kriege ich alles unter einen Hut?

von Peter R. (peterfido)


Lesenswert?

Ich habe keine Probleme mit DCF und DS1820. Allerdings gehe ich anders 
vor.
Ich nutze eine Hilfsvariable. Waitms nutze ich gar nicht. Da DCF die 
Sectic mitbringt, schubse ich die Temperaturmessung an, wenn die 
Variable nicht gesetzt ist und setze dann die Variable. Ist sie gesetzt, 
hole ich die Temperaturen ab und lösche dann die Variable wieder.

Allerdings tippe ich eher auf Beeinflussung durch falsch dimensionierte 
Variablen oder zu kleinem Stack. Ohne Interrupts läuft DCF natürlich 
nicht. Er springt ja dann nicht mehr im richtigen Timing in die DCF 
Routine.

Pseudocode:
1
dim Vari1 as byte
2
Tempholen alias vari1.0
3
neuesekunde alias vari1.1
4
5
do
6
if neuesekunde=1 then
7
   reset neuesekunde
8
   gosub templesen
9
   'gosub zeitanzeigen...
10
endif
11
12
13
loop
14
end
15
16
sectic: 
17
set neuesekunde
18
19
return
20
21
templesen:
22
if Tempholen =1 then
23
   reset Tempholen 
24
   gosub templesen
25
else
26
   set Tempholen 
27
   gosub tempmessen
28
endif
29
30
return

Allerdings reicht es bei Raumtemperatur auch aus, minütlich zu messen.

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.