Hallo,
ich habe eine ATmega8 und will damit über I2C einen Temperatursensor
DS1631 ansteuern.
Hat damit irgendwer schon etwas gemacht, evtl. fertiger Assembler Code?
Ich habe ein Problem beim Auslesen der Temperatur über I2C. Ich weiß
nicht genau, ob ich beim I2C das ACK-Bit beim Lesen selbst setzen muss,
oder ob mir dass der ATmega8 selbstständig macht (ich verwende die
integrierte TWI-Schnittstelle des ATmega)!
Initialisiert dürfte ich ich alles korrekt haben. Der Ablauf hängt aber
in Schleife "read4"
1 | ;Temperatur einlesen
|
2 | read_temp_ds1631:
|
3 | ldi tmp1, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
|
4 | out TWCR, tmp1
|
5 | read1: in tmp1, TWCR
|
6 | sbrs tmp1, TWINT
|
7 | rjmp read1
|
8 |
|
9 | ldi tmp1, 0x91 ;HW-adresse
|
10 | out TWDR, tmp1
|
11 | ldi tmp1, (1<<TWINT) | (1<<TWEN)
|
12 | out TWCR, tmp1
|
13 | read2: in tmp1, TWCR
|
14 | sbrs tmp1, TWINT
|
15 | rjmp read2
|
16 |
|
17 | ldi tmp1, 0xAA ;Befehl zum Lesen der Temp
|
18 | out TWDR, tmp1
|
19 | ldi tmp1, (1<<TWINT) | (1<<TWEN)
|
20 | out TWCR, tmp1
|
21 | read3: in tmp1, TWCR
|
22 | sbrs tmp1, TWINT
|
23 | rjmp read3
|
24 |
|
25 | ldi tmp1, (1<<TWINT) | (1<<TWEN)
|
26 | out TWCR, tmp1
|
27 | read4: in tmp1, TWCR
|
28 | sbrs tmp1, TWINT
|
29 | rjmp read4
|
30 |
|
31 | in TH, TWDR ;TH Daten auslesen
|
32 |
|
33 | ldi tmp1, (1<<TWINT) | (1<<TWEN)
|
34 | out TWCR, tmp1
|
35 | read5: in tmp1, TWCR
|
36 | sbrs tmp1, TWINT
|
37 | rjmp read5
|
38 |
|
39 | in TL, TWDR ;TL Daten auslesen
|
40 |
|
41 | ldi tmp1, (1<<TWINT) | (1<<TWEA) | (1<<TWEN)
|
42 | out TWCR, tmp1
|
43 | read6: in tmp1, TWCR
|
44 | sbrs tmp1, TWINT
|
45 | rjmp read6
|
46 |
|
47 | ldi tmp1, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
|
48 | out TWCR, tmp1
|
49 |
|
50 | ret
|
Vielen Dank für eure Hilfe!