Temperaturen loggen mit LM75 und Tiny-RTC-Modul
Verfasst: Fr 1. Feb 2013, 12:54
Die Tiny-RTC-Platine besitzt standardmäßig neben dem RTC-Baustein DS1307 auch ein 4 KByte-EEPROM (AT24C32). Hierdurch bietet sich die Möglichkeit, in Verbindung mit einem LM75-Temperatursensor Temperaturen zu messen und zusammen mit einem Zeitstempel im EEPROM zu speichern. Beide Bausteine arbeiten mit dem I2C-Bus.
Das folgende BASCOM-Programm speichert bei jeder Betätigung derTaste Ta0 (angeschlossen an PortD.2) die Zeit (hh:mm:ss) im EEPROM, beginnend mit der EEPROM-Adresse 0 sowei die zugehörige Temperatur. Jeder einzelne Eintrag wird duch ein einziges Byte repräsentiert; ein Datensatz besteht also aus 4 Bytes. Auf die Verwendung lokaler Variablen wurde hier bewusst verzichtet. Zu Testzwecken wird der EEPROM-Schreibvorgang durch eine LED an PortD.6 und durch eine Terminalausgabe dokumentiert; wer diese Kontrolle nicht benötigt, kann die entsprechenden Codezeilen entfernen.
Um die Daten aus dem EEPROM auszulesen, kann man das nächste Programm benutzen.
Das Programm wartet vor dem Auslesen der EEPROM-Daten 5 Sekunden; dies gibt die Gelegenheit, nach dem Starten des Terminalprogramms ggf. das häufig beim Einschalten produzierte Byte 255 rechtzeitig im Terminalfenster zu löschen. Dann kann man nach der Datenübertragung die Datensätze im EXCEL-Format speichern (4 Spalten!).
Das folgende BASCOM-Programm speichert bei jeder Betätigung derTaste Ta0 (angeschlossen an PortD.2) die Zeit (hh:mm:ss) im EEPROM, beginnend mit der EEPROM-Adresse 0 sowei die zugehörige Temperatur. Jeder einzelne Eintrag wird duch ein einziges Byte repräsentiert; ein Datensatz besteht also aus 4 Bytes. Auf die Verwendung lokaler Variablen wurde hier bewusst verzichtet. Zu Testzwecken wird der EEPROM-Schreibvorgang durch eine LED an PortD.6 und durch eine Terminalausgabe dokumentiert; wer diese Kontrolle nicht benötigt, kann die entsprechenden Codezeilen entfernen.
Code: Alles auswählen
' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Tempertatur- und Timestamplogger mit dem LM75 un dem Tiny-RTC-Modul
' Bei jedem Betätigen von Ta0 werden ein Timestamp (Uhrzeit: hh:mm:ss)
' und die Temperatur auf dem EEPROM abgespeichert.
' Zur Kontrolle werden alle Werte auch an ein Terminal gesendet.
' LED an PortD.6 zur Kontrolle des Schreibvorgangs
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600
$framesize = 40
'**********************************************************
'******************* Deklarationen ************************
Dim Clockadr0 As Byte
Dim Clockadr1 As Byte
Dim Eepromadr0 As Byte
Dim Wert As Byte
Dim Lownibble As Byte
Dim Highnibble As Byte
Dim Gefunden As Byte
Dim Adresse As Word
Dim Sekunden As Byte
Dim Minuten As Byte
Dim Stunden As Byte
Dim Temperatur As Byte
Dim Tempadr1 As Byte
Declare Sub Clocklesen()
Declare Sub Temperaturlesen()
Declare Sub Loggen()
Declare Sub Schreiben(a As Word , W As Byte)
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
Clockadr0 = 208 'Adresse im write-Modus
Clockadr1 = Clockadr0 + 1 'Adresse im read-Modus
Eepromadr0 = 160
Tempadr1 = 159
Config Scl = Portb.7
Config Sda = Portb.5
Waitms 20
'**********************************************************
'******************** Hauptprogramm ***********************
Adresse = 0 'Startadresse für EEPROM-Aufzeichnung
Do
Do
Loop Until Pind.2 = 0
Call Loggen()
Loop
'**********************************************************
'******************* Unterprogramme ***********************
Sub Temperaturlesen()
I2cstart
I2cwbyte Tempadr1
I2crbyte Temperatur , Nack
I2cstop
Waitms 300
End Sub
Sub Loggen()
Call Temperaturlesen()
Call Clocklesen()
Call Schreiben(adresse , Stunden)
Adresse = Adresse + 1
Call Schreiben(adresse , Minuten)
Adresse = Adresse + 1
Call Schreiben(adresse , Sekunden)
Adresse = Adresse + 1
Call Schreiben(adresse , Temperatur)
Adresse = Adresse + 1
Waitms 100
End Sub
Sub Clocklesen
'Adressieren (write)
I2cstart
I2cwbyte Clockadr0
Gefunden = Not Err
If Gefunden = 1 Then
I2cwbyte 0 'Regpointer DS1307-RAM auf 0
I2cstop
I2cstart
'Adressieren (read)
I2cwbyte Clockadr1
'Sekunden lesen
I2crbyte Wert , Ack 'Nach Ack wird automatisch das nächste Register ausgelesen
Lownibble = Wert Mod 16 'BCD-Code!
Highnibble = Wert / 16
Wert = 10 * Highnibble
Sekunden = Wert + Lownibble
'Minuten lesen
I2crbyte Wert , Ack 'Nach Ack wird automatisch das nächste Register ausgelesen
Lownibble = Wert Mod 16
Highnibble = Wert / 16
Wert = 10 * Highnibble
Minuten = Wert + Lownibble
'Stunden lesen
I2crbyte Wert , Nack
Wert = Wert And &B00111111
Lownibble = Wert Mod 16
Highnibble = Wert / 16
Wert = 10 * Highnibble
Stunden = Wert + Lownibble
End If
I2cstop
End Sub
Sub Schreiben(a As Word , W As Byte)
Local H As Byte
Local L As Byte
H = High(a)
L = Low(a)
I2cstart
I2cwbyte Eepromadr0
Gefunden = Not Err
If Gefunden = 1 Then
Portd.6 = 1 'Bei jedem Schreibvorgang blitzt LED an PortD.6 auf
I2cwbyte H
I2cwbyte L
I2cwbyte W
Printbin W 'zur Kontrolle zum Terminal
I2cstop
Waitms 100 'Zeit zum Brennen
Portd.6 = 0
End If
End Sub
Code: Alles auswählen
' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Temperaturlogger-Ausgabe (hh:mm:ss:Temperatur)
' Ausgabe über Terminal
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600
$framesize = 40
'**********************************************************
'******************* Deklarationen ************************
Declare Function Lesen(a As Word) As Byte
Declare Sub Schreiben(a As Word , W As Byte)
Dim Adresse As Word
Dim Adrlow As Byte
Dim Adrhigh As Byte
Dim Wert As Byte
Dim Gefunden As Byte
Dim Eepromadr0 As Byte
Dim Eepromadr1 As Byte
Dim Datensaetze As Word
Dim Maxdat As Word
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
Eepromadr0 = 160 'Adresse im write-Modus
Eepromadr1 = Eepromadr0 + 1 'Adresse im read-Modus
Config Scl = Portb.7
Config Sda = Portb.5
Datensaetze = 100 'maximal 1024
Wait 5
'**********************************************************
'******************** Hauptprogramm ***********************
Maxdat = 4 * Datensaetze
Maxdat = Maxdat - 1
For Adresse = 0 To Maxdat
Wert = Lesen(adresse)
Printbin Wert
Waitms 2
Next Adresse
End
'**********************************************************
'******************* Unterprogramme ***********************
Sub Lesen(a As Word) As Byte
Local H As Byte
Local L As Byte
Local W As Byte
H = High(a)
L = Low(a)
I2cstart
I2cwbyte Eepromadr0
I2cwbyte H
I2cwbyte L
I2cstop
'Adressieren (read)
I2cstart
I2cwbyte Eepromadr1
I2crbyte W , Nack 'Nach Ack wird automatisch das nächste Register ausgelesen
I2cstop
Lesen = W
End Sub