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