Forum: Mikrocontroller und Digitale Elektronik Reset eines DS18S20 geht nicht


von Daniel D. (daniel_d)


Lesenswert?

Hi, ich fummel hier jetzt schon seit 2 Tagen rum aber es will einfach 
nicht klappen. Es hängt schon daran, dass der Sensor die Leitung beim 
Reset nicht auf 0 zieht.

Benutze einen ATmega32 mit 16Mhz extern
Der Sensor wird extra mit Strom versorgt, also kein parasitäre 
Versorgung.
4.7k Widerstand hängt an der Datenleitung als Pullup.

Meine Routine sieht so aus:
1
uint8_t one_wire_reset() {
2
  uint8_t i;
3
  
4
  ONE_WIRE_OUTPUT_MODE();
5
  ONE_WIRE_LOW(); // Leitung auf 0 ziehen
6
  _delay_us(480);
7
  
8
  ONE_WIRE_INPUT_MODE(); // Pullup zieht die Leitung auf 1
9
  _delay_us(70);
10
  
11
  i = ONE_WIRE_PIN & (1<<ONE_WIRE_BIT); // ds1820 sollte Leitung auf 0 gezogen haben
12
  _delay_us(410);
13
  
14
  if ((ONE_WIRE_PIN & (1<<ONE_WIRE_BIT)) == 0)
15
    i = 0xFF; // Leitung scheint immer 0 zu sein (Kurzschluss?)
16
  
17
  return i; // 0 = Slave vorhanden
18
}

Verkabelung hab ich schon mehrmals untersucht und auch neu auf dem 
Steckbrett aufgebaut (nur Sensor ist da drauf mit 10cm Kabel verbunden). 
Ich weiß einfach nicht, woran es liegen kann. Hab auch mal direkt vor 
der Zeile _delay_us(70); eine Endlosschleife eingefügt, die auf 0 
testen..es passiert aber nicht. Heut hab ich mir auch einen zweiten 
Sensor geholt, um ausschließen zu können, dass der erste defekt ist.

Bin für jede Hilfe dankbar.

von Markus B. (mbp-bayern)


Lesenswert?

Daniel D. schrieb:
> ONE_WIRE_OUTPUT_MODE();

Hallo Daniel,

Woher hast Du denn den Code ?
Wo/Wie sind die von Dir aufgerufenen Funktionen oder Makros definiert ?

Prüfe also evtl. vorhandene ".h" Dateien,
dass dort die richtigen Ports eingestellt sind etc.

Der DS18B20 und der DS18S20 sind soweit ich das weiß recht ähnlich.
Somit helfen die die Links dort villeicht auch:
http://www.mikrocontroller.net/part/DS18B20

MFG:MBP
Markus.

Edit:
Daniel D. schrieb:
> Hab auch mal direkt vor
> der Zeile _delay_us(70); eine Endlosschleife eingefügt

Warum nicht zwischen:
> ONE_WIRE_LOW(); // Leitung auf 0 ziehen
und
>   _delay_us(480);
Ne Endlosschleife und dann mit dem Multimeter messen ?

von Daniel D. (daniel_d)


Lesenswert?

Diesen relevanten Teil hab ich völlig vergessen :P
1
#define ONE_WIRE_PORT PORTC
2
#define ONE_WIRE_DDR DDRC
3
#define ONE_WIRE_PIN PINC
4
#define ONE_WIRE_BIT PC1
5
6
#define ONE_WIRE_INPUT_MODE() ONE_WIRE_DDR &= ~(1<<ONE_WIRE_BIT)
7
#define ONE_WIRE_OUTPUT_MODE() ONE_WIRE_DDR |= (1<<ONE_WIRE_BIT)
8
#define ONE_WIRE_LOW() ONE_WIRE_PORT &= ~(1<<ONE_WIRE_BIT)
9
#define ONE_WIRE_HIGH() ONE_WIRE_PORT |= (1<<ONE_WIRE_BIT)

von Daniel D. (daniel_d)


Lesenswert?

Diesen relevanten Teil hab ich völlig vergessen :P
1
#define ONE_WIRE_PORT PORTC
2
#define ONE_WIRE_DDR DDRC
3
#define ONE_WIRE_PIN PINC
4
#define ONE_WIRE_BIT PC1
5
6
#define ONE_WIRE_INPUT_MODE() ONE_WIRE_DDR &= ~(1<<ONE_WIRE_BIT)
7
#define ONE_WIRE_OUTPUT_MODE() ONE_WIRE_DDR |= (1<<ONE_WIRE_BIT)
8
#define ONE_WIRE_LOW() ONE_WIRE_PORT &= ~(1<<ONE_WIRE_BIT)
9
#define ONE_WIRE_HIGH() ONE_WIRE_PORT |= (1<<ONE_WIRE_BIT)

Markus B. p. schrieb:
> Warum nicht zwischen:
>> ONE_WIRE_LOW(); // Leitung auf 0 ziehen
> und
>>   _delay_us(480);
> Ne Endlosschleife und dann mit dem Multimeter messen ?

Der ATmega zieht die Leitung auf 0, nur der Sensor soll danach das 
gleich tun, macht er aber nicht, leider.. :(

von Markus B. (mbp-bayern)


Lesenswert?

Hallo Daniel,

Hast Du eine Möglichkeit das Timing zu Prüfen - Oszi z.B. ?
Da sind die Sensoren kritsich.

Die "falsche" Optimierung kann Problem machen.
Weiter muss F_CPU zur Taktfrequenz passen.
Und denke auch an die FUSES: Externer Quarz oder Interne x MHz...

Ansonsten:
Beitrag "DS1820, DS18B20 in C"

MFG:MBP

von Daniel D. (daniel_d)


Lesenswert?

Ein Oszi hätte ich wirklich gerne, hab auch dran gedacht.
An "falsche" Optimierungen aber noch nicht, da werde ich mich gleich mal 
ein wenig drum kümmern. Vielleicht finde ich da was.
F_CPU und FUSES passen, mein Testboard läuft auch an sich. LCD und MMC 
Karte hab ich schon ansprechen können. Die sind aber glaub ich bei 
Weitem nicht so anfällig auf kleine Timing-Schwankungen.

Danke schonmal für die Hilfe :)

von Daniel D. (daniel_d)


Lesenswert?

Ich bin das Programm jetzt mal in dem Simulator von AvrStudio 
durchgegangen. Dabei hab ich gleich ein Auge auf die Stopuhr geworfen, 
die viel zu kurze Zeiten für die delay-Schleifen angab. Spaßeshalber hab 
ich die Werte so angepasst, sodass die Dauer stimmt..hab dann gemerkt, 
dass quasi jeder Wert mit 16 multipliziert werden musste. Moment?! Ist 
das nicht meine Taktfrequenz? Ja! ... F_CPU war zwar angegeben, das 
drang wohl aber nicht bis nach 1wire.c/h durch.. jedenfalls geht es 
jetzt..

Danke, das hier hat mir geholfen wieder mit einem klareren Kopf an die 
Sache zu gehen.

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.