Forum: Mikrocontroller und Digitale Elektronik DS18S20 auslesen (finde den fehler nicht)


von Tobias N. (silberkristall)


Angehängte Dateien:

Lesenswert?

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.

von Ein (Gast)


Lesenswert?

Tobias N. schrieb:
> Hier mal mein C Code.
> http://nopaste.info/b485621093.html

Funktioniert bei dir die Funktion für Anhänge nicht?

von Ein (Gast)


Lesenswert?

Tobias N. schrieb:
> MCU ist der ATMega8 mit 1Mhz internem Takt.

Hast du das auch dem Compiler gesagt?

von Nico (nico123)


Lesenswert?

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?

von Tobias N. (silberkristall)


Lesenswert?

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

von troll (Gast)


Lesenswert?

Tobias N. schrieb:
> F_CPU 1000000
>
> so stehts inner Makefile,
schön und was ist in den Fuses eingestellt? externer Quarz? Welcher 
Wert?

von Tobias N. (silberkristall)


Lesenswert?

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.

von F. F. (foldi)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

Noch ein Tipp!

Optimierung -OS einstellen sonst stimmt das ganze delay gedöns nicht.

von Tobias N. (silberkristall)


Lesenswert?

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.

von Tobias N. (silberkristall)


Lesenswert?

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.

von Maxim (Gast)


Lesenswert?

Und noch ein Tipp:

nimm gleich einen DS18B20 !

von F. F. (foldi)


Lesenswert?

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
}

von Tobias N. (silberkristall)


Lesenswert?

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.

von Nico (nico123)


Lesenswert?

Hast Du die Spannungsversorgung schon kontrolliert? Wie versorgst Du den 
Sensor? (Hatte ich schonmal gefragt!)

von Klaus (Gast)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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?

von Klaus (Gast)


Lesenswert?

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"

von Tobias N. (silberkristall)


Lesenswert?

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.

von Tobias N. (silberkristall)


Lesenswert?

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

von Nico (nico123)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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
}

von Klaus (Gast)


Lesenswert?

Ups kleiner fehler eingeschlichen

while( read_bit == 0);//_delay_us(104);

sollte es heissen

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Beispiel was man auf dem Oszi sehen müsste wenn der 
Romcode
ausgelesen wird.  Siehe Anhang!

von Tobias N. (silberkristall)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von Tobias N. (silberkristall)


Lesenswert?

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.

von Tobias N. (silberkristall)


Lesenswert?

so habe den neuen code jetzt mal probiert, der ist auch 0, also das kann 
doch alles nicht sein -.-

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang ist noch ein Testprogramm das aber noch anpassen musst.

von Tobias N. (silberkristall)


Angehängte Dateien:

Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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.

von Tobias N. (silberkristall)


Lesenswert?

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?

von Klaus (Gast)


Lesenswert?

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.

von Maxim (Gast)


Lesenswert?

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.

von Buna-Pelzer (Gast)


Lesenswert?

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

von Tobias N. (silberkristall)


Lesenswert?

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?

von DirkB (Gast)


Lesenswert?

Kennst du den Unterschied zwischen delay_ms und delay_us?
Auch die Bedeutung der Parameter?

von Klaus (Gast)


Lesenswert?

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)

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

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.

von F. F. (foldi)


Lesenswert?

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.

von Tobias N. (silberkristall)


Angehängte Dateien:

Lesenswert?

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.

von Tobias N. (silberkristall)


Lesenswert?

Hat keiner eine Idee? Ich verzweifel langsam ein wenig.

von Klaus (Gast)


Lesenswert?

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!

von Tobias N. (silberkristall)


Angehängte Dateien:

Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

@Tobias
Ähh wo genau ist der Sensor angeschlossen? An der blauen Klemme?

von Karl (Gast)


Lesenswert?

Hat Dir niemand systematisches Arbeiten, oder systematische Fehlersuche 
beigebracht?

Das mit der mangelnden Lösungskompetenz finde ich schon gut auf den 
Punkt gebracht!

von Tobias N. (silberkristall)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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

von Tobias N. (silberkristall)


Lesenswert?

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?

von Klaus (Gast)


Lesenswert?

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.

von Tobias N. (silberkristall)


Lesenswert?

kann der auch sowas wie 23,52Grad usw? naja muss halt nur rausfinden 
wie.

von Ein (Gast)


Lesenswert?

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

von Herald (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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.

von eProfi (Gast)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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"

von Tobias N. (silberkristall)


Lesenswert?

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.

von dulle (Gast)


Lesenswert?

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

von F. F. (foldi)


Lesenswert?

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
Noch kein Account? Hier anmelden.