Forum: Mikrocontroller und Digitale Elektronik DS1620 Ansteuern klappt nicht, warum?


von P. P. (prophet)


Angehängte Dateien:

Lesenswert?

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_t temperatur = 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ß

von Joerg X. (Gast)


Lesenswert?

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

von Timo (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Joerg X. (Gast)


Lesenswert?

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.

von P. P. (prophet)


Angehängte Dateien:

Lesenswert?

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...

von Joerg X. (Gast)


Lesenswert?

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 ;) )

von P. P. (prophet)


Lesenswert?

Wir benutzen ihn weil wir ihn gerade da hatten. Von I²C haben wir keine 
ahnung. Was ist "richtiges" SPI?

Werde deine tipps nochmal einbauen...

von P. P. (prophet)


Angehängte Dateien:

Lesenswert?

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ß

von Joerg X. (Gast)


Lesenswert?

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
float ds1620_convert_temp(uint16_t temperature)
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
float ds1620_convert_temp(uint16_t temperature)
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)

von Joerg X. (Gast)


Lesenswert?

verdammt, natürlich nicht "nicht"
1
temperature |= 0xff00;
sry!

von P. P. (prophet)


Lesenswert?

Ok, danke. Ich werde die beschaltung nochmal überprüfen.

von P. P. (prophet)


Lesenswert?

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?

von Joerg X. (Gast)


Lesenswert?

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

von P. P. (prophet)


Angehängte Dateien:

Lesenswert?

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?

von Joerg X. (Gast)


Lesenswert?

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

von Joerg X. (Gast)


Angehängte Dateien:

Lesenswert?

Oups, das Anhang/Vorschau problem gibt's ja immer noch

von Harald B. (grieko)


Lesenswert?

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 "?"......

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Threadleichenschänder ;-)

? bei der Ausgabe deutet auf Gleitkommarechnung und fehlende 
Mathelibrary hin: 
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

von Harald B. (grieko)


Lesenswert?

Naja, da Du geantwortest hast stufe ich Dich auch mal als 
Threadleichenschänder ein :-)
Aber erstmal Danke..

von Harald B. (grieko)


Lesenswert?

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.

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.