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!
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.
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.
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
Ist damit vielleicht eventuell das Configuration/Status Register gemeint (vgl. Data Sheet, p. 5) ?
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:
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?
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.
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?
Hat sich geklärt, ich habe da etwas falsch verstanden.
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.
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.
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.
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
Ich lese aber nur das High-Ordered-Byte aus, also absolute Temperaturwerte ohne Nachkommastellen.
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?
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
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!
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?
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?
R.M. schrieb: > Was könnte da schief gelaufen sein? du hast den original Code nicht gesendet, anhand man das analysieren könnte
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 |
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".
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")
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?
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?
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?
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.
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.
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.
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?
Das ganze wird dann unmittelbar vor dem Repeated Start, nach dem gelesen wird, eingespielt
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.