mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS1820 liefert immer den gleichen wert


Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich benutze ein Atmel Evaluationboard V2.0, mit einem ATmega16 (8 
MHz Quarz) und einem 1-wire-Tempsensor (DS1820).
 Header für temp sensor:
  #asm
        .equ __w1_port=0x18
        .equ __w1_bit=0
    #endasm
#include<ds1820.h>

jetzt habe ich zur Probe den C-Code aus dem CodeVisionAVR-Manual 
geschrieben. Der Tempsenor wird auch erkannt, doch in dem 
CodeVision-Termial ( über RS232 ) wird mir immer der gleiche Wert 
angezeigt: 1023.5

folgender C-Code wird zur Ausgabe benutzt:
while(1)
        {
                for(i=0;i<devices;)
                {
                        temp=ds1820_temperature_10(&rom_code[i][0]);
                        j='+';
                        if(temp<0)
                        {
                        j='-';
                        temp=-temp;
                        }
                        printf("t%u=%c%i.%u\n\r",++i,j,temp/10,temp%10);
                }
        }
WARUM ändert sich der Wert nicht, bei unterschiedlichen Temperaturen??
Kann mir bitte jemand helfen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber die 1023 geben mit schon zu denken.
Denke mal selber drüber nach ;-)

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi, wäre es möglich, dass ich vergessen habe irgendetwas zu 
initialisieren. Oder ist mein Tempsenor defekt, ich meine wenn ich ein 
Feuerzeug 20 cm 5 sekunden drunter halte, müsste sich doch was ändern.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Tip: 1023,5 schreibt sich binär als 1111111111.1.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in dem CodeVisionAVR Manual soll UCR=8 sein, bei mir ist es UCSRB=0x08.
sollte das gleiche sein.

ABER UBRR=xtal/16/baud-1

Bei mir: UBRRL=0x33; dient aber nur zur Übertragung mit RS232, oder?
wenn ich diese weg lasse, kommt auch nichts mehr am terminal an. Die 
baud Rate hat doch nichts mit der one-wire Datenübertragung des DS1820 
zu tun?!?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe den Tip nicht, trotzdem danke für die Mühe. Ich meine, mir 
schon klar, dass der maximalwert angezeigt wird, also das der tempsenor 
den maximalwert ausgibt, ich weiss aber nicht warum, es wäre mir lieber, 
wenn er temperaturabhängige werte liefern würde:)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er liefert offensichtlich überhaupt keinen Wert (offener Eingang = 1). 
Die 1-Wire Routinen funktionieren nicht oder werden falsch verwendet. 
Mehr lässt mangels Code nicht sagen.

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

Bewertung
0 lesenswert
nicht lesenswert
hier, wenn du kurz zeit hast könntest du ja mal drüber sehen, ist nicht 
viel text.

vielen dank

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich resete, erscheint auf dem terminal von codvision avr:

1 DEVICE(S) DETECTED // also findet er den Sensor doch

t1=+1023.5C

t1=+1023.5C

t1=+1023.5C

...

Autor: The Devil (devil_86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Systematisch: Richtig angeschlossen (PullUp-R!)?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das Board so gekauft, Pull-up-R sagt mir nichts, bin eher anfänger

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ja, 4,7K Pullup-Resistor, sollte richtig angeschlossen sein

Autor: The Devil (devil_86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lt. Datenblatt gehört der 1WireBus mit einem 4k7-PullUp-Widerstand auf 
Versorgung gezogen...aber das wird fertig gekauft doch wohl eh schon 
gemacht sein...weiß nicht, habe mit den EvalBoards bzw. 1Wire bzw. dem 
DS1820 noch nichts gemacht.

Nachtrag: uups, zu langsam, aber wenn die Hardware passt, kann's nur an 
der Software liegen.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte es sein, dass es sich um einen DS18B20 oder DS18S20 handelt, und 
das da der Hund begraben liegt?

Autor: The Devil (devil_86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, der DS1820 heißt in Wirklichkeit genau DS18S20

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja - ist der Originalcode aus dem Handbuch. Der kurioserweise die 
eigene Initialisierung vergisst (w1_init, überflüssig?).

Kannst mal probieren, ob bei ...read_spd was anderes als Einsen 
rauskommt. Und mal die Variante ohne Adressierung, also nur 1 DS18x20 
dran und mit addr=NULL probieren.

Taktfrequenz korrekt dem Compiler/Projekt mitgeteilt?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt <ds18b20.h> und ds18b20_temperature(...) ersetzt.
jetzt liefert er mir t1=+12.7C

reagiert aber immer noch nicht auf wärme

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Taktfrequenz stimmt, den Mittelteil hab ich zwar nicht verstanden, aber 
an init hab ich auch schon gedacht, weiß aber nicht was ich in die 
klammern schreiben muss

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja: Wie lautet denn die ID? Wenn die auch bloss aus Einsen 
besteht... Erstes Byte muss 0x10 (DS18S20) oder 0x28 (DS18B20) sein, 
sonst schon hier Mist.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> weiß aber nicht was ich in die klammern schreiben muss

Welche Klammern?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Funktionen vom CV etwas taugen kann's die Hardware nicht sein, 
denn jede auch nur halbwegs nützliche 1W-Lib merkt es, wenn sich am Bus 
nichts rührt.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die funktion, heisst doch unsigned char init(void);
da muss ich doch nen wert mitschicken, so wie bei lcd: lcd_init(16) z.B.

Wo kann ich die ID nachschauen, oder ändern?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin mir aber auch ziemlich sicher, dass ich die init nicht bruche, habs 
trotzdem versucht, ohne wert, ohne klammern, hat nichts gebracht:(

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ha, ist das geil, versteh echt kein Wort, aber willst mir damit sagen, 
das alles richtig angschlossen ist, und der sensor nicht defekt ist?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bin mir aber auch ziemlich sicher, dass ich die init nicht bruche, habs
> trotzdem versucht, ohne wert, ohne klammern, hat nichts gebracht:(

Wenn du verzweifelt danach suchst, was für einen Wert ein Parameter vom 
Typ "void" wohl erwartet, und als Ausweg die Klammern ganz weglässt, 
dann möchte ich dringend empfehlen, erst einmal nähere Bekanntschaft mit 
der Sprache C zu schliessen.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat das zu bedeuten, dass ich mit #include<18b20> und der 
entsprchend veränderten ausgabefunktion-> 18b20_temperature den Wert 
27,5 bekomme?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja du meintest doch, dass da keine klammern hingehören, oder keine sind, 
ich bin davon ausgegangen, dass man das bei included files nachschauen 
kann. Wie gesagt Anfänger.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte wissen, welche Klammer du meinst, weil mit die Frage komisch 
vorkam. Aber mit deiner Antwort kam raus dass du

- erstens nicht weisst, dass (void) in diesem Kontext für Funktionen 
ohne Parameter steht,

- zweitens eine Funktion ohne Klammern kein Aufruf sondern eine Adresse 
darstellt.

Letzteres muss man als Anfänger noch nicht unbedingt wissen, aber 
ersteres deutet an, dass dies deine ersten Zeilen C waren, mehr oder 
weniger ohne Verständnis der Bedeutung abgetippt.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, als ich meinte, dass in die klammern ein wert kommt, wusste ich 
nicht genau, wie die fkt in der included file genau ausieht, dachte nur 
direkt an das lcd_init bsp., da ich die init fkt schon gesehen hatte, 
und die klammern noch im kopf hatte, aber nicht mehr den inhalt. nachdem 
ich nachgeschaut hatte, und die fkt gepostet hatte, habe ich es versucht 
mit leeren klammer, so wie ich dachte, wie ich es von lcd_ready() kenne 
z.B. und so wie du meintest( was ja wohl ein missverständnis war) ohne 
klammern. in der tat, das 2. wusste ich nicht. bin auch wirklich 
anfänger, aber habe schon einige c-programme geschrieben, nur nicht viel 
mikrocontroller programmiert.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht immer noch die Antwort aus, auf die Frage zur ID.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich möchte ja noch mehr machen, habe bereits über das drehpoti und den 
ADW aktiviert und lese werte ein, die mittels interrupt (Timer) auf lcd 
ausgebe, aber zusätzlich will ich noch den angeschlossenen Tempsenor 
abrufen, und das klappt nit. ja den Text dazu hab ich einfach abgetippt, 
weil ich erstmal sehen wollte ob es klappt. Deshalb dieses kleine 
programm.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja wo kann ich diese nachschauen und/oder ändern?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vor allem die ID von was? dem DS1820?

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich dachte der wird mit w1_port=0x18 und w1_bit=0x00 angesteuert?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> vor allem die ID von was? dem DS1820?

Ebendie. Der Inhalt der 9 Bytes an rom_code[0]. Nach dem 1w_search.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah du meinst den Family code??

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moment, kann ich mir doch übers terminal anzeigen lassen, oder, versuche 
es mal

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
352

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also hex 160

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder ne, das ist doch hex, oder

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja kein plan, was sagt mir das jetzt??

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An rom_code[0] steht 9 Bytes (chars). Die ersten davon sind die ID vom 
DS1820, das letzte davon ist was anderes. Soweit zitiere ich bloss das 
Manual vom CV.

Und diese 9 Bytes solltest du mal ausgeben. Und zwar besser gleich in 
hex.

Wenn du mit dieser Aufgabenstellung überfordert bist, dann habe ich 
wieder den Tip, erst einmal C zu lernen. Was auf dem PC einfacher ist 
als auf dem Controller.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
printf("%-u",rom_code[0][0]);
        printf("%-u",rom_code[0][1]);
        printf("%-u",rom_code[0][2]);
        printf("%-u",rom_code[0][3]);
        printf("%-u",rom_code[0][4]);
        printf("%-u",rom_code[0][5]);
        printf("%-u",rom_code[0][6]);
        printf("%-u",rom_code[0][7]);
        printf("%-u",rom_code[0][8]);

wenn ich das eingebe, kommt folgendes raus: 40552102250001091

wenndir das zu primitiv ist, dann trotzdem danke für die mühe, ich weiß 
nicht wie man HEX zahlen ausgibt, für das was ich vorhabe, brauche es ja 
auch nicht. sondern nur zum überprüfen der ID.

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaaaaaa, falls du noch da bist, das erste byte ist 0x10

Autor: Olle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit printf("0x%x\n",rom_code[0][0]);
        printf("0x%x\n",rom_code[0][1]);
        printf("0x%x\n",rom_code[0][2]);
        printf("0x%x\n",rom_code[0][3]);
        printf("0x%x\n",rom_code[0][4]);
        printf("0x%x\n",rom_code[0][5]);
        printf("0x%x\n",rom_code[0][6]);
        printf("0x%x\n",rom_code[0][7]);
        printf("0x%x\n",rom_code[0][8]);

9   0x28
    0x37
    0xd2
    0xe1
    0x00
    0x00
    0x00
    0x6d
1   0x10

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, das heisst soweit scheint es zu stimmen. Für den Rest ist die 
Lib-Routine zuständig, gefüttert wird sie korrekt.

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das heisst?

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich meine woran kann es noch liegen?

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal was von der Phantomspeisungsmodus gehört?
muss ich evtl Taktfrequenz modifizieren, hab irgendwo gelsen, dass 
DS1820 mit 6 oder 12 MHz läuft

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber erstmal danke, dass du dich meiner nochmal angenommen hast, obwohl 
ich son noob bin.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hast du mal was von der Phantomspeisungsmodus gehört?

Yep, das wirft die Frage auf, wie der DS genau angeschlossen ist, 
3-polig oder 2-polig? Ohne separates VCC kann er alles ausser Temperatur 
messen, da geht ihm der Saft aus wenn die Software eine parasitäre 
Versorgung nicht berücksichtigt.

> muss ich evtl Taktfrequenz modifizieren, hab irgendwo gelsen, dass
> DS1820 mit 6 oder 12 MHz läuft

Der DS18x20 hat keine extern irgendwie relevante Taktfrequenz. Wohl aber 
hat ein ein Timing, an dass sich der Controller halten muss. Wie das 
geht steht im Manual vom CVAVR. Wenn der Controller auf 16MHz läuft, die 
Lib aber der Ansicht ist er liefe auf 8MHz, dann ist alles offen.

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe kein avrwizard benutzt, wenn ich jetzt darauf gehe, steht da 
unter 1-wire none, brauche ich das, oder stellt sich das automatisch 
ein, durch #asm
      1w_portb=0x18;
      ...
??

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er liegt genau wie display und drehpoti auf VCC, ein anschluss ist auf 
GND, und ein anschluss ist auf pin 9 glötet, der wiederum führt dann zum 
PortB0. kann ich irgendwo sehen, mit welcher frequenz er arbeiten 
möchte?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirst wohl mal probieren müssen. Ich selber benutze den CVAVR nicht.

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder mit welcher freuqenz er denkt, dass der controller getaktet ist?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kann ich irgendwo sehen, mit welcher frequenz er arbeiten möchte?

Das Handbuch schreibt auf S.157 (ca Mitte) wie man dem Projekt die 
Taktfrequenz des Controllers beibringt. Daraus leitet die Lib 
offensichtlich das 1-Wire Timing ab.

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an dem wizard liegts nicht. auf seite 157 steht bei mir was anderes, 
haste auch die 211 seiten version?

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber die clock frequenz gebe ich ja unter settings ganz am anfang ein, 
dann wird die lib doch wissen, womit ich arbeite, es kann nur sein, dass 
der sensor mit der frequnz nicht arbeiten kann, sodass ich runtertakten 
muss, aber meintest ja, dass das nicht so ist. also bleibt dieser 
phantomspeisungsmodus..

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorhin runtergeladen, V1.25.7.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Sensor hat keine Frequenz, kriegt keine Frequenz und braucht keine 
Frequenz. Das einzige was er braucht, ist ein korrekter Zeitablauf beim 
Zugriff.

Die "Phantomspeisung" heisst offiziell parasitäre Stromversorgung und 
meint den Modus, indem der DS ohne VCC Pin betrieben wird. Da zieht er 
den Strom aus der Datenleitung und es gelten während der Messung 
besondere Reglen. Wenn der Sensor mit VCC betrieben wird, ist das nicht 
relevant.

Autor: Michael S. (olle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja gut, wenn ich bei codevision die frequenz einstelle, nimmt sch die 
lib ja sicher daher ide info. wenn die phantomspeisung nicht in frage 
kommt, fällt dir sonst noch was ein?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon gesagt: Nein. Rest => Leute die mit CV arbeiten.

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.