Hallo zusammen,

ich habe mir mit dem Mega 8 eine kleine Temperaturmessstation aufgebaut. Im Grunde werden 4 DS1820 Temperatur Sensoren (je einer an einem I/O Pin) und 2 Schalter sowie 4 Taster per Analog Port abgefragt und die Betriebszustände und Temperaturen auf einem 2*16 LCD Display angezeigt.
Das ganze klappt auch hervorragend. Bascom sagt mir, der Speicher sei zu 99% belegt . Das liegt wohl daran, das per Menu eine Menge Parameter voreingestellt und auf Wunsch im EEPROM abgelegt werden können. Nach der Inbetriebnahme habe ich 2 Dinge festgestellt, die ich nicht nachvollziehen kann:

1. Die 1. Temperaturmessung nach dem Reset zeigt immer 85 Grad an.

2. Gelegentlich (selten und unregelmäßig) wird ein falscher Temperaturwert (meistens -0,5 Grad) angezeigt. Die nächste Messung ist wieder OK.

Vermutlich handelt es sich um ein Timing Problem. Allerdings kann ich es nicht identifizieren. Die Messzyklen habe ich bereits von 1 Sekunde auf 2 Sekunden ohne Erfolg verdoppelt.

Die relevanten Teile des Codes füge ich mal an. Erwähnenswert ist wohl noch, das der Timer offensichtlich korrekt arbeitet, da sämtliche aus der Timer ISR abgeleitete Funktionen wie Blinkfrequenzen, Anzeigedauer von Warnmeldungen etc. nachmessbar stimmen.

Da das mein erstes Projekt mit den DS1820 ist, weiss ich nicht mehr weiter. Vielleicht kann sich jemand mal den Code ansehen?

Gruß

Horst

Code:
$regfile = "m8def.dat"
$crystal = 3686400

'Timer 0 auf 50 Hz setzen (20 ms)
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer_irq                                         'ISR für Timer 0 festlegen
Enable Timer0

Dim Timervorgabe As Byte
Timervorgabe = 185   

'Hauptprogramm

Do
Gosub Betriebsmodus
Gosub Temperaturmessung                               'Alle 4 Sensoren messen
Gosub Analogtaster                                           'Taster betätigt?
If Wert < 900 Then                                           'Ein Taster betätigt
   Gosub Auswertung                                         'welcher Taster?
End If
If Bmodus = 1 Or Bmodus = 4 Then                   'Nur in Modus 1 + 4
   If Taster = 4 Then                                          'Einstellungen ändern 
      Gosub Hauptmenu
      Taster = 0
   End If
End If
If Taster = 3 Or Taster = 2 Then                        'Auswahl des Sensors
   Gosub Sensorwahl
End If
Gosub Tempanzeige                                          'Anzeige des ausgewählten Sensors in Zeile 2
Taster = 0                                                        'Tasterwert auf definierten Wert zurücksetzen
Loop
End

'Auslesen der DS1820 Temperatursensoren 

Temperaturmessung:
If Tempmess >= 96 And Verriegelung = 0 Then   '1920 ms (96*20) seit dem Reset vergangen
   Gosub Messen                                                'Also Temperaturmessung
   Tempmess = 0
   Verriegelung = 1                                            'Und Merker zurücksetzen
End If
If Tempmess >= 4 And Verriegelung = 1 Then     '80ms (4*20) nach Reset auslesen der Temp. Sensoren
Gosub Auslesen
   Tempmess = 0
   Verriegelung = 0
End If
Return

Messen:
For I = 1 To 4
  1wreset Pinc , I                                               'Reset DS1820
  1wwrite &HCC , 1 , Pinc , I                               'überspringe ROM
  1wwrite &H44 , 1 , Pinc , I                                'starte Konvertierung
Next I
Return

Auslesen:
For I = 1 To 4
  1wreset Pinc , I                                               'Reset DS1821
  1wwrite &HCC , 1 , Pinc , I                               'Überspringe ROM
  1wwrite &HBE , 1 , Pinc , I                                'sende T-Register 60h und 61h an Atmel
  Ds1820 = 1wread(2 , Pinc , I)                           'lese die empfangenen Daten 2 Byte
  Ds1820a(i) = Ds1820                                       'Zum Anzeigen des ausgelesenen Wertes (Sensortest)
  1wreset Pinc , I                                                'Reset DS1821
  Halb = Ds1820 And 1                                        'prüfen auf letztes Bit (x.5 Grad)
  Shift Ds1820 , Right                                          'entferne letztes Bit (Rechtsschieben)
  Ds1820 = Ds1820 And 255                                'Nur die unteren 8 Bit werden benötigt
  If I = 1 Then
   Tesp = Ds1820                                                'Ganzzahlige Temperatur der ESP (1 Byte)                                           '
  End If
If Ds1820 > 127 Then                                         'wenn Temperatur negativ ist
      Vorzeichen = "-"
      Ds1820 = 256 - Ds1820                                'und negative Temperatur berechnen
      If Halb = 1 Then Ds1820 = Ds1820 - 1           'wenn Wert x.5 dann um 1 korrigieren
    Else                                                              'wenn Temperatur Positiv
      Vorzeichen = " "
End If
If Halb = 1 Then
   Nachkomma = "5"                                           'wenn x.5
  Else                                                                 'wenn x.0
   Nachkomma = "0"
End If
Temperatur = "  " + Vorzeichen + Str(ds1820)      '"-_-xxx"
Temperatur = Right(temperatur , 4)                     '"-xxx"
Temperatur = Temperatur + "." + Nachkomma + Chr(223) + "C"  '"-xxx.y°C" 8 Zeichen
Sensor(i) = Temperatur
Next I
Return



'Timer 0 ISR

Timer_irq:
Timer0 = Timervorgabe                                      'Timer vorladen für 20ms
Zaehlerwert = Zaehlerwert + 1                            '20 ms
Tempmess = Tempmess + 1                               '20ms Sekunden für Tempmessung sind rum
If Zaehlerwert >= 5 Then                                    '5*20 ms = 100ms
   Zaehlerwert = 0
   Zehntel = Zehntel + 1
End If
Return