www.mikrocontroller.net

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


Autor: P. P. (prophet)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
  ds1620_init();
  ds1620_start();
  
  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ß

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. P. (prophet)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
RST=1;
Put1620byte(0xAA);                              /* read temp command    */
temp_and_half_bit = Get1620byte();           /* read 1st byte of temp   */
sign_bit = Get1620byte();                    /* read 2nd byte of temp   */
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...

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  RST=1;
  Put1620byte(0x0C);
  Put1620byte(0x03);   /* set to CPU & 1SHOT mode      */
  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 ;) )

Autor: P. P. (prophet)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: P. P. (prophet)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
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.)
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ß

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
float ds1620_convert_temp(uint16_t temperature)
{
  if((temperature & 0x0100) == 1)
  {
    return (float)(temperature / 2.0f);
  }
  else
  {
    temperature &= 0x00FF;
    temperature = (0xFF - temperature) + 1;
    return -(float)(temperature / 2.0f);
  }
}
 ist verkehrt.
korrekt ist:
float ds1620_convert_temp(uint16_t temperature)
{
    if((temperature & 0x0100) == 1)
  {  
    temperature |= ~0xff00; //wenn die Zahl negativ ist, mit 1 auffüllen
  }
  
    return (temperature / 2.0);

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

Autor: Joerg X. (Gast)
Datum:

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

Autor: P. P. (prophet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke. Ich werde die beschaltung nochmal überprüfen.

Autor: P. P. (prophet)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. P. (prophet)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg X. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oups, das Anhang/Vorschau problem gibt's ja immer noch

Autor: Harald Boller (grieko)
Datum:

Bewertung
0 lesenswert
nicht 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 "?"......

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Threadleichenschänder ;-)

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

Autor: Harald Boller (grieko)
Datum:

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

Autor: Harald Boller (grieko)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.