Jacob Pirna Startseite [www.pirnaer.de] >> [AVR/Atmel Mikrocontroller] >> BASCOM Beispiele für myAVR
[Grundgerüst LCD] [Echtzeit Uhr DS1307] [Temperaturmessung mit DS1820] [I2C (TWI) EEPROM]


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.


Anbringung des DS1820 am myAVR

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.

Das myAVR Board 2.0 mit LCD und experimentellem DS1820

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

(c) Hans-Jürgen Jacob 2007 Pirna