AtMega8 und LM75

#3948472
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren