Forum: Mikrocontroller und Digitale Elektronik Temperatursensor DS1621 über I²C ansteuern


von R.M. (Gast)


Lesenswert?

Hallo!

Ich bin noch ein Anfänger auf dem Gebiet der 
Mikrocontrollerprogrammierung und bin momentan dabei, ein 
Datenloggersystem zu programmieren, das Temperaturdaten über den Sensor 
DS1621 über eine TWI/I²C-Leitung empfängt und dann via I²C diese Daten 
auf einem Slave EEPROM (Atmel 24C64) abspeichert. Koordiniert werden 
diese Aktionen vom Master IC Atmel ATmega8.

Die I²C-Schnittstellen zum EEPROM ließen sich bisher einwandfrei 
programmieren, nun aber habe ich Probleme mit der Ansteuerung des 
Temperatursensors, in dessen Datenblatt ich mich sehr schlecht 
zurechtfinde.

Ich programmiere in Assembler (Entwicklungsumgebung AVR Studio) und 
möchte von dem DS1621 Temperaturwerte empfangen. Dies sollte über eine 
Master Receiver-Benutzung des TWI seitens meines ATmega8 funktionieren.

Dazu sende ich eine Startbedingung, und übermittle auf die TWI-Leitung 
den Wunsch, schreiben zu wollen mitsamt der Adresse des 
Temperatursensors auf die TWI-Leitung und warte, bis der 
Temperatursensor sein ACK sendet.

Und wie geht es nun weiter? Im Datenblatt ist in der schmematischen 
Grafik dazu die Übertragung eines sogenannten "Command Byte" vorgesehen, 
aber ich weiß nicht, was ich denn mit diesem machen soll, bzw., was es 
überhaupt bezwecken soll.

Normalerweise müsste ich doch nun lediglich eine repeated Startbedingung 
senden, und dann einzeln die Temperaturwerte empfangen können, um 
schließlich mit einer NACK-Übertragung und einer Stop-Bedingung zu 
enden.

Kann mir jemand eventuell freundlicherweise erklären, wie ich die für 
Ansteuerung des Sensors nun schrittweise vorgehen muss, um den vom IC 
aktuell gemessenen Temperaturwert zu erhalten?


Besten Dank im Vorraus!

von A.Finder (Gast)


Lesenswert?

R.M. schrieb:
> Besten Dank im Vorraus!Beitrag melden

Zum Glück gibt es hier im Forum schon 191 Threads zum DS1621. Ohne die 
jetzt im einzelnen alle durchgelesen zu haben, werden da wohl 
ausreichend viele funktionsfähige Code-Beispiele dabei sein.

von R.M. (Gast)


Lesenswert?

Ich habe allerdings noch nirgendwo etwas über dieses mysteriöse "Command 
Byte" gelesen. Es geht mir auch weniger um den Code, sondern mehr um 
eine allgemeine Anleitung, wie ich nun weiter vorzugehen habe.

von Cyblord -. (cyblord)


Lesenswert?

Im Datenblatt stehen die Kommando-Bytes. Also wo ist das Problem?
Das ist hier im Forum sogar verlinkt. Scrollst du runter, findest du den 
Abschnitt "Command Set". Auch der Ablauf der I2C Kommunikation im Bezug 
auf diese Kommandos ist da haarklein beschrieben.
Man muss schon senil sein um das nicht zu finden und dafür einen Thread 
aufzumachen.

gruß cyblord

von R.M. (Gast)


Angehängte Dateien:

Lesenswert?

Ist damit vielleicht eventuell das Configuration/Status Register gemeint 
(vgl. Data Sheet, p. 5) ?

von Cyblord -. (cyblord)


Lesenswert?

R.M. schrieb:
> Ist damit vielleicht eventuell das Configuration/Status Register gemeint
> (vgl. Data Sheet, p. 5) ?

Schau doch mal auf Seite 10.

Was hat das Config bzw. Statsu register damit zu tun? Dir gehts doch um 
die Befehle. Lies doch einfach mal das Datenblatt der Reihe nach durch? 
Was meinst du für wen das Ding geschrieben wurde? Für alle außer dich, 
damit die das lesen und dir das dann erzählen können was drinnsteht?

Seite 10: Dort heißt es "Command Set - Table 3". Und eine Seite darüber 
werden die Kommandos beschrieben. Kannst du lesen?

Da steht:

COMMAND SET
Data and control information is read from and written to
the DS1621 in the format shown in Figure 5. To write to
the DS1621, the master will issue the slave address of
the DS1621, and the R/W bit will be set to 0. After receiving
an acknowledge, the bus master provides a command
protocol. After receiving this protocol, the DS1621
will issue an acknowledge, and then the master may
send data to the DS1621. If the DS1621 is to be read,
the master must send the command protocol as before,
and then issue a repeated START condition and the
control byte again, this time with the R/W bit set to 1 to
allow reading of the data from the DS1621. The command
set for the DS1621 as shown in Table 3 is as follows:

von R.M. (Gast)


Lesenswert?

Da habe ich tatsächlich etwas übersehen.

Da sich dieser Sensor aber deutlich von meinen bisherigen I²C-Arbeiten 
unterscheidet, habe ich noch eine Frage: Durch Setzen von Bytes 
(beispielsweise 10000000 --> Read Temperature) kann ich also Aktionen 
auslösen? Hat dieser Sensor dann quasi schon vordefinierte Methoden, mit 
denen er arbeiten kann?

Könnte die Ansteuerung prinzipiell folgendermaßen funktionieren:
1. Startbedingung
2. Adressübermittlung --> DS1621-Adresse + Schreiben
3. Commando Register --> Start Convert T
4. Startbedingung
5. Adressübermittlung --> DS1621-Adresse + Lesen
6. Commando Register --> Temperatur lesen
7. Commando Register --> Stop Convert T
8. Stopbedingung

Noch eine Frage: Muss ich zwangsweise diese Werte "High Temp Trigger" 
und "Low Temp Trigger" festlegen, und damit mit dem Ausgang T(OUT) 
arbeiten?

von Cyblord -. (cyblord)


Lesenswert?

R.M. schrieb:

> Durch Setzen von Bytes
> (beispielsweise 10000000 --> Read Temperature) kann ich also Aktionen
> auslösen? Hat dieser Sensor dann quasi schon vordefinierte Methoden, mit
> denen er arbeiten kann?

Für ein "setzen"? Du sendest ein Bytes. Wenn du ein Kommando sendest 
dann führt er es aus. Das haben "Kommandos" so an sich. Das ist halt 
keiner reiner Speicher wie ein EEPROm, von dem man nur Daten holt und 
dahin speichert, sondern man kommuniziert halt etwas komplexer.

> Noch eine Frage: Muss ich zwangsweise diese Werte "High Temp Trigger"
> und "Low Temp Trigger" festlegen, und damit mit dem Ausgang T(OUT)
> arbeiten?

k.a. müsste ich das Datenblatt zu lesen. Aber ich denke nein.

> Könnte die Ansteuerung prinzipiell folgendermaßen funktionieren:
Jetzt nimm dir halt das Datenblatt und probiers aus. Jetzt hab ich schon 
die Kommandos für dich gefunden, jetzt muss ich sie dir auch noch 
erklären? Schick mir doch einfach dein Projekt zu dann mach ich es dir 
fertig.

von R.M. (Gast)


Lesenswert?

Aber bevor ich Temperaturen lesen kann, muss ich dem IC erst einmal 
sagen, dass er beginnen soll, jene zu messen, oder?

Außerdem heißt es im Datenblatt:
// [...] the bus master provides a command
// protocol. After receiving this protocol, the DS1621
// will issue an acknowledge, and then the master may
// send data to the DS1621. [...]

Muss ich dieses Protokoll auslesen?

von R.M. (Gast)


Lesenswert?

Hat sich geklärt, ich habe da etwas falsch verstanden.

von R.M. (Gast)


Lesenswert?

Ich habe den Code nun implementiert. Der Temperatur IC liefert aber 
Temperturwerte zwischen 74 und 111 Grad Celsius (?) (bei Fahrenheit 
würde es ja noch Sinn machen). Ist das normal? Woher weiß ich, ob das 
nun °C oder °F sind?

Es ist nämlich relativ heiß gewesen, von dem her würden
111°C = 43.9°C
schon Sinn machen, genau wie im Schatten
74°F = 23.3°C.

von C.R.F. (Gast)


Lesenswert?

R.M. schrieb:
> Ich habe den Code nun implementiert. Der Temperatur IC liefert aber
> Temperturwerte zwischen 74 und 111 Grad Celsius (?) (bei Fahrenheit
> würde es ja noch Sinn machen). Ist das normal? Woher weiß ich, ob das
> nun °C oder °F sind?

Dazu guckst du am besten in das Datenblatt und in deine Ausgaberoutine.
Anhand der Tabelle 2 (Temperature/Data relationship) sollte es doch 
möglich sein, den (uns unbekannten) Digital Output deines Sensors auf 
der Celsiusskala einzuordnen. Dann kommt es auf deine Software drauf an, 
ob der Hex-Wert richtig umgerechnet wird und auf welche Temperaturskala 
die Ausgabe skaliert wird.

von R.M. (Gast)


Lesenswert?

Wenn ich die Tabelle im Datenblatt hernehme (was ich natürlich getan 
habe), ist da aber ein relativ einfaches Schema zu erkennen: Das erste 
Bit des High-Ordered-Byte dient dem Vorzeichen, und der Binärwert danach 
ist umgerechnet in das Dezimalsystem dann einfach der Temperaturwert. 
Deswegen weiß ich jetzt auch einfach nicht, warum das theoretisch Grad 
Fahrenheit sein könnten - es würde nur Sinn machen.

von C.R.F. (Gast)


Lesenswert?

R.M. schrieb:
> Das erste Bit des High-Ordered-Byte dient dem Vorzeichen, und der
> Binärwert danach ist umgerechnet in das Dezimalsystem dann einfach der
> Temperaturwert.

Nicht ganz. Das MSB ist die Temperatur in Grad Celsius als 
Zweierkomplement. Vom LSB wird nur das oberste Bit benutzt und hat ein 
Gewicht von 1/2 Grad-C

von R.M. (Gast)


Lesenswert?

Ich lese aber nur das High-Ordered-Byte aus, also absolute 
Temperaturwerte ohne Nachkommastellen.

von R.M. (Gast)


Lesenswert?

Noch eine Frage, da ich vielleicht einen anderen Fehler gemacht habe: 
Wenn ich z.B. die Operation "Read Temperature" durchführen will, welchen 
Wert muss ich dann der Datenleitung für das Command Byte übergeben? Und 
was bedeutet das "AAh" dahinter in Klammern?

von C.R.F. (Gast)


Lesenswert?

R.M. schrieb:
> Wenn ich z.B. die Operation "Read Temperature" durchführen will, welchen
> Wert muss ich dann der Datenleitung für das Command Byte übergeben? Und
> was bedeutet das "AAh" dahinter in Klammern?

"AAh" ist das Command Byte für das Lesen des Temperaturregisters

von R.M. (Gast)


Lesenswert?

Und was heißt das? Ich kann mit dem Begriff "AAh" gerade nichts 
anfangen. Was muss ich denn machen, um das dem Ic mitzuteilen? Ich muss 
ihm ja in einem Byte mitteilen: Read temperature!

von R.M. (Gast)


Lesenswert?

Ich hatte es aktuell so gelöst, dass ich via Datenleitung das so 
übergeben habe:
0b10000000 --> Read Temperature
0b01000000 --> Read Counter
0b00100000 --> Read Slope
u.s.w.

Aber ich glaube, das geht nicht so ...
Wie geht es dann?

von R.M. (Gast)


Lesenswert?

Geklärt. Das "h" steht also für Hexadezimal!

von R.M. (Gast)


Lesenswert?

Ich habe nun den Algorithmus implementiert, aber es scheint, als ob die 
Temperatur, egal ob ich jetzt einen Föhn über den Sensor halte oder er 
im kühlen Schatten steht, konstant 15 Grad Celsius ist.

Mein Algorithmus sieht wie folgt aus:
1. Startbedingung
2. Übermitteln der Adresse des DS1621 + Write Operation
3. Datenübertragung: Kommando "Start Convert T"
4. Repeated Startbedingung
5. Übermitteln der Adresse des DS1621 + Write Operation
6. Datenübertragung: Kommando "Access TH"
7. Repeated Startbedingung
8. Übermitteln der Adresse des DS1621 + Read Operation
9. Auslesen des TWI-Datenregisters
10. Senden eines NACK
11. Repeated Startbedingung
12. Übermitteln der Adresse des DS1621 + Write Operation
13. Datenübertragung: Kommando "Stop Convert T"
14. Stopbedingung

Damit dürfte ich doch die ganzzahligen Temperaturwerte empfangen. Die 
I2C-Library dürfte eigentlich keine Fehler enthalten, denn die 
Kommunikation mit dem externen EEPROM funktioniert einwandfrei.

Was könnte da schief gelaufen sein?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

R.M. schrieb:
> Was könnte da schief gelaufen sein?

du hast den original Code nicht gesendet, anhand man das analysieren 
könnte

von R.M. (Gast)


Lesenswert?

Das ist der Code zur Ansteuerung des DS1621, noch unoptimiert und ohne 
Trennung von der eigentlichen I²C-Logik.
1
TWI_MASTER_HEAT_DETECTOR:
2
  ; Startbedingung
3
    rcall  TWI_START_CONDITION
4
  ; Wohin gehen die Daten denn nun?  - Mitteilen der Slave-Adresse
5
    out  TWDR,  SLA_W    
6
    in  temp1,  TWCR    ; TWCR wird bearbeitet
7
    sbr  temp1,  0b10000100  
8
    cbr  temp1,  0b00110010  
9
    out  TWCR,  temp1    
10
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
11
    rcall TWINT_WAIT
12
    ; Prüfen des TWI Status Register -> wurde die Adresse akzeptiert? Ist der Slave ansprechbar?
13
    in  temp1,  TWSR
14
    andi  temp1,  0b11111000  
15
    cpi  temp1,  0b00011000  
16
    brne  TWI_BREAK_3      
17
  ; Senden eines Commando Bytes an den Temperatursensor
18
    in  temp1,   TWDR
19
    ldi  temp1,  0b11101110  ; Befehl "Beginne mit der Temperaturmessung!"
20
    out  TWDR,   temp1
21
    in  temp1,  TWCR    ; TWCR wird bearbeitet
22
           sbr  temp1,  0b10000100  
23
    cbr  temp1,  0b00110010  
24
    out  TWCR,  temp1    
25
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
26
    rcall TWINT_WAIT
27
  ; Prüfen des TWI Status Register -> wurden die Daten akzeptiert? 
28
    in  temp1,  TWSR
29
    andi  temp1,  0b11111000  
30
    cpi  temp1,  0b00101000  
31
    brne  TWI_BREAK_3      
32
  ; Repeated Start
33
    rcall  TWI_REPEATED_START_CONDITION
34
  ; Wohin gehen die Daten denn nun?  - Mitteilen der Slave-Adresse
35
    out  TWDR,  SLA_W    
36
    in  temp1,  TWCR    
37
    cbr  temp1,  0b00110010  
38
    out  TWCR,  temp1    
39
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
40
    rcall TWINT_WAIT
41
    ; Prüfen des TWI Status Register -> wurde die Adresse akzeptiert?     in  temp1,  TWSR
42
    andi  temp1,  0b11111000  
43
    cpi  temp1,  0b00011000  
44
    brne  TWI_BREAK_3      
45
  ; Senden eines Commando Bytes an den Temperatursensor
46
    in  temp1,  TWDR
47
    ldi  temp1,  0b10100001  ; Befehl "Lese das oberste Temperaturbyte (Temperatur ganzzahlig)"
48
    out  TWDR,   temp1
49
    in  temp1,  TWCR    ; TWCR wird bearbeitet
50
           sbr  temp1,  0b10000100  
51
    cbr  temp1,  0b00110010  
52
    out  TWCR,  temp1    
53
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
54
    rcall TWINT_WAIT
55
  ; Prüfen des TWI Status Register -> wurden die Daten akzeptiert? 
56
    in  temp1,  TWSR
57
    andi  temp1,  0b11111000  
58
    cpi  temp1,  0b00101000  
59
    brne  TWI_BREAK_3      
60
  ; Startbedingung
61
    rcall TWI_REPEATED_START_CONDITION
62
  ; Wohin gehen die Daten denn nun?  - Mitteilen der Slave-Adresse
63
    out  TWDR,  SLA_R    
64
    in  temp1,  TWCR    ; TWCR wird bearbeitet
65
    sbr  temp1,  0b10000100   
66
    cbr  temp1,  0b00110010  
67
    out  TWCR,  temp1    
68
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
69
    rcall TWINT_WAIT
70
    ; Prüfen des TWI Status Register -> wurde die Adresse akzeptiert? Ist der Slave ansprechbar?
71
    in  temp1,  TWSR
72
    andi  temp1,  0b11111000  
73
    cpi  temp1,  0b01000000  
74
    brne  TWI_BREAK_3      
75
  ; Aktivierung des TWEA im TWCR zum Senden eines ACK-Pulses nach Datenempfang 
76
    in  temp1,  TWCR
77
    sbr  temp1,  0b11000100  
78
    cbr  temp1,  0b00110010  
79
    out  TWCR,  temp1    
80
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
81
    rcall TWINT_WAIT
82
  ; Datenempfang und Abspeicherung
83
    in  temp1,  TWSR
84
    andi  temp1,  0b11111000  
85
    cpi  temp1,  0b01010000  
86
    brne  TWI_BREAK      
87
    in  temp_input,  TWDR  
88
  ; NACK für letztes Bit senden
89
    in  temp1,  TWCR
90
    sbr  temp1,  0b10000100  
91
    cbr   temp1,  0b00110010  
92
    out   TWCR,  temp1
93
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
94
    rcall TWINT_WAIT
95
  ; Prüfen des TWI Status Register --> Wurde das NACK-Bit empfangen? 
96
    in  temp1,  TWSR
97
    andi  temp1,  0b11111000  
98
    cpi  temp1,  0b01011000  
99
    brne  TWI_BREAK      
100
  ; Startbedingung
101
    rcall  TWI_REPEATED_START_CONDITION
102
  ; Wohin gehen die Daten denn nun?  - Mitteilen der Slave-Adresse
103
    out  TWDR,  SLA_W    
104
    in  temp1,  TWCR    ; TWCR wird bearbeitet
105
    sbr  temp1,  0b10000100  
106
    cbr  temp1,  0b00110010  
107
    out  TWCR,  temp1    
108
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
109
    rcall TWINT_WAIT
110
    ; Prüfen des TWI Status Register -> wurde die Adresse akzeptiert? Ist der Slave ansprechbar?
111
    in  temp1,  TWSR
112
    andi  temp1,  0b11111000  
113
    cpi  temp1,  0b00011000  
114
    brne  TWI_BREAK      
115
  ; Senden eines Commando Bytes an den Temperatursensor
116
    in  temp1,  TWDR
117
    ldi  temp1,  0b00100010  ; Befehl "Ende mit der Temperaturmessung!"
118
    out  TWDR,  temp1
119
    in  temp1,  TWCR    
120
    cbr  temp1,  0b00110010  
121
    out  TWCR,  temp1    
122
  ; Warten, bis das TWINT-Flag wieder gesetzt wird
123
    rcall TWINT_WAIT
124
  ; Prüfen des TWI Status Register -> wurden die Daten akzeptiert? 
125
    in  temp1,  TWSR
126
    andi  temp1,  0b11111000  
127
    cpi  temp1,  0b00101000  
128
    brne  TWI_BREAK      
129
         ; Senden der Stopbedingung an die TWI-Leitung (steigende Spannungsflanke auf der Datenleitung)
130
    in    temp1,   TWCR
131
    sbr  temp1,  0b10010100  
132
    cbr  temp1,  0b00100010  
133
    out   TWCR,  temp1    ; Und ... STOP!
134
  ; Rückkehr zum Hauptprogramm
135
    ret

von R.M. (Gast)


Lesenswert?

Wieso sendet der DS1621 stets einen konstanten Wert von 15 beiu o.g. 
Programmtext? Der Wert steht dann immer im Register "temp_input", auch 
wenn ich es unmittelbar davor "cleare".

von C.R.F. (Gast)


Lesenswert?

Warum läßt du die Messung nicht erstmal durchlaufen (1SHOT = "0").
Evtl. liest du im Moment das Temperaturregister, bevor die Messung 
beendet ist (DONE="1")

von R.M. (Gast)


Lesenswert?

Meinst du also, ich sollte ein Commando Byte losschicken, dass mir 
solange den Wert "DONE" aus dem Configuration-Register zurückgibt, bis 
dieser 1 ist, und dann erst auslesen?

von Cyblord -. (cyblord)


Lesenswert?

R.M. schrieb:
> Meinst du also, ich sollte ein Commando Byte losschicken, dass mir
> solange den Wert "DONE" aus dem Configuration-Register zurückgibt, bis
> dieser 1 ist, und dann erst auslesen?

Oder warte einfach einige Sekunden. Zum testen reicht das. Später dann 
auf "DONE" pollen. Steht im Datenblatt nichts zur Dauer des 
Messvorgangs?

von R.M. (Gast)


Lesenswert?

Was meinst du mit "durchlaufen"? Wenn ich das Bit in 1SHOT auf 0 setze, 
dann würde das ja eine ständige Messung bedeuten und DONE würde nie 1 
werden, oder?

von Cyblord -. (cyblord)


Lesenswert?

R.M. schrieb:
> Was meinst du mit "durchlaufen"? Wenn ich das Bit in 1SHOT auf 0 setze,
> dann würde das ja eine ständige Messung bedeuten und DONE würde nie 1
> werden, oder?

Eine Messung "durchlaufen" lassen ist doch ein deutscher Satz. Was gibts 
denn da nicht zu verstehen? Du startest die Messung, lässt sie in Ruhe 
bis sie fertig ist. Und dann erst liest du das Ergebniss aus. Ist doch 
auch irgendwie von Logik getragen dieser Vorschlag oder? Darf man fragen 
wie alt du bist? Dann könnte man die Antworten eventuell besser 
anpassen.

von R.M. (Gast)


Lesenswert?

Im Datenblatt heißt es dazu:

One Shot Mode. If 1SHOT is “1”, the DS1621
will perform one temperature conversion
upon reception of the Start Convert T protocol.
If 1SHOT is “0”, the DS1621 will continuously
perform temperature conversions. This
bit is nonvolatile.


Das heißt, 1SHOT auf 0 zu setzen würde bedeuten, dass die Messung 
STÄNDIG vonstatten geht, falls ich das richtig verstande habe.

von C.R.F. (Gast)


Lesenswert?

R.M. schrieb:
> Was meinst du mit "durchlaufen"? Wenn ich das Bit in 1SHOT auf 0 setze,
> dann würde das ja eine ständige Messung bedeuten und DONE würde nie 1
> werden, oder?Beitrag melden Bearbeiten Löschen

Schon, aber du müßtest nur einmal starten und der Sensor würde 
selbständig immer einen aktuellen Wert im Temperaturregister ablegen. Du 
kannst das letzte Wandlungsergebnis dann jederzeit mit "Read 
Temperature" abholen.

Der Wandler braucht 750ms für die Wandlung und du gibt ihm im Moment 
keine Zeit dafür, sondern versuchst schon nach ein paar µs zu lesen.

von R.M. (Gast)


Lesenswert?

Ich habe das jetzt mal ausprogrammiert:
1
HEAT_DETECTOR_WAIT:  
2
   ; Repeated Start
3
     rcall   TWI_REPEATED_START_CONDITION
4
    ; Wohin gehen die Daten denn nun?  - Mitteilen der Slave-Adresse
5
     out  TWDR,  SLA_W  
6
     in  temp1,  TWCR    ; TWCR wird bearbeitet
7
     sbr  temp1,  0b10000100  
8
     cbr  temp1,  0b00110010  
9
     out  TWCR,  temp1    
10
   ; Warten, bis das TWINT-Flag wieder gesetzt wird
11
     rcall TWINT_WAIT
12
     ; Prüfen des TWI Status Register -> wurde die Adresse akzeptiert?     in  temp1,  TWSR
13
     andi  temp1,  0b11111000  
14
     cpi  temp1,  0b00011000  
15
     brne  TWI_BREAK      
16
   ; Senden eines Commando Bytes an den Temperatursensor
17
     in  temp1,  TWDR
18
     ldi  temp1,  0b00100010  ; Befehl "Auslesen des Konfigurationsregisters!"
19
     out  TWDR,  temp1
20
     in  temp1,  TWCR    ; TWCR wird bearbeitet
21
       sbr  temp1,  0b10000100  
22
     cbr  temp1,  0b00110010  
23
     out  TWCR,  temp1    
24
   ; Startbedingung
25
     rcall TWI_REPEATED_START_CONDITION
26
   ; Wohin gehen die Daten denn nun?  - Mitteilen der Slave-Adresse
27
     out  TWDR,  SLA_R    
28
     in  temp1,  TWCR    ; TWCR wird bearbeitet
29
     sbr  temp1,  0b10000100     
30
     cbr  temp1,  0b00110010  
31
     out  TWCR,  temp1    
32
   ; Warten, bis das TWINT-Flag wieder gesetzt wird
33
     rcall TWINT_WAIT
34
     ; Prüfen des TWI Status Register -> wurde die Adresse akzeptiert?      in  temp1,  TWSR
35
     andi  temp1,  0b11111000  
36
     cpi  temp1,  0b01000000  
37
     brne  TWI_BREAK_3      
38
    ; Aktivierung des TWEA im TWCR zum Senden eines ACK-Pulses nach Datenempfang 
39
     in  temp1,  TWCR
40
     sbr  temp1,  0b11000100  
41
     cbr  temp1,  0b00110010  
42
     out  TWCR,  temp1    
43
   ; Warten, bis das TWINT-Flag wieder gesetzt wird
44
     rcall TWINT_WAIT
45
   ; Datenempfang und Abspeicherung
46
     in  temp1,  TWSR
47
     andi  temp1,  0b11111000  
48
     cpi  temp1,  0b01010000  
49
     brne  TWI_BREAK      
50
     in  temp2,  TWDR  
51
   ; NACK für letztes Bit senden
52
     in  temp1,  TWCR
53
     sbr  temp1,  0b10000100  
54
     cbr   temp1,  0b00110010  
55
     out   TWCR,  temp1
56
   ; Warten, bis das TWINT-Flag wieder gesetzt wird
57
     rcall TWINT_WAIT
58
   ; Prüfen des TWI Status Register --> Wurde das NACK-Bit empfangen? 
59
     in  temp1,  TWSR
60
     andi  temp1,  0b11111000  
61
     cpi  temp1,  0b01011000  
62
     brne  TWI_BREAK      
63
   ; Prüfen des Registers: DONE?
64
     mov  temp1,  temp2
65
     andi  temp1,  0b10000000  ; Maskieren
66
     cpi  temp1,  0b10000000
67
     brne  HEAT_DETECTOR_WAIT
68
     ret

Sollte funktionieren, oder?

von R.M. (Gast)


Lesenswert?

Das ganze wird dann unmittelbar vor dem Repeated Start, nach dem gelesen 
wird, eingespielt

von R.M. (Gast)


Lesenswert?

Also der obige Programmtext funktioniert gar nicht. Und auch, wenn ich 
simple Warteschleifen der Länge ~1 Sekunde in den Programmtext einbaue, 
ändert das leider nichts an der Ausgabe "15".

Was kann ich da falsch gemacht haben?

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.