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







Zitieren

Lesezeichen