Forum: Mikrocontroller und Digitale Elektronik AtMega8 und LM75


von Lothar K. (lothark)


Lesenswert?

Hallo,

ich wollte mal was mit dem I2C-Bus machen. Ich baute dazu eine Schaltung 
auf und spielte diesen Code auf.

(Der Code ist nicht von mir und funktionierte auf Anhieb.)
1
$regfile = "m8def.dat"                                      'AVR ATMega 8...
2
$crystal = 16000000                                         '...mit 16 MHz
3
4
'---------- I²C Einsatellungen ----------
5
$lib "i2c_twi.lbx"
6
$hwstack = 32
7
$swstack = 10
8
$framesize  = 40                                          'Einbindung der I2C-Bibliothek (Hardware)
9
Config Twi = 100000                                         'i2c Frequenz einstellen
10
Config Sda = Portc.4                                        'i2c Port SDA am AVR
11
Config Scl = Portc.5                                        'i2c Port SCL am AVR
12
13
'---------- LCD Einstellungen ----------
14
Config Lcd = 16 * 2
15
16
Config Lcdpin = Pin , Db7 = Portb.0 , Db4 = Portb.3 , Db5 = Portb.1 , Db6 = Portb.2 , E = Portb.4 , Rs = Portb.5
17
Config Lcdbus = 4                                           '4 Bit Modus
18
Cursor Off Noblink                                          'LCD = Cursor aus
19
20
'---------- Variablen Deklaration ----------
21
Const Lm75slavewrite = &H9E                                 'A1 - A3 auf + = 1001(1)(1)(1)0
22
Const Lm75slaveread = &H9F                                  'write-Adr. +1 für read
23
Dim Lm75high As Byte
24
Dim Lm75low As Byte
25
Dim Temperatur As Integer
26
Dim Nachkommastelle As String * 2
27
28
'----------= HAUPTPROGRAMM =----------
29
Cls                                                         'LCD, Inhalt löschen
30
31
I2cinit                                                     'Anschaltung des I2C-Busses
32
33
Do
34
35
'Temperaturregister auswählen
36
I2cstart
37
I2cwbyte Lm75slavewrite
38
I2cwbyte &H00
39
40
'LM75 Abfrage
41
I2cstart
42
I2cwbyte Lm75slaveread
43
I2crbyte Lm75high , Ack
44
I2crbyte Lm75low , Nack
45
I2cstop
46
47
If Lm75high > 127 Then
48
 Temperatur = Lm75high And 127
49
 Temperatur = Not Temperatur
50
 Incr Temperatur
51
Else
52
 Temperatur = Lm75high
53
End If
54
55
Lm75low = Lm75low And 128
56
If Lm75low > 0 Then
57
 Nachkommastelle = ",5"
58
Else
59
 Nachkommastelle = ""
60
End If
61
62
Locate 1 , 1
63
Lcd "Temp.: " ; Temperatur ; Nachkommastelle ; " Grad   "
64
65
Wait 1
66
67
Loop
68
69
End
Da das Ganze so einfach erschien, baute ich die Schaltung mit einem 
ATMega8 in SMD auf. Bei der Inbetriebnahme ergab sich folgendes 
Phänomen.
Die Temperatur wird falsch angezeigt. Die Temperatur ist um genau 16 °C 
geringer.
Da ich die alte Schaltung noch habe, kann ich einen Defekt des LM75 
ausschließen.
Der einzige Unterschied zur Schaltung in SMD ist, dass ich jetzt keinen 
Quarz einsetze. Somit kann ich nur 8 MHz einstellen. Das kann doch 
eigentlich nicht die Ursache sein, oder? Natürlich habe ich auch im Code 
den Wert auf 8 MHz geändert.


Für einen Tipp wäre ich echt dankbar.
Schaltungsfehler kann ich ausschließen. Auch die 5 KOhm-Widerstände 
gegen U+ (SDA und SCL) sind vorhanden.

MfG LotharK

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.