DS1820 liefert immer den gleichen wert

Gast #610281
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.
Gast #610301
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.
Gast #610321
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?!?
Gast #610323
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:)
#610377
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.
#610388
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?
#610408
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.
#610424
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.
Gast #610434
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.
Gast #610439
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.
#610476
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.
Gast #610488
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.
Gast #610530
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
#610571
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.
#610596
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..
#610599
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren