Forum: Mikrocontroller und Digitale Elektronik DS1820 antwortet nicht


von Thomas W. (gras78ix)


Lesenswert?

Hallo Leute!
Versuche mich gerade an einem STK500 mit AT90S2313, an dem
ein DS1820 angeschlossen ist.
Der Code bewirkt folgendes: Schalte eine Board LED an und resette
den DS1820; dann warte solange bis der DS1820 ein Low antwortet;
wurde ein Low gesendet,dann Schalte die LED aus.

Mein Problem: der DS1820 sendet kein Low, ich bleib auf immer
un ewig im High-State.
Kann mir jemand helfen?

(Bei der Schaltung ist Vcc mit der Datenleitung mit einem 4.7 kOhm
(0.5 Watt) Widerstand verbunden...als PullUp)

-> Der Code ist ganz einfach:
      sbi   _I2C_PortDirection,_I2C_DataPin ;Sda = Low
  ;wait min. 480 mueSec
  ldi   r16,31
  rcall   MCU_sleep1mueS
  cbi    _I2C_PortDirection,_I2C_DataPin ;Sda = High
  DS1820_reset_wait:
    in  r16,_I2C_InputPort
    andi  r16,(1<<_I2C_DataPin)
    cpi  r16,0
    brne  DS1820_reset_wait
      rjmp DS1820_reset_exit
  DS1820_reset_exit:
    rcall  ErrorLed_off

von Philipp S. (philipp)


Lesenswert?

1. Hast Du mal im Oszi angeschaut, ob der Bus so aussieht wie er soll?

2. Hast Du dafür gesorgt, daß der 1820 etwas "Vorsprung" hat, also
auf jeden Fall initialisiert ist, wenn der µC mit dem Reset anfängt?

3. Der Code scheint mir sehr umständlich zu sein. Würde statt

  DS1820_reset_wait:
    in  r16,_I2C_InputPort
    andi  r16,(1<<_I2C_DataPin)
    cpi  r16,0
    brne  DS1820_reset_wait

nicht auch

  DS1820_reset_wait:
    sbic _I2C_InputPort, _I2C_DataPin
    rjmp DS1820_reset_wait

funktionieren? (Durch übersichtliche Programmierung vermeidet man
Flüchtigkeitsfehler. Dazu gehört übrigens auch, daß man einem 1wire-Pin
nicht den Namen aus dem letzten Projekt stehen läßt.)

von Thomas W. (gras78ix)


Lesenswert?

ok, war ja nur fuern Schnelltest.
Der funktioniert aber immernoch nicht. Habe dem nach der
Portinitialisierung:
    cbi DDRB,_I2C_DataPin
  cbi PORTB,_I2C_DataPin
fast ne Sekunde gewartet. Das Messgeraet zeigt demnach
ein High auf der DataLine. Und die LED bleibt an.
der ganze Code:
->    ldi   r16,_StackStart
  out   SPL,r16
  rcall  MCU_initPortB
  sei
  rcall   ErrorLed_init
  rcall   ErrorLed_on
  ldi     r16,250
    rcall   MCU_sleep1mueS

  sbi   _I2C_PortDirection,_I2C_DataPin ;DataLine = Low
    ;wait min. 480 mueSec
    ldi   r16,31
    rcall MCU_sleep1mueS
    cbi  _I2C_PortDirection,_I2C_DataPin ;DataLine = High
    DS1820_reset_wait:
      sbic _I2C_InputPort, _I2C_DataPin
          rjmp DS1820_reset_wait
    DS1820_reset_exit:
      rcall  ErrorLed_off

  MainLoop:
    nop
    rjmp MainLoop


Einen Oszi hab ich nicht. Wie leicht kann denn der DS1820 schrotten?

von Philipp S. (philipp)


Lesenswert?

Ich habe noch keinen kaputtgemacht.

Du bist Dir sicher, daß der Takt richtig "gefused" ist, damit die
480µs stimmen? Sonst weiß ich es auch nicht. So ein Oszi ist schon eine
feine Sache, da siehst Du, ob Dein Pulse richtig lang ist, ob er
überhaupt kommt, ob danach vielleicht der 1820 den Bus ein bißchen
runterzieht, es aber nicht ganz schafft usw.

von Mike Schultz (Gast)


Lesenswert?

Den 1820 kannst du sehr wohl zerstören. Dazu reicht es aus das
Datenblatt nicht ganz genau zu lesen und deshalb die Pins zu
vertauschen.
Falls dir sowas passiert sein sollte, mußt du mal einen anderen Sensor
probieren. Ansonsten sit es aber ziemlich schwer den Chip kaputt zu
kriegen.

von Thomas W. (gras78ix)


Angehängte Dateien:

Lesenswert?

Kann meine Schaltung problematisch sein, da ich die gleiche
PowerLine fuer den PullUp angezapft habe, wie in den Sensor
reingeht?
Auf anderen Schaltungen wird immer eine andere Stromquelle angezepft...
(die Soll-Schaltung zeigt eine Referenzschaltung, die Ist- meine)

von Der 2te Michael (Gast)


Lesenswert?

Hi,
deine Schaltung sollte so funktionieren.

Der 1-Wire-Bus ist aber beim Timing sehr sensibel. Die Zeiten müssen
genau stimmen.
Habe mich auch einige Tage damit gespielt. Die Lösung habe ich dann mit
einem Speicheroszi gefunden, denn programmtechnisch war ich sauber, aber
die Zeiten stimmten nicht.

Ich würde für die 1-Wiregeschichte keinen Aufruf einer Timerroutine
(rcall   MCU_sleep1mueS) machen sondern direkt im Code die Befehle
einfügen. Hintergrund beim Aufruf eines Unterprogrammes werden die
Register gesichert usw.

Ablauf:
1.) Pin für mind. 480µs auf LOW
2.) Pin auf High
3.) mind. 60µs warten
4.) Pin samplen


Grüße,

Michael

von Thomas W. (gras78ix)


Lesenswert?

Hallo!
Ich weiss jetzt,dass der ds1820 tot ist. Nur warum und wie das
passiert ist, kann weiss ich nicht.

Es ist folgendes: ich habe die Schaltung von vorhin genommen,
Die Datenleitung geht auf den PB0 pin des STk500,
die Gnd Leitung auf einen der zwei einsamen Gnd Pins und die +V Leitung
auf den VTG pin von PORTD. Sobald ich einschalte
leuchten auf einmal die Status-LED des STK500 und noch eine andere LED
ROT, die sonst immer gruen sind.
Wenn ich das etwas 3mal mache ist der DS1820 tot....

Weiss jemand was da passiert und warum??


(Schaltung ist wie gehabt mit dem 4.7 kOhm PullUp - gemessen und
ueberprueft)

von Thomas W. (gras78ix)


Lesenswert?

...wenn ich den DS1820 aber mit der Polung vertausche, also
+5V an dessen Gnd und Gnd an dessen Vcc pin, dann "antwortet"
der Sensor mit einem Low, nachdem Low,High-reset Signal...

ist denn die Polung auf dem Datenblatt falsch??

von tsetse (Gast)


Lesenswert?

Wenn Du mit den Pins nicht sicher bist, nimm den Parasite-Power-Mode, da
geht auch verpolt nichts kaputt, da der Strom begrenzt ist
(hier Vdd und Gnd verbinden!).

Beim Temperaturmessen braucht er mehr Strom, dann musst Du das Pin
aktiv hoch schalten.

Das Datenblatt zeigt den Sensor von unten gesehen (bottom view).
Wenn er richtig antwortet, ist er richtig rum angeschlossen.

von Peter D. (peda)


Lesenswert?

;wait min. 480 mueSec
  ldi   r16,31
  rcall   MCU_sleep1mueS

Das ist falsch.

Der Resetpuls muß zwischen 480 ... 960µs sein, nach 1ms ist schon
wieder alles zu spät.

Dein DS1820 wird also noch ganz sein.


Peter

von Thomas W. (gras78ix)


Lesenswert?

Hey @peter @tsetse,
dass sind genau die infos die ich brauchte!
Danke - mein kleines Enigma ist somit geknackt....cool

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.