Beispiel für myAVR Board mit LCD Display und Temperatursensor DS1820
Der Temperatursensor DS1820 ist für die 1wire Schnittstelle vorgesehen. Er hat den Vortei, das er nicht kallibriert werden muß und sofort einsatzbereit ist.
Als Erstes ein einfaches Beispiel für nur einen Sensor. Das heist ich muss den Sensor nicht expliziet anwählen, da es ja nur einen gibt.
'------------------------------------------------------------------------------
' LCD: Db4-Db7 = Portd.4-Portd.7 E = Portd.3 Rs = Portd.2 Backlight = Portb.1
' I2C: Sda = Portc.4 Scl = Portc.5
' UART: RxD = Portd.0 TxD = Portd.1
' 1wire Portb.0
' Frei: Portb.2-Portb.5 Portc.0-Portc.3
'------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686411
' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5
Dim Ar(2) As Byte
Cls
Do
1wreset
1wwrite &HCC
1wwrite &H44
1wreset
1wwrite &HCC
1wwrite &HBE
Ar(1) = 1wread(2)
Waitms 500
Locate 1 , 1
Lcd Hex(ar(2)) ; Hex(ar(1))
Locate 2 , 1
Shift Ar(1) , Right , 1
Lcd Ar(1)
Loop
End
Im Beispiel oben wird in der ersten Displayzeile das Ergebnis aus dem Temperatursensor hexadezimal angezeigt. In der Zweiten Zeile wird die Temperatur ohne Nachkommastellen angezeigt.
 |
Port C Pin 5 ist in der Hardware des ATmega8 für die I2C (TWI) Schnittstelle reserviert. Ich habe das Pin aber gewählt weil man da mehr oder weniger wie im Bild zu sehen am besten den DS1820 zum Testen drauf stecken kann. In dem Fall geht natürlich dann die I2C (TWI) Schnittstelle nicht mehr.
Hier geht es aber auch nur darum mal das Prinzip zu verstehen. Wenn man mehr als einen Temperatursensor DS1820 hat muss man ihn über seine Adresse ansprechen (die vom Hersteller eingebrannt ist), die man vorher noch ermitteln muss. Der Datenausgang des DS1820 muss auch noch mit einem Widerstand (ca. 10kOhm) gegen +5 Volt verbunden werden, den ich hier nur mal behelfsmäßig mit aufgesteckt habe.
Beim Hersteller des myAVR Boards gibt es auch ein Temperaturmodul für den I2C (TWI) Bus mit dem LM75 (9,95 Euro Stand 02/2007). Für Experimente finde ich das auch genial alles über einen Bus, in der Praxis eher weniger geeignet. Da der I2C (TWI) Bus als Geräte interner Bus für Entfernungen unter einem Meter konzipiert ist, während der 1wire Bus für Entfernungen bis zu 500 Metern geeignet ist. Und ich in der Praxis doch auch gern mal entfernte Temperaturen messen will.
|
Ermitteln der einzelnen Adressen bei mehreren Sensoren. Einfach für jeden Sensor erstmal die Anzeige abschreiben. Mit dieser Adresse kann dann der DS1307 direkt angesprochen werden.
'------------------------------------------------------------------------------
' LCD: Db4-Db7 = Portd.4-Portd.7 E = Portd.3 Rs = Portd.2 Backlight = Portb.1
' I2C: Sda = Portc.4 Scl = Portc.5
' UART: RxD = Portd.0 TxD = Portd.1
' 1wire Portb.0
' Frei: Portb.2-Portb.5 Portc.0-Portc.3
'------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686411
' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5
Dim Ar(8) As Byte
Dim I As Byte
Dim Nr As Byte
Nr = 1
Cls
' Ersten angeschlossenen DS1820 finden und Adresse auslesen
Ar(1) = 1wsearchfirst()
Locate 1 , 1 : Lcd "DS1307 Nr " ; Nr : Nr = Nr + 1
Locate 2 , 1
For I = 1 To 8
Lcd Hex(ar(i))
Next
' 10 Sekunden warten
Wait 10
Do
Ar(1) = 1wsearchnext()
If Err = 0 Then
Locate 1 , 1 : Lcd "DS1307 Nr " ; Nr : Nr = Nr + 1
Locate 2 , 1
For I = 1 To 8
Lcd Hex(ar(i))
Next
Wait 10
End If
Loop Until Err = 1
Do
Waitms 100
Loop
End
|