Moin,
ich habe versucht den Temperatursensor DS1620 mit einem ATmega16
anzusteuern. Den quelltext den ich dazu verwende, habe ich angehängt.
Die verkabelung müsste stimmen. Der ATmege ist auf 8Mhz getaktet. Ich
starte den sensor so:
1
ds1620_init();
2
ds1620_start();
3
4
uint16_ttemperatur=ds1620_read_temp();
Die temperatur gebe ich dann auf einem LC-Display aus. ICh erhalte immer
den wert 1FF aber das kann doch nicht sein oder? Ich habe hier eindeutig
nicht -0.5°C.
Gruß
JTAG ? (auf PORTC ist bei Atmega16 /32 u.ä. der JTAG-Port, und blockiert
dir dir wahrsch. das RST-signal)
evtl. musst du ein paar "nops" einbauen, laut datasheet, kann der sensor
nur mit max. 1,75MHz daten übertragen
Moin,
ich habe den Quelltext jetzt nochmal auf die von dir genannten dinge
überprüft und nachgearbeitet. Jetzt sollten alle von Datenblatt
geforderten Zeiten eingehalten werden.
Der JTAG sollte eigentlich durch unsere Fusebits deaktiviert sein. Zur
sicherheit haben wir auch noch mal den Port von C auf PortB umgelegt.
Ich habe diesmal alle Dateien angehängt die zum projekt gehören.
Vielleicht findet ihr ja fehler die ich nicht finde.
Komisch ist auch das wir auch nur einsen empfangen wenn gar nichts am
port liegt.
Gruß
Ich hab das hier für dich gefunden:
http://www.maxim-ic.com/appnotes.cfm/appnote_number/134
(ist gut kommentierter C-Code für einen 8051, kann man gut anpassen)
tipp: -pack(t) den Quellcode aller funktionen, die nicht "inline"
werden sollen in eine extra .c-Datei.
Vielen dank für den tipp. Leider hat mir das nicht viel weiter geholfen.
Ich habe einen kleinen fehler entdeckt. Ich habe immer vergessen Reset
wieder auf 0 zu setzten. Das habe ich nun korrigiert. Aber es
funktioniert trotztdem nicht.
Für mich wirft sich aber ein frage auf. In der von dir genannten seite
gibt es eine funktion zum lesen von 8-Bit zahlen und eine zum lesen von
9-Bit zahlen. Allerdings verstehe ich nicht warum die temperatur auf
diese weise ausgelesen wird:
1
RST=1;
2
Put1620byte(0xAA);/* read temp command */
3
temp_and_half_bit=Get1620byte();/* read 1st byte of temp */
4
sign_bit=Get1620byte();/* read 2nd byte of temp */
5
RST=0;
Warum wird dort zweimal ein Byte gelesen? Was für ein signal sendet der
DS1620 den nun? 16-Bit oder 9-Bit? Und was sendet er zuerst? Vorzeichen
oder Temperatur? Ich habe es in meiner ds1620_read_temp funktion einmal
mit 9-Bit und mit 16-Bit (in beiden reihenfolgen) versucht aber
vergeblich. Ich hänge nochmal den aktuellen quelltext an. Vielleicht
entdeckt ja noch jemand was.
Danke für deinen tip mit der trennung von deklaration und definition
aber das mache ich nicht weil ich dann immer alle makefiles auf stand
halten müsste...
Da werden 2 Byte gelesen, weil so nur eine Funktion gebraucht wird, die
eben eine Byte liest.
Der Sensor liefert die Temperatur mit dem Niedrigsten Bit (0.5°) zu
erst, Bit 8 (das 9te !) ist das Vorzeichen, wenn das gesetzt ist
müssen alle anderen Bits des Highbytes gesetzt werden (2er-komplement...
etc.)
Wichtiger ist: der Sensor muss in den "CPU"-Modus gebracht werden: das
CPU-Bit im Config register muss gesetzt werden, damit du überhaupt die
Temperatur auslesen kannst:
1
RST=1;
2
Put1620byte(0x0C);
3
Put1620byte(0x03);/* set to CPU & 1SHOT mode */
4
RST=0;
(ein Ausschnitt aus der App-Note)
- wenn "1SHOT" gesetzt ist muss jede Messung extra gestartet werden
- "DONE" kann ge"poll"t werden um zu erkennen, wenn der Sensor fertig
ist (nur sinnvoll wenn 1SHOT gesetzt ist)
außerdem steht auf der Titelseite "Converts temperature to digital word
in 750ms (max)" es dauert also etwas, bis eine Messung da ist
aus Interesse: Warum benutzt du(ihr?) einen so besch..eiden
anzusteuernden Sensor? (I2c, "richtiges" SPI, oder sogar 1wire sind
doch irgendwie leichter zu durchscauen ;) )
Ich habe den Code nochmal auf deine ratschläge hin überarbeitet. Aber
scheinbar mache ich irgendwas falsch. Ich kann noch nicht einmal die
configuration auslesen...
Die Bits sollten auch in der richtigen reihenfolge ausgelesen werden.
Muss ich nun nur 9 bits auslesen oder doch 16?
Zitat:
1
Der Sensor liefert die Temperatur mit dem Niedrigsten Bit (0.5°) zu
2
erst, Bit 8 (das 9te !) ist das Vorzeichen, wenn das gesetzt ist
3
müssen alle anderen Bits des Highbytes gesetzt werden (2er-komplement...
4
etc.)
Laut datenblatt sind die bits des high-bytes (vorzeichen) abgesehen von
Bit0 vollkommen egal.
Ich habe nun auch versucht den Sensor in den CPU modus zu versetzten und
den 1SHOT modus zu deaktivieren. Aber das klappt irgendwie nicht. Ich
habe das gefühl das meine read und write funktion irgendwo misst baut.
Kann du (jemand) sich die mal anschauen und sagen ob das alles so
richtig ist?
Ich habe jetzt auch mal verscuht den Sensor "unendlich" oft auszulesen.
Aber es kommen immer nur high signale. Beim auslesen der Temperatur
liefert meine read funktion 1FF (Sie liest ja nur 9 Bits der rest der
16Bit variable wird mit 0 initialisiert). Und das auslesen der Config
liefert mit FF. Ich verstehe es einfach nicht.
Hoffe ihr könnt mir helfen, den Quellcode habe ich wieder angehängt
(wegen der kleinen änderungen).
Gruß
Ist sicher, dass die Schaltung 'fehlerfrei' ist? ich kann keine Fehler
in den Lese- und Schreibfunktionen finden. Ich würde eher auf 'nen
Kurzschluß in der Schaltung tippen.
- der Tipp mit dem 2er komplement war eher für dei Weiterverarbeitung
gedacht: wenn die Zahl negativ ist, ist das MSB gesetzt.
das:
1
floatds1620_convert_temp(uint16_ttemperature)
2
{
3
if((temperature&0x0100)==1)
4
{
5
return(float)(temperature/2.0f);
6
}
7
else
8
{
9
temperature&=0x00FF;
10
temperature=(0xFF-temperature)+1;
11
return-(float)(temperature/2.0f);
12
}
13
}
ist verkehrt.
korrekt ist:
1
floatds1620_convert_temp(uint16_ttemperature)
2
{
3
if((temperature&0x0100)==1)
4
{
5
temperature|=~0xff00;//wenn die Zahl negativ ist, mit 1 auffüllen
6
}
7
8
return(temperature/2.0);
9
10
}
.. und im Makefile steht noch "F_OSC = 3686400", Ich weiß nicht, ob das
noch irgendwo verwendet wird, aber korrigier es (ist das gleiche wie
F_CPU)
So wir haben die leitungen jetzt überprüft. Eine war tatsächlich kaputt.
Wir haben sie von PB0 auf PB3 umgelegt. Aber es klappt immernoch nicht.
Wir wissen auch nicht mehr weiter. Kann uns einer helfen?
Und der Sensor ist noch ganz? richtig angeschlossen (VDD, GND, CLK, DQ
,\RST )?
Vielleicht ist der AVR zu schnell, setz mal das "_delay_us(1)" in der
For-Schleife von "ds1620_read(..)" vor die'if' abfrage
Wir haben die belegung der pins nochmal geprüft es ist alles richtig
verkabelt. Auch die leitungen funktionieren.
Ich habe deine vorschlag eingebaut es kammen aber wieder nur einsen.
Kann man irgendwie testen ob der ds1620 kaputt ist oder nicht?
Ich habe jetzt auch gecodet und versucht die Appnote (im Original für
8051) auf AVR-GCC umzusetzen. Der Code ist alles ander als optimal, da
ich versucht habe so nah wie möglich am 'original' zu bleiben.
In der "demo_main.c" fehlt jede Art von Kommunikation nach außen für
einen Test müßten da USART oder LCD-Funktionen rein.
Ich hab die ds1620 -Sachen in ein extra .c-File angelegt. Im Simulator
sieht der Code ganz gut aus, aber ich habe weder diesen Sensor noch
einen atmega16 zum testen
HTH - Jörg
Hi zusammen,
habt ihr das Problem mittlerweile gelöst ?
Ich habe den Code genommen und mal meinen DS1620 ausprobiert.
Im Prinzip tut sich was, aber nicht richtig.
Der gelesene Hex-Wert liegt bei 93 (Raumtemperatur), wenn ich den Finger
auf den DS1620 lege, dann steigt der Wert langsam an. Aber die
Umwandlung ergibt seltsamerweise immer ein "?"......
OK, jetzt gibt er auch da was aus, es lag also an der lib.
Da er behauptet mein Finger hätte eine Temperatur von -90° scheine ich
wohl eiskalt zu sein, auch wenn mir das bisher nicht bewußt war. Anyway,
ich werde mir mal das Einlesen genauer anschauen, da werden wohl
irgendwo noch Bits verdreht.