Hallo,
ich habe mir etwas zum auslesen eines DS18S20 geschrieben. Das auslesen
mittels SkipRom klappt perfekt. Nur würde ich gerne noch mittels ROm
Code auslesen können.
Hier mal die Codes:
1
// SkipRom
2
3
unsignedcharRead_Skip_Temp(void)
4
{
5
charget[10];
6
intk;
7
chartemp_c;
8
9
ow_reset();
10
ow_wr_byte(0xCC);//Skip ROM
11
ow_wr_byte(0x44);// Start Conversion
12
_delay_ms(800);
13
ow_reset();
14
ow_wr_byte(0xCC);// Skip ROM
15
ow_wr_byte(0xBE);// Read Scratch Pad
16
for(k=0;k<9;k++){get[k]=ow_rd_byte();}
17
18
temp_c=get[0];// Temp data plus lsb
19
temp_c=temp_c/2;
20
21
return(temp_c);
22
}
23
24
// MatchRom
25
26
unsignedcharRead_Match_Temp(unsignedchar*romaddr)
27
{
28
intget[10];
29
intk;
30
inti;
31
inttemp_c;
32
33
ow_reset();
34
ow_wr_byte(0x55);
35
for(i=0;i<8;i++)
36
{
37
ow_wr_byte(romaddr[i]);
38
}
39
40
ow_wr_byte(0x44);// Start Conversion
41
_delay_ms(800);
42
ow_reset();
43
44
ow_wr_byte(0x55);
45
for(i=0;i<8;i++)
46
{
47
ow_wr_byte(romaddr[i]);
48
}
49
50
ow_wr_byte(0xBE);// Read Scratch Pad
51
for(k=0;k<9;k++){get[k]=ow_rd_byte();}
52
53
temp_c=get[0];
54
temp_c=temp_c/2;
55
56
return(temp_c);
57
}
Den RomCode habe ich wie folgt in der c datei abgelegt:
1
***Devices***/
2
unsignedcharsensor1[8]={16,157,172,77,2,8,0,86};
3
/*** Devices ende ***/
Der MatchRom code klappt garnicht, ich dachte mir an einen aufruf wie
temp = Read_Match_Temp(sensor1);
dabei soll die temperatur dann in temp stehen. Mit SkipRom klappt das
wunderbar.
Dann hätte ich gerne noch nachkomma stellen und "minus" Temperaturen.
Leider verlässt mich da mein wissen.
Enweder so das temp dann temp[0] die vorkomma und temp[1] die nachkomma
temperatur enthält oder noch besser das temp bereits die temperatur
inkl. nachkomma enthält. Bei Minus dann noch das - (minus Zeichen davor)
und vielleicht so das man als wert noch eine 1 für plus und eine 0 für
minus oder so in der art hat um das im Code dann weiter verarbeiten zu
können.
Wäre toll wenn mir das jemand so anpassen könnte.
Danke euch
Tobias
Hi,
was mir zumindest mal aufgefallen ist:
Deine Funktion Read_Match_Temp ist vom Typ insigned char:
unsigned char Read_Match_Temp(unsigned char* romaddr)
Sie gibt bei dir allerdings einen int zurück, da du temp_c als int
deklariert hast:
int temp_c;
Soweit ich weiß, hat beim AVR-GCC ein int standardmäßig 16bit,
Eventuell liegt da der Fehler.
lg
Chris
Jau, also jetzt klappt das auch mit dem RomCode, also ich kann jetzt die
Temperatur mittels temp = Read_Match_Temp(sensor1); auslesen, aber halt
noch ohne nachkomma und minus werten, wäre toll wenn das auch noch
klappen würde :)
Danke schonmal :)
Tobiiiiii....Nicht schon wieder...Wie lange kann man sich an sowas
eigentlich aufhalten? Vor allem wenn man bedenkt dass du einen
kompletten Bordcomputer mit Sensoren in 6-8 Wochen gebaut hast ;-)
Aber gut:
Das Problem der Nachkommastellen hat nichts mit dem auslesen zu tun,
sondern mit der Darstellung. Und die hängt davon ab, wie und worauf du
den Wert darstellen willst. Der Wert den du ausliest hat bereits alle
Infos, Vorzeichen und Nachkommastellen enthalten.
Ist dir klar dass die Temperatur in 16tel Grad angegeben wird? Also eine
Ganzahldivision durch 16 gibt dir die ganzen Grad Celcius. Eine
Modulo-Division durch 16 gibt dir die Nachkommastellen. Jetzt musst du
nur noch die ganzen Grade in einen String, ein Komma daneben, dann die
Nachkommastellen anhängen. Fertig.
Wenn du die 2 Bytes für die Temp in C in eine int16_t Variable steckst,
hast du automatisch eine Variable mit korrektem Vorzeichen. Da musst du
sonst gar nichts mehr machen. Wenn die dann mittels itoa in einen String
umgewandelt wird dann ist auch dort das Vorzeichen korrekt.
gruß cyblord
Tobias N. schrieb:> egal ob ich int16_t double float was auch immer nehme, ich kriege immer> nur GANZzahlen, egal was ich mache und versuche.
Tja.
Dann solltest du spätestens jetzt mal herzeigen, was du jetzt machst
oder versuchst.
Tobias N. schrieb:> egal ob ich int16_t double float was auch immer nehme, ich kriege immer> nur GANZzahlen, egal was ich mache und versuche.
Du liest ja auch nicht was ich dir schreibe. Die int16_t gibt dir die
negativen Zahlen. Komma musst du selber ausrechnen und einfügen.
gruß cyblord
ok, also ich habe jetzt mal die berechnung aus einem anderen code
kopiert aber trotzdem nur ganzzahlen, ich vermute schon es liegt an der
ausgabe selbst, hier mal die codes:
Das auslesen:
cyblord ---- schrieb:> Tobias N. schrieb:>> egal ob ich int16_t double float was auch immer nehme, ich kriege immer>> nur GANZzahlen, egal was ich mache und versuche.>> Du liest ja auch nicht was ich dir schreibe. Die int16_t gibt dir die> negativen Zahlen. Komma musst du selber ausrechnen und einfügen.
@TO
Und wenn 0.5°C Auflösung reichen (es gibt selten einen Grund warum das
nicht reichen sollte), dann ist das auch besonders einfach:
Einfach das MSB und das LSB aus dem Scratchpad zusammenfügen und man
erhält das Doppelte der Gradzahl vorzeichenrichtig. Bei der Ausgabe kann
man dann immer noch die Division durch 2 machen und so dann für die
Ausgabe die Kommastelle generieren.
Aber das alles hat cyblord ja schon geschrieben. Wo also ist dein
Problem?
Naja, er gibt mir bei get[0] 45 aus, wenn ich das durch 2 teile würde
ich 22,5 bekommen, er gibt mir aber nur 22 auf meinem display aus. laut
meinem multimeter sind hier 22,7C also 22,5 naja würde ja dann schon
passen, aber ich erhalte in der ausgabe nie eine nachkomma zahl.
temp_c=(get[0]
Schon falsch.
In der Doku steht eindeutig, dass die Temperatur um das 0.5°C Bit, also
das LSBit bereinigt werden soll.
Sieh dir doch wenigstens die Doku an. So schwer ist das nicht.
Und ja. Du musst erst mal das Scratchpad Byte 0 und 1 zu einem 16 Bit
Wert zusammenfügen, um die Temperatur zu erhalten. Die wird dann durch 2
divisiert und mit der erweiterten Formel um 1/16 Grad ergänzt.
Aber eigentlich ist das nur Augenauswischerei. Denn die Nachkommastelle
hat mit einer realen Temperatur sowieso nicht viel zu tun. Oder hat es
in deinem Zimmmer an allen Stellen exakt 24.7 Grad?
Tobias N. schrieb:> Naja, er gibt mir bei get[0] 45 aus, wenn ich das durch 2 teile würde> ich 22,5 bekommen, er gibt mir aber nur 22 auf meinem display aus.
Logisch.
Wiew soll denn in einem Integer eine Nachkommastelle herkommen?
itoa wandelt nun mal einen Integer in seine Textrepräsentierung. Egal ob
temp ein float ist oder nicht.
Und wie soll da
unsigned char Read_Match_Temp(unsigned char* romaddr)
ein float mit Nachkommastellen zurückkommen, wenn der Returnwert der
Funktion ein unsigned char ist?
Dass sich überhaupt noch jemand mit diesem lernresistenten Ignoranten
und Voll....... abgibt??
Am 17.01.2013 habe ich ihm bereits die Lösung vor die Nase gehalten:
Beitrag "Re: DS18S20 auslesen (finde den fehler nicht)"
Und dass mindestens 100 User die Ausgabe vor ihm auch hinbekommen UND
dokumentiert haben, ist an ihm ebenso vorübergegangen.