DS18S20 auslesen (finde den fehler nicht)

OP #2996048
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.
Angehängte Dateien:
#2996258
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
}
OP #2996259
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.
Gast #2996283
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
}
Gast #2996394
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
}
OP #2996463
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
Gast #2996506
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.
OP #2996528
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.
Gast #2996712
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.
Angehängte Dateien:
OP #2996953
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 :)
Angehängte Dateien:
Gast #2996967
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.
OP #2996974
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?
Gast #2997135
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.
OP #2997369
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?
Gast #2997933
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)
Gast #2997984
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.
Angehängte Dateien:
#2998420
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.
OP #3000445
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.
Angehängte Dateien:
OP #3003413
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.
#3003422
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
OP #3003430
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?
Gast #3003476
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.
Gast #3003626
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.........
Gast #3003701
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)).
OP #3003857
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.
Gast #3003885
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 !
#3003899
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.

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