Hi leute, ich versuche schon seit langer Zeit den DS18S20 auszulesen, leider bis heute ohne erfolg. Hier mal mein C Code. http://nopaste.info/b485621093.html Wenn ich im Reset das _delay_us und _delay_ms ändere dann erhalte ich als fehler eine 1, also kein DS18S20 gefunden, wenn ich das dann in _delay_us ändere bekomme ich eine 0, also scheit für mich der Reset zu funktionieren. Wenn ich den Code so wie im paste laufen lasse erhalte ich als Ausgabe auf dem LCD eine 0. Die Oszi Screenshots sind nur rein vom Reset pulse. Ich hoffe mir kann einer weiter helfen. MCU ist der ATMega8 mit 1Mhz internem Takt. Die LCD library ist die hier im Forum befindliche "mylcd" libraray.
Tobias N. schrieb: > Hier mal mein C Code. > http://nopaste.info/b485621093.html Funktioniert bei dir die Funktion für Anhänge nicht?
Tobias N. schrieb: > MCU ist der ATMega8 mit 1Mhz internem Takt. Hast du das auch dem Compiler gesagt?
Die Spannung am DS18S20 ist okay? Bitte mal mit Oszi überprüfen! Hast Du den Sensor direkt versorgt oder parasitär? Ist der Quellcode komplett? Wo ist die Endlosschleife?
F_CPU 1000000 so stehts inner Makefile, naja ich hatte die while schleife gestern noch testweise mal entfernt um so einmal eine gesamte pulse strecke von einer abfrage abzufangen, aber das klappt nicht. vorher war eine while() {} schleife drum aber der wert war immer 0
Tobias N. schrieb: > F_CPU 1000000 > > so stehts inner Makefile, schön und was ist in den Fuses eingestellt? externer Quarz? Welcher Wert?
wenn du mir sagst wo / wie ich das sehe kann ich dir das sagen. der mega befand sich bis ich ihn geflasht habe im auslieferungszustand.
Warum nimmst du nicht die Libary? Guck mal da, da kannst du sicher was von gebrauchen. http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html Die Arduino ist auch in C geschrieben und die funktioniert unter Arduino ganz hervorragend. Sonst guck nach der für den Arduino und pass dir das an.
Noch ein Tipp! Optimierung -OS einstellen sonst stimmt das ganze delay gedöns nicht.
ich habe schon zich libs durch, diese habe ich ebenfalls schon durch aber ohne jeglichen erfolg. ich habe einfach keine ahnung mehr. vll. liegt es ja auch an der lcd ausgabe aber da habe ich auch keine ahnung von. ich bin froh das mir das lcd was ausgiebt.
Klaus schrieb: > Noch ein Tipp! > > Optimierung -OS einstellen sonst stimmt das ganze delay gedöns nicht. es wird schon mit -Os kompiliert, also steht so im makefile.
Ist zwar Arduino, aber bei mir funktionierte es. Es war nur für einen Versuchsaufbau.
1 | // This Arduino sketch reads DS18B20 "1-Wire" digital
|
2 | // temperature sensors.
|
3 | // Tutorial:
|
4 | // http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html
|
5 | |
6 | #include <OneWire.h> |
7 | #include <DallasTemperature.h> |
8 | |
9 | // Data wire is plugged into pin 3 on the Arduino
|
10 | #define ONE_WIRE_BUS 4
|
11 | |
12 | // Setup a oneWire instance to communicate with any OneWire devices
|
13 | OneWire oneWire(ONE_WIRE_BUS); |
14 | |
15 | // Pass our oneWire reference to Dallas Temperature.
|
16 | DallasTemperature sensors(&oneWire); |
17 | |
18 | // Assign the addresses of your 1-Wire temp sensors.
|
19 | // See the tutorial on how to obtain these addresses:
|
20 | // http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
|
21 | |
22 | DeviceAddress insideThermometer = { 0x10, 0x89, 0x8A, 0x77, 0x02, 0x08, 0x00, 0xE6 }; |
23 | DeviceAddress outsideThermometer = { 0x10, 0x4E, 0xC1, 0x8D, 0x02, 0x08, 0x00, 0x0F}; |
24 | //DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };
|
25 | |
26 | // Einfügung
|
27 | |
28 | const int L=13; |
29 | const int Van1=11; |
30 | const int Van2=10; |
31 | const int Van3=9; |
32 | const int Van4=3; |
33 | int PWM=32; |
34 | |
35 | //Einfügung Ende
|
36 | |
37 | void setup(void) |
38 | {
|
39 | //Einfügung
|
40 | pinMode(Van1,OUTPUT);// |
41 | pinMode(Van2,OUTPUT);// Van1- Van4 sind die Lüfter |
42 | pinMode(Van3,OUTPUT);// |
43 | pinMode(Van4,OUTPUT);// |
44 | pinMode(L,OUTPUT); // LED signalisiert die höchste Leistungsstufe; kann dann später zur Berechnung der max. Laufzeit verwendet werden |
45 | //Einfügung Ende
|
46 | |
47 | // start serial port
|
48 | Serial.begin(9600); |
49 | // Start up the library
|
50 | sensors.begin(); |
51 | // set the resolution to 10 bit (good enough?)
|
52 | sensors.setResolution(insideThermometer, 10); |
53 | sensors.setResolution(outsideThermometer, 10); |
54 | //sensors.setResolution(dogHouseThermometer, 10);
|
55 | |
56 | }
|
57 | |
58 | void printTemperature(DeviceAddress deviceAddress) |
59 | {
|
60 | float tempC = sensors.getTempC(deviceAddress); |
61 | if (tempC == -127.00) { |
62 | Serial.print("Error getting temperature"); |
63 | } else { |
64 | Serial.print("C: "); |
65 | Serial.print(tempC); |
66 | //Serial.print(" F: ");
|
67 | //Serial.print(DallasTemperature::toFahrenheit(tempC)); //ohne Fahrenheit
|
68 | }
|
69 | }
|
70 | |
71 | void loop(void) |
72 | {
|
73 | delay(2000); |
74 | Serial.print("Die Temperaturen werden gelesen ...\n\r"); |
75 | sensors.requestTemperatures(); |
76 | |
77 | Serial.print("Die Raumtemperatur ist: "); |
78 | printTemperature(insideThermometer); |
79 | Serial.print("\n\r"); |
80 | Serial.print("Die Aussentemperatur ist: "); |
81 | printTemperature(outsideThermometer); |
82 | Serial.print("\n\r"); |
83 | //Serial.print("Dog House temperature is: ");
|
84 | //printTemperature(dogHouseThermometer);
|
85 | Serial.print("\n\r\n\r"); |
86 | |
87 | |
88 | //Einfügung
|
89 | |
90 | analogWrite(Van1,PWM); |
91 | //int value = analogRead(inPin);
|
92 | //Serial.print(">");
|
93 | //Serial.println(value);
|
94 | //Serial.println("Das ist der gemessene Wert des Sensors.");
|
95 | |
96 | //float millivolts = (value / 1024.0)*5000;
|
97 | //float celsius = ((millivolts/10) - 273.15);
|
98 | //Serial.print(celsius);
|
99 | //Serial.println("Grad Celsius");
|
100 | //delay(2000);
|
101 | |
102 | |
103 | |
104 | if(( 0x10, 0x89, 0x8A, 0x77, 0x02, 0x08, 0x00, 0xE6 > 24) && (0x10, 0x89, 0x8A, 0x77, 0x02, 0x08, 0x00, 0xE6 < 27)) |
105 | {
|
106 | PWM=128; |
107 | analogWrite(Van1,PWM); |
108 | }
|
109 | |
110 | else if ( 0x10, 0x89, 0x8A, 0x77, 0x02, 0x08, 0x00, 0xE6 > 27.1) |
111 | |
112 | {
|
113 | digitalWrite(L,HIGH); |
114 | PWM=254; |
115 | analogWrite(Van1,PWM); |
116 | analogWrite(Van2,PWM); |
117 | analogWrite(Van3,PWM); |
118 | analogWrite(Van4,PWM); |
119 | }
|
120 | else
|
121 | {
|
122 | PWM=32; |
123 | digitalWrite(L,LOW); |
124 | analogWrite(Van1,PWM); |
125 | analogWrite(Van2,0); |
126 | analogWrite(Van3,0); |
127 | analogWrite(Van4,0); |
128 | }
|
129 | |
130 | }
|
ich finde es recht komisch. egal was ich mache und welche lib benötigt wird, es läuft. dieses kack onewire will einfach nicht. keine lib geht nichts geht. und so wirklich ausführlich ins detail erklärt findet man auch nichts eindeutiges. also wenn ich z.b. eine ks0108 doku will dann habe ich da eine tolle, eine 417 seitige deutsche bis ins detail erklärte doku über das ks0108. damit möchte ich mir irgendwann meine eigene einfacherer lib schreiben als die derzeitig im umlauf befindlichen. aber bisher hat alles geklappt nur der ds1820 will nicht.
Hast Du die Spannungsversorgung schon kontrolliert? Wie versorgst Du den Sensor? (Hatte ich schonmal gefragt!)
Ersetz mal die Grundfunktionen mit dem hier. Formatierung musst halt noch anpassen und sag bescheid ob es nun geht oder nicht.
1 | unsigned char ow_reset(void) |
2 | {
|
3 | uint8_t err=100; |
4 | DDRC |= (1<<PC5); // define as ouput |
5 | |
6 | _delay_us(480); // leave it low for 480us |
7 | DDRC &= ~(1<<PC5); |
8 | |
9 | _delay_us(60); // wait for presence |
10 | err = (PINC & (1<<PC5)) >> PC5; // get presence signal |
11 | |
12 | if( err == 0 ){ // short circuit --> err=2 |
13 | err = 2; |
14 | }
|
15 | |
16 | _delay_us(480); // wait for end of timeslot |
17 | return err; |
18 | } // 0=presence, 1 = no part |
19 | |
20 | |
21 | void write_bit(char bitval) |
22 | {
|
23 | DDRC |= (1<<PC5); // define as ouput |
24 | _delay_us(8); |
25 | if(bitval==1) |
26 | {
|
27 | DDRC &= ~(1<<PC5); // define as input |
28 | }
|
29 | _delay_us(120); |
30 | DDRC &= ~(1<<PC5); // define as input |
31 | |
32 | }// Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us |
33 | |
34 | |
35 | |
36 | unsigned char read_bit(void) |
37 | {
|
38 | unsigned char i; |
39 | DDRC |= (1<<PC5); // pull DQ low to start timeslot |
40 | DDRC &= ~(1<<PC5); // then return high |
41 | _delay_us(10); |
42 | i = (PINC & (1<<PC5)) >> PC5)); |
43 | _delay_us(105); |
44 | return i; // return value of DQ line |
45 | }
|
46 | |
47 | |
48 | unsigned char read_byte(void) |
49 | {
|
50 | unsigned char i; |
51 | unsigned char value = 0; |
52 | for (i=0;i<8;i++) |
53 | {
|
54 | if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then |
55 | // shifts it left
|
56 | |
57 | }
|
58 | return(value); |
59 | }
|
60 | |
61 | |
62 | void write_byte(char val) |
63 | {
|
64 | unsigned char i; |
65 | |
66 | for (i=0; i<8; i++) // writes byte, one bit at a time |
67 | {
|
68 | val &= 0x01; // copy that bit to temp |
69 | write_bit(val); // write bit in temp into |
70 | val = val >> i; // shifts val right 'i' spaces |
71 | }
|
72 | |
73 | }
|
Frank O. schrieb: > if(( 0x10, 0x89, 0x8A, 0x77, 0x02, 0x08, 0x00, 0xE6 > 24) && (0x10, > 0x89, 0x8A, 0x77, 0x02, 0x08, 0x00, 0xE6 < 27)) Bist du sicher, dass du weißt, was du hier tust?
hier findest du alles zum onwire schön erklärt sogar mit Doku in Deutsch. Beitrag "1-Wire-Bus-Projekt: DS1820 DS18S20 DS2450 DS2408 unter C und 8051"
Nico ... schrieb: > Hast Du die Spannungsversorgung schon kontrolliert? Wie versorgst Du den > Sensor? (Hatte ich schonmal gefragt!) ich versorge den DS18S20 extern mit 5V. wenn ich die flache seite vor mir habe dann habe ich den links mit GND, DQ mit PC5 und recht mit VCC angeschlossen. Zwischen VCC und DQ dann noch ein 4,7k pullup.
Klaus schrieb: > Ersetz mal die Grundfunktionen mit dem hier. > Formatierung musst halt noch anpassen und sag bescheid ob es nun geht > oder nicht. weiterhin wie vorher auch, die ausgabe auf dem LCD ist 0
Du hast doch ein Oszi, schließe es an den Datenpin an und dann starte dein Programm. Und dann vergleichst Du das was Du auf dem Oszi siehst mit dem Datenblatt. Wenn Du nicht weiter kommst, dann zeigst Du die Bilder hier und wir können dir helfen.
So noch ein versuch und ersetz mal das hier! Da du ein Oszi hast kannst du ja mal nachsehen wie die Bits über den Bus huschen. Wichtig! Nach ow_reset(void) solltest den presence signal erkennen und danach sollten die Daten zusehen sein. void Read_Temperature(void) { char get[10]; char temp_lsb,temp_msb; int k; char temp_f,temp_c; ow_reset(); write_byte(0xCC); //Skip ROM write_byte(0x44); // Start Conversion while( read_byte == 0);//_delay_us(104); ow_reset(); write_byte(0xCC); // Skip ROM write_byte(0xBE); // Read Scratch Pad for (k=0;k<9;k++){get[k]=read_byte();} // printf("n ScratchPAD DATA = %X%X%X%X%Xn",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get [0]); temp_msb = get[1]; // Sign byte + lsbit temp_lsb = get[0]; // Temp data plus lsb if (temp_msb <= 0x80){temp_lsb = (temp_lsb/2);} // shift to get whole degree temp_msb = temp_msb & 0x80; // mask all but the sign bit if (temp_msb >= 0x80) {temp_lsb = (~temp_lsb)+1;} // twos complement if (temp_msb >= 0x80) {temp_lsb = (temp_lsb/2);}// shift to get whole degree if (temp_msb >= 0x80) {temp_lsb = ((-1)*temp_lsb);} // add sign bit //printf( "nTempC= %d degrees Cn", (int)temp_lsb ); // print temp. C temp_c = temp_lsb; // ready for conversion to Fahrenheit temp_f = (((int)temp_c)* 9)/5 + 32; //printf( "nTempF= %d degrees Fn", (int)temp_f ); // print temp. F }
Ups kleiner fehler eingeschlichen while( read_bit == 0);//_delay_us(104); sollte es heissen
Hier noch ein Beispiel was man auf dem Oszi sehen müsste wenn der Romcode ausgelesen wird. Siehe Anhang!
womit hast du die grafik erstellt? gleich wenn die kinder in bett sind teste ich deinen anderen code noch. ja so wie oben sieht es ja bei mir auch aus. also mit dem presence und das untere, naja, ich habe das rigol oszi erst ein paar tage und kenne mich damit noch nicht so aus. das rennt da so schnell durch, war glück das ich die beiden bilder hingekriegt habe, wie machst du das denn? habe mir schon überlegt ultrascope und das oszi an den pc anzuschliessen. vll. haste da ja noch ein paar tips für mich
@Tobias Ja! Hab ich mit Ultrascope aufgezeichnet. Die Bilder habe ich damals mit Drawplus X2 von Serif bearbeitet. Wie ich aber die Aufzeichnung dann aber gemacht habe, da muss ich erst nochmal darüber Nachdenken. Hab damals auch eine weile gebraucht bis ich mit meinem Rigol zurecht kam. Da ich gerade auch wieder mit dem DS18S20 beschäftige werd ich die die Aufzeichnungen nocheinmal replizieren.
also haste gerade auch mit dem DS18S20 zu tun, na dann ja wenigstens jemand der gerade genau in dem gleichen fall inwolviert ist :) ich habe ja immernoch die vermutung das das vll an der lcd ausgabe und garnicht am onewire hängt aber ich kann mich auch irren. wäre toll wenn ich mal eine gesamtaufnahme kriegen würde, dann könnte man vll besser diagnostizieren.
so habe den neuen code jetzt mal probiert, der ist auch 0, also das kann doch alles nicht sein -.-
@Tobias Habe doch glatt falsche Bilder in der PDF gehabt! Hier nochmal Überarbeitet. Zu den Einstellungen am Oszi! Bei mir Rigol DS1202CA folgendes einstellen: Trigger Menu MODUS --> RAND Quelle --> CH1 Messtaster Anstieg --> Steigend Sweep --> EINZ ( Einelmessung ) Timbase 100µs einfach mal am Drehknopf Scale drehen! Wenn du alles Angeschlossen und Eingestellt hast die RUN/STOP drücken. Dein Programm sollte so Programmiert sein das Du einen Taster drückst an deinem Aufbau. Dann sollte ROMCODE eingelesen werden. Die RUN/STOP Taste wird dann ROT. Jetzt kannst du mit dem Horizontal Poti die Position nach rechts oder links abfahren. Bei Verwendung des Ultrascops Treiber installieren. Den DSO mit dem PC über USB verbinden und eine Verbindung herstellen. Im Fenster Upload/ Download ganz unten Virual Panel aufrufen. Dann sollt im DSO rechts oben rmt stehen. D.h. Du kannst das DSO nur noch Virtuell Bedienen. Alle Funktionen am DSO sind gesperrt. Im Vrtual Panel kannst nun schön Bildchen machen und Exportieren.
Im Anhang ist noch ein Testprogramm das aber noch anpassen musst.
so, da ich ja schon nun viele tips bekommen habe nun mal eine verständis frage. Ich habe mir jetzt mal den Code im anhnag zusammen gebastelt. Bei dem Reset mit den US erhalte ich eine 0, bei dem anderen eine 1, also mir wird jetzt im wechsel auf meinem LCD eine 0 und dann wieder eine 1 usw angezeigt. Das sagt mir doch jetzt der Reset funktioniert oder? Dann kann ich mich nämlich weiter daran machen :)
DDRC &= ~(1<<PC5); // 1-wire Leitung auf LOW (Eingang) fehlt noch in main. Tobias N. schrieb: > Ich habe mir jetzt mal den Code im anhnag zusammen gebastelt. Bei dem > Reset mit den US erhalte ich eine 0, bei dem anderen eine 1, also mir > wird jetzt im wechsel auf meinem LCD eine 0 und dann wieder eine 1 usw > angezeigt. Das sagt mir doch jetzt der Reset funktioniert oder? > > Dann kann ich mich nämlich weiter daran machen :) Nein! Wenn der Sensor eingesteckt ist und der Presence Impuls erkannt wird sollte auf deinem LCD ein Ok erscheinen andernfalls Error. Zum Test einfach mal raus ziehen dann sollte immer Error erscheinen. Auserdem würde ich an deiner Stelle in ow_reset den error direkt an einem Port ausgeben wo eine LED angeschlossen ist. Damit hast schonmal eine Kontrolle ohne LCD Routinen.
Klaus schrieb: > Wenn der Sensor eingesteckt ist und der Presence Impuls erkannt wird > sollte > auf deinem LCD ein Ok erscheinen andernfalls Error. Ich schreibe och hier in "error" (error=ow_reset();) eine 1 oder eine 0 wie in ow.c (return(zw); // Rueckgabe: 0 = Slave vorhanden, 1 = kein Slave vorhanden) der ruckgabewert her gibt. Demnach doch 0 oder 1 auf dem Display oder verstehe ich da was falsch?
Tobias N. schrieb: > im wechsel auf meinem LCD eine 0 und dann wieder eine 1 usw > angezeigt. Ich verstehe nicht was du damit meinst. Die diese Aussage von dir bei einem angeschlossenen DS18S20 ist einfach falsch. Bei angeschlossenen DS18S20 sollte eine 0 = OK dauerhaft Angezeigt werden und erst 1 = error wenn derselbe Sensor nicht mehr angeschlossen ist. Also nichts im wechsel oder sowas! jetzt klar! Ach ja muss mich noch bei dir Entschuldigen! Die Code-Beispiele von mir sind ja für AVR. Das du mit PIC Arbeitest hatte ich Total ignoriert. Bei meinen Routinen wird der Eingang über das Datenrichtungs Register gesteuert. Ob es sowas im PIC auch gibt entzieht sich meiner Kenntnis. Die delays in deinem Code scheinen nicht ganz zu stimmen, da muss man schon ziemlich genau an das Timing halten wie es im Datenblatt steht.
Er hat einen Atmeta 8 und stellt sich auch Megadusselig an. Wie man mit Internet und Unterstützung das nich zum Laufen bringen kann ist mir schleierhaft. Problemlösungskompetenz tendiert gegen 0.
Maxim schrieb:
>Problemlösungskompetenz tendiert gegen 0.
Alle Achtung! Solche Politikerphrasen schon am frühen Morgen -
da tun mir gleich wieder die Knie weh....
Buna-Pelzer
Klaus schrieb: > Tobias N. schrieb: >> im wechsel auf meinem LCD eine 0 und dann wieder eine 1 usw >> angezeigt. > > Ich verstehe nicht was du damit meinst. > > Die diese Aussage von dir bei einem angeschlossenen DS18S20 ist einfach > falsch. > > Bei angeschlossenen DS18S20 sollte eine 0 = OK dauerhaft Angezeigt > werden > und erst 1 = error wenn derselbe Sensor nicht mehr angeschlossen ist. > > Also nichts im wechsel oder sowas! jetzt klar! > > Ach ja muss mich noch bei dir Entschuldigen! Die Code-Beispiele von mir > sind ja für AVR. Das du mit PIC Arbeitest hatte ich Total ignoriert. > Bei meinen Routinen wird der Eingang über das Datenrichtungs Register > gesteuert. Ob es sowas im PIC auch gibt entzieht sich meiner Kenntnis. > > Die delays in deinem Code scheinen nicht ganz zu stimmen, da muss man > schon ziemlich genau an das Timing halten wie es im Datenblatt steht. ne ich habe ja in der main() eine while() die ow_reset() (wo ich dann auf dem display eine 0 angezeigt bekomme) und eine sekunde später ow_reset2() (wo ich dann auf dem display eine 1 angezeigt bekomme) ausführt. also bei ow_reset() (wo delay_us benutzt wird) bekomme ich eine 0 und wenn dann ow_reset2() (wo delay_ms benutzt wird) ausgeführt wird bekomme ich eine 1 also kann ich doch davon ausgehen das das timing bei ow_reset() stimmt also der ds18s20 antwortet, weil ja 0 zurückgeliefert wird. somit kann ich sagen die reset funktion und der presence klappt und ich kann mich an die weiteren funktionen machen, oder?
Kennst du den Unterschied zwischen delay_ms und delay_us? Auch die Bedeutung der Parameter?
Wie bin ich blos auf PIC gekommen. Tobias N. schrieb: > das timing bei > ow_reset() stimmt also der ds18s20 antwortet So gesehen JA! Schmeiss mal diese Code Zeilen PORTC |= (1<<PC5) und das PORTC &= ~(1<<PC5); raus Es reicht völlig mit DDRC zuarbeiten. PULL-UP Ein- und Auschalterei ist völlig überflüssig. Und mach das hier endlich in main rein. PORTC = 0x00; // Pull_UP aus DDRC &= ~(1<<PC5); // 1-wire Leitung auf LOW (Eingang)
Ach nochwas! Wie hast Du deinen DS18S20 angeschlossen? Sowie im Anhang? Falls Du den 4,7k Widerstand nicht angeschlossen hast funktioniert die Sache auch nicht. Das Ruhe Signal auf dem Bus ist ja High-Signal. Daten werden werden durch herunter ziehen der DQ Leitung übertragen. Lange Impulse sind Nullen kurze Impulse Einsen und die Zeiten was ne 0 ist oder 1 findest du im Datenblatt bzw, schön in der oben Verlinkten Doku in Deutsch. Musst halt durch Arbeiten.
Klaus schrieb: > Ach nochwas! > > Wie hast Du deinen DS18S20 angeschlossen? Sowie im Anhang? > > Falls Du den 4,7k Widerstand nicht angeschlossen hast funktioniert > die Sache auch nicht. > > Das Ruhe Signal auf dem Bus ist ja High-Signal. > Daten werden werden durch herunter ziehen der DQ Leitung übertragen. > > Lange Impulse sind Nullen kurze Impulse Einsen und die Zeiten was > ne 0 ist oder 1 findest du im Datenblatt bzw, schön in der oben > Verlinkten Doku in Deutsch. Musst halt durch Arbeiten. Das Datenblatt ist wirklich sehr anschaulich und mit 22 Seiten auch noch gut durch zu arbeiten.
so, ich habe jetzt mal ein wenig was erstellt, angepasst etc. pp. jetzt bekomme ich als wert 53. aber selbst wenn sich die temperatur ändert ändert sich am wert nichts. Im anhang sind meine Dateien vll. könnte ja jemand mal kurz dürber schauen. Danke euch.
Hat keiner eine Idee? Ich verzweifel langsam ein wenig.
Tobias N. schrieb: > Hat keiner eine Idee? Ich verzweifel langsam ein wenig. Anregungen gab es doch genug. Wie wäre es wenn du mal von deinem Hardware Aufbau ein paar Bilder machst im PNG format. Irgendwie scheinst alles zu Ignorieren!
so hier dann mal ein bild des aufbaues. das display wird mit der "mylcd" lib hier aussem forum betrieben. der DS18S20 wird extern betrieben und zwischen vcc und DQ ist ein 4,7k pullup widerstand.
@Tobias Ähh wo genau ist der Sensor angeschlossen? An der blauen Klemme?
Hat Dir niemand systematisches Arbeiten, oder systematische Fehlersuche beigebracht? Das mit der mangelnden Lösungskompetenz finde ich schon gut auf den Punkt gebracht!
Klaus schrieb: > @Tobias > Ähh wo genau ist der Sensor angeschlossen? An der blauen Klemme? ne da rechts oben neben dem mega8, da wo auch der widerstand ist. P.S.: er funktioniert jetzt aber nur "volle" grad zahlen. also keine nachkomma stellen, da muss ich mich nochmal dran machen. das problem war das ich falsch gelesen hatte bzw was überlesen hatte. ich hatte die ganze zeit das timing im kopf und zwischen start convert und auslesen der temp _delay_us(800); und da musste ich ja _delay_ms(800); machen, weil er ja min. 750ms braucht. jetzt muss ich nur noch die nachkomma stellen hinkriegen.
Wirrer Aufbau, wirre Vorgehensweise. Da würd ich auch nix gebacken bekommen. Alles schön auf einem Steckbrett wäre wesentlich übersichtlicher als alles über 3m Strippen zu verbinden. Aber das kommt halt auch davon dass man statt eines nackten µC lieber auf integrierte Boards setzt. gruß cyblord
cyblord ---- schrieb: > Wirrer Aufbau, wirre Vorgehensweise. Da würd ich auch nix gebacken > bekommen. Alles schön auf einem Steckbrett wäre wesentlich > übersichtlicher als alles über 3m Strippen zu verbinden. Aber das kommt > halt auch davon dass man statt eines nackten µC lieber auf integrierte > Boards setzt. > > gruß cyblord dann zeig mir mal die stripen. lol. das dünnes flachband ist das ISP kabel, (in system programmer, extra für dich), das andere ist ein 15cm flachband kabel fürs display. und das an den blauen anschluß ist die stromversorgung, was daran ist hier ein wirrer aufbau?
Tobias N. schrieb: > der > DS18S20 wird extern betrieben und zwischen vcc und DQ ist ein 4,7k Die Aussage hat mich jetzt verwirrt. Ich hätte da jetzt angenommen, das der Senor Fernab der Platine irgendwo ist. Aber nun gut das Du selber den Fehler gefunden hast. Tobias N. schrieb: > er funktioniert jetzt aber nur "volle" grad zahlen. Ist schon mal die halbe Miete. Der Sensor macht im Normalbetrieb 0,5°C Schritte. Mit dem Sensor geht auch 0,1 °C Schritte.
kann der auch sowas wie 23,52Grad usw? naja muss halt nur rausfinden wie.
Klaus schrieb: > Mit dem Sensor geht auch 0,1 °C Schritte. Wenn dann wohl eher Schritte von 0.5°C, 0.25°C, 0.125°C oder 0.0625°C
> Wirrer Aufbau, wirre Vorgehensweise. Da würd ich auch nix gebacken > bekommen. Alles schön auf einem Steckbrett wäre wesentlich > übersichtlicher als alles über 3m Strippen zu verbinden. Aber das kommt > halt auch davon dass man statt eines nackten µC lieber auf integrierte > Boards setzt. wirrer Satzbau, Groß- Kleinschreibung ist auch unbekannt... > kann der auch sowas wie 23,52Grad usw? Ich halte mir den Bauch vor Lachen.........
Tobias N. schrieb: > kann der auch sowas wie 23,52Grad usw? naja muss halt nur rausfinden > wie. Ne ne so war es nicht gemeint. Normal misst er 0, 0,5, 1,0, 1,5 usw. Höhere Auflösung 0,0, 0,1, 0,2, 0,3 oder von mir aus 27,3 usw.
Ich finde fast in jeder Zeile Verbesserungspotential: Der gröbste Bug: void ow_wr_bit(unsigned char bitwert) { // Start Time Slot: DQ auf Low OWDDR |= (1<<OWICPIN); // 1-wire Leitung auf LOW (Ausgang) OWPORT &= ~(1<<OWICPIN); // DQ auf Low // Bei logŽ1Ž: sofort wieder auf High = nur kurzer Low-Impuls if(bitwert) { OWPORT |= (1<<OWICPIN); // DQ auf High } _delay_us(105); // ca. 105 us warten bis OWPORT |= (1<<OWICPIN); // DQ auf High } Es fehlt zwei _delay_us(8)! Mindestdauer des L- und H-Pegels. Und das bitweise Rausschieben geht auch eleganter: void ow_wr_byte(unsigned char dat) { unsigned char i; unsigned char maske = 1; // 8 Bits nacheinander raus schieben, LSB zuerst for (i=0; i<8; i++) { if (dat & maske) ow_wr_bit(1); // log.Ž1Ž senden else ow_wr_bit(0); // log.Ž0Ž senden maske = maske * 2; // nächstes Bit selektieren } } //diese Zeile einmal am Anfang OWPORT &= ~(1<<OWICPIN); // DQ auf Low geschaltet wird mit DDR ! void ow_wr_byte(unsigned char data){ uint8_t mask = 1; do{ OWDDR |= (1<<OWICPIN); // 1-wire Leitung auf LOW (Ausgang) _delay_us(8); //Mindestdauer für L-Impuls if (data & mask == 0) _delay_us(105); //wenn 0, lange warten OWDDR &=~(1<<OWICPIN); // DQ auf High _delay_us(xx);//Mindestdauer für H-Impuls } while ( mask *= 2 ); //mask ist Maske und Bitzähler zugleich } Tut mir leid, Deine Beratungsresistenz ist wirklich außerordentlich. Du darfts nicht die Daten hart an OWPORT ausgeben, weil sonst zwei Ausgänge gegeneinander treiben. Der OW-Bus ist wired-or, d.h. Pins dürfen nur nach L gezogen werden, nicht nach H (was Du machst). > kann der auch sowas wie 23,52Grad usw? Der Vorgänger DS1820 und andere konnten das, er hatte eine (temperaturabhängige) Auflösung von etwa 0.01°. Aber Vorsicht, manche ICs sind mit DS1820 beschriftet und sind in Wirklichkeit DS18S20 (z.B. Pollin 180014 (2,50)).
Wenn Du das Scratchpad auslesen kannst, hier kompakter Code zum Ausgeben: Beitrag "Re: DS18S20 - extended resolution bei Temperaturen um 0°C" > kann der auch sowas wie 23,52Grad usw? fast, der Wert nach 23,50 ist 23,56 Beitrag "Re: DS18S20 - extended resolution bei Temperaturen um 0°C"
also das ist ja nicht von mir geschrieben worden. ich habe das alles nur abgeändert. als delay wurde z.b. eine for schleife benutzt woraus ich dann _delay_us gemacht habe, dann auf low war DQ=0 und high war DQ=1. ich bin froh das das jetzt geht. jetzt kann man das ganze natürlich aufpolieren verbessern etc. pp. das prizip und die funktionsweise habe ich nun verstanden jetzt kann man das alles mit sicherheit eleganter umsetzten. vorrangig war es für mich jetzt erstmal das es klappt.
>Aber Vorsicht, manche ICs sind mit DS1820 beschriftet und sind in >Wirklichkeit DS18S20 (z.B. Pollin 180014 (2,50)). daher sollte man mal den product code auslesen um zu sehen was für ein typ das ist... ds18b20 ist zu den älteren NICHT CODE KOMPATIBEL!!!!! Auch das steht im Datasheet. Mach mal nen Checker Lehrgang, Tobi !
Tobias N. schrieb: > kann der auch sowas wie 23,52Grad usw? naja muss halt nur rausfinden > wie. Tobias ganz ehrlich! Ich bin zwar der, der den Thread mit dem "Datenblatt" eröffnet hat, aber hier kann ich auch nur sagen: "Lies dir doch mal diese 22 Seiten durch!" Das sind hochneffektive 22 Seiten und da ist alles beschrieben, auch deine Nachkommastellen. Ganz deutlich sogar.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.