Pöler
08.11.2008, 21:25
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
$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
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
$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