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


von Olle (Gast)


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.

von Thomas (Gast)


Lesenswert?

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

von Olle (Gast)


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.

von Andreas K. (a-k)


Lesenswert?

Kleiner Tip: 1023,5 schreibt sich binär als 1111111111.1.

von Olle (Gast)


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?!?

von Olle (Gast)


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

von Andreas K. (a-k)


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.

von Olle (Gast)


Angehängte Dateien:

Lesenswert?

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

vielen dank

von Olle (Gast)


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

...

von The D. (devil_86)


Lesenswert?

Systematisch: Richtig angeschlossen (PullUp-R!)?

von Olle (Gast)


Lesenswert?

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

von Olle (Gast)


Lesenswert?

Ja ja, 4,7K Pullup-Resistor, sollte richtig angeschlossen sein

von The D. (devil_86)


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.

von Olle (Gast)


Lesenswert?

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

von The D. (devil_86)


Lesenswert?

naja, der DS1820 heißt in Wirklichkeit genau DS18S20

von Andreas K. (a-k)


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?

von Olle (Gast)


Lesenswert?

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

reagiert aber immer noch nicht auf wärme

von Olle (Gast)


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

von Andreas K. (a-k)


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.

von Andreas K. (a-k)


Lesenswert?

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

Welche Klammern?

von Andreas K. (a-k)


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.

von Olle (Gast)


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?

von Olle (Gast)


Lesenswert?

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

von Olle (Gast)


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?

von Andreas K. (a-k)


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.

von Olle (Gast)


Lesenswert?

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

von Olle (Gast)


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.

von Andreas K. (a-k)


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.

von Olle (Gast)


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.

von Andreas K. (a-k)


Lesenswert?

Steht immer noch die Antwort aus, auf die Frage zur ID.

von Olle (Gast)


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.

von Olle (Gast)


Lesenswert?

ja wo kann ich diese nachschauen und/oder ändern?

von Olle (Gast)


Lesenswert?

vor allem die ID von was? dem DS1820?

von Olle (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

> vor allem die ID von was? dem DS1820?

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

von Olle (Gast)


Lesenswert?

Ah du meinst den Family code??

von Olle (Gast)


Lesenswert?

moment, kann ich mir doch übers terminal anzeigen lassen, oder, versuche 
es mal

von Olle (Gast)


Lesenswert?

352

von Olle (Gast)


Lesenswert?

also hex 160

von Olle (Gast)


Lesenswert?

oder ne, das ist doch hex, oder

von Olle (Gast)


Lesenswert?

ja kein plan, was sagt mir das jetzt??

von Andreas K. (a-k)


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.

von Olle (Gast)


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.

von Olle (Gast)


Lesenswert?

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

von Olle (Gast)


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

von Andreas K. (a-k)


Lesenswert?

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

von Michael S. (olle)


Lesenswert?

das heisst?

von Michael S. (olle)


Lesenswert?

ich meine woran kann es noch liegen?

von Michael S. (olle)


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

von Michael S. (olle)


Lesenswert?

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

von Andreas K. (a-k)


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.

von Michael S. (olle)


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

von Michael S. (olle)


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?

von Andreas K. (a-k)


Lesenswert?

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

von Michael S. (olle)


Lesenswert?

oder mit welcher freuqenz er denkt, dass der controller getaktet ist?

von Andreas K. (a-k)


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.

von Michael S. (olle)


Lesenswert?

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

von Michael S. (olle)


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

von Andreas K. (a-k)


Lesenswert?

Vorhin runtergeladen, V1.25.7.

von Andreas K. (a-k)


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.

von Michael S. (olle)


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?

von Andreas K. (a-k)


Lesenswert?

Wie schon gesagt: Nein. Rest => Leute die mit CV arbeiten.

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.