Forum: Mikrocontroller und Digitale Elektronik DS1820 - spricht nicht an ...


von Ronny Schulz (Gast)


Lesenswert?

Hallo Freunde der Temperaturmessung,

wieder einmal gibt es Probleme ... ich habe mir hier einen DS1820 an
den Portpin des ATmega16 rangehangen und der zeigt keine Reaktion. VDD
ist auf 5V, GND auf GND und DQ am Portpin und mit einem 4k7 R auf 5V.
Der zeigt keine Reaktion auf den Resetimpuls ... hier mein Testprogramm
... :

.equ ds1820_ctrl_port  = PORTA
.equ ds1820_ctrl_ddr  = DDRA
.equ ds1820_in_port  = PINA
.equ ds1820_1wr_bit  = 5

;returns:
;Z=0: Okay
;Z=1: Fehler: Timeout
ds1820_reset_pulse:
  push  r16                ;Register sichern
  push  r17                ;Register sichern
  sbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Ausgang
  cbi    ds1820_ctrl_port,ds1820_1wr_bit  ;low = Reset
  rcall  delay500us            ;Wartezeit min. 480us
  cbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Eingang
  ldi    r17,5              ;min. 240us (5*50) warten
_ds1820_reset_wait0_loop:
  rcall  delay50us            ;50us warten
  in    r16,ds1820_in_port        ;1-wire in Register r16
  sbrs  r16,ds1820_1wr_bit        ;wenn 1-wire = 0, dann
  rjmp  _ds1820_reset_wait0_end      ;Ende der Schleife
  dec    r17                ;wenn Zeit noch nicht abgelaufen (r17)
  brne  _ds1820_reset_wait0_loop    ;dann erneute Schleife
  breq  _ds1820_reset_end        ;sonst Z=1 -> break
_ds1820_reset_wait0_end:
  ldi    r17,5              ;min. 240us (5*50) warten
_ds1820_reset_wait1_loop:
  rcall  delay50us            ;50us warten
  in    r16,ds1820_in_port        ;1-wire in Register r16
  clz                    ;zero flag löschen
  sbrc  r16,ds1820_1wr_bit        ;wenn 1-wire = 1, dann
  rjmp  _ds1820_reset_end        ;Ende der Schleife
  dec    r17                ;wenn Zeit noch nicht abgelaufen (r17)
  brne  _ds1820_reset_wait1_loop    ;dann erneute Schleife, sonst Z=1
_ds1820_reset_end:
  pop    r16                ;Register zurückholen
  pop    r17                ;Register zurückholen
  ret


Wäre toll, wenn jemand was sieht .. ich habe schon ewig rumgefummelt
und bin noch recht neu in der Materie! Am Ende ist Z immer 1.

von Ronny Schulz (Gast)


Lesenswert?

Hat denn keiner von euch einen DS1820 oder eher DS18S20 programmiert
bisher? Vielleicht bin ich einfach nur blind und sehe einen einfachen
Fehler nicht.

von ThomasB (Gast)


Lesenswert?

Hei Ronny:
gieb mal hier im Forum bei Suchen "ds1820"ein :-)
Oder versuch es mal hier http://www.avrfreaks.net/
Habe den DS1820 nur in Bascom prog.funktioniert einwandfrei.


ThomasB

von Robin P (Gast)


Lesenswert?

hi,

mein timing ist:
- Dq LOW
- 500µs warten
- PortPin als Eingang
- 100µs warten
- PortPin lesen
- 400µs warten

ich denke deine 50µs sind zu kurz. denn der DS18S20 antwortet ja erst
frühestens 60µs nach Ende des Reset Signals (LOW).

Die Schleife kannste dir eigentlich sparen, bei mir gehts mit o.g.
Timing 100%

gruss
robin

von Ronny Schulz (Gast)


Lesenswert?

Danke!

Der wartet ja nicht nur 50us, sondern maximal 5*50us und damit sollte
es ja wieder passen. Aber ich probiere es einfach mal ohne Schleifen.

Und wo nimmst Du die 400us her? Basieren die auf den gesamten Time-Slot
und du liest damit das high einfach nicht mehr zurück?

von Robin P (Gast)


Lesenswert?

er wartet insgesamt 1000µs da die initialisierungsprozedur ja mindestens
960µs dauert.
nöö, ob er datenbus nachher wieder auf HIGH geht kontrolliere ich
nicht. und wenn dann würde ich es frühestens nach 480µs + 60µs + 240µs
= ca. 800µs machen.

gruss
robin

von Ronny Schulz (Gast)


Lesenswert?

Hallo und vielen Dank. Ich habe zumindest die "reset_pulse"-Sache
hinbekommen. Erstmal könnte ich mir auf die Stirn klatschen. Zwei
fatale Fehler habe ich gemacht:

1. Versorgungsspannung am DS18S20 angeschlossen
2. den falschen Portpin angesprochen (im Debugger gesehen)

Dann geht das zumindest. Allerdings muss man dabei beachten, dass ein
Fehler danach irgendwo bedeutet, dass ich die Spannung komplett
abschalten muss und den neu starten. Denn ich habe jetzt auch das High
mit reingebracht und der liest einmal und dann ist Sense. Zumal als
Temperatur LSB und MSB nur 0 rauskommen. Also sind irgendwo noch
Fehler. Die zu finden wird aber wohl schiwieriger werden, da ich nicht
so recht weiss, wie ich da rangehen soll. Aber hier nochmal der Code
vom reset_pulse:

;Z=0: okay
;Z=1: nichts gefunden
ds1820_reset_pulse:
  push  r16                ;Register sichern
  push  r17
  sbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Ausgang
  cbi    ds1820_ctrl_port,ds1820_1wr_bit  ;low = Reset
  rcall  delay400us            ;Wartezeit min. 480us
  rcall  delay40us
  rcall  delay40us
  cbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Eingang
  rcall  delay40us            ;wartet 80us
  rcall  delay40us
  in    r16,ds1820_in_port        ;1-wire port nach r16 und
  andi  r16,ds1820_1wr_bit        ;maskieren
  rcall  delay400us            ;Wartezeit min. 400us + 80us
  in    r17,ds1820_in_port        ;1-wire port nach r17 und
  andi  r17,ds1820_1wr_bit        ;maskieren
  eor    r16,r17              ;beide unterschiedlich?
  pop    r17                ;Register zurückholen
  pop    r16
  ret

Sieht doch schon besser aus. Danke!

von Robin P (Gast)


Lesenswert?

hi, wenns dir was bringt dann poste ich mal meine pascal-proceduren...
bin aber eigentlich neuling mit avr und mit ds18s20 erst recht, drum
muss da auch nicht alles 100% richtig sein, aber es funktioniert

gruss
robin

von Ronny Schulz (Gast)


Lesenswert?

Danke! Ist nett gemeint, aber ich denke das macht wenig Sinn, weil ich
versuche den komplett in ASM zu programmieren. Der DS18S20 macht mir
allerdings ganz schön Kopfzerbrechen. Selbst die einfache Rutine da
oben funktioniert an einem andren Portpin plötzlich nicht mehr.
Irgendwo ist da der Wurm drin.

von Peter D. (peda)


Lesenswert?

In der Codesammlung ist ein komplettes Beispiel, um auch mehrere
Sensoren auszulesen:


http://www.mikrocontroller.net/forum/read-4-32158.html


Ist für Tiny12, sollte daher auch auf dem Mega16 laufen. Allerdings
sind bei über 3,2MHz die Warteschleifen anzupassen (2 Zählregister
nötig).


Peter

von Ronny Schulz (Gast)


Lesenswert?

Naja dann schaue ich mir die 1-wire-Routine nochmal an. Vielleicht habe
ich da einen Fehler gemacht. Auch wenn ich deinen Code ziemlich schwer
verstehe. Aber das ist ja meist so, wenn man nicht seine eigenen Zeilen
liest. Eine Frage habe ich aber noch:

Woher weiss man, dass mehr als ein DS18S20 dran hängt? Also vom
technischen her.

von Ronny Schulz (Gast)


Lesenswert?

Okay .. die letzte Frage hat sich erledigt. Ich bin da über ROM-Search
gestolpert. Jetzt muss ich das nur mal packen .. ich schaue mri deinen
Code mal an und verfolge mein Programm. Direkt übernehmen will ich das
nicht. Dafür ist mein Programm insgesamt schon viel zu groß, als dass
ich da einfach mal externen Code einkippen kann.

von Ronny Schulz (Gast)


Lesenswert?

So und ich nochmal. Man kann sich garnicht vorstellen, wie lange ich
jetzt wieder dran gefummelt habe. Die Codebeispiele angeschaut, die
Doku nochmal gewälzt (ich glaube ich habe das DS18S20 Guide bald
komplett im Kopf). Und was soll ich sagen: Ich habe noch ein paar
Fehler gefunden. Das waren aber weniger technische Fehler, als einfach
Programmierfehler. CBI und SBI mal verwechselt oder sowas.

Aber eine Sache ist dennoch offen:
Der zeigt mir immer 85°C an. Also da steht dann 170 drin. Das kann doch
kein Fehler von mir sein oder doch? Das passiert sowohl im parasite
mode, als auch im normalen Mode. Die count_per_remain und count_per_c
usw. stimmen auch. CRC habe ich mir noch nicht angeschaut.

von Robin P (Gast)


Lesenswert?

hast du denn schonmal einen ConverT gemacht? ;)
die 85° sind doch standardmäßig drin nach nem reset oder?

gruss
robin

von Ronny Schulz (Gast)


Lesenswert?

Jepp habe ich. Aber wenn der die 85°C auch ohne Convert-T ausliest, dann
teste ich das nochmal. Vielleicht ist da noch ein Fehler. VIelen Dank
für den Tip.

Dann hatte ich das im Datenblatt nicht verstanden - da stand zwar was
von PowerOn und 85°C.. naja.

von Ronny Schulz (Gast)


Lesenswert?

Ja ist so, als wenn ich Convert_T nie gemacht hätte, was ich aber nicht
verstehe. Das wird so durchlaufen:

  rcall  ds1820_reset_pulse
  rcall  ds1820_skip_rom
  rcall  ds1820_convert_t
  rcall  ds1820_reset_pulse
  rcall  ds1820_skip_rom
  rcall  ds1820_read_scratchpad
  rcall  ds1820_reset_pulse

Da ich ja Daten lesen kann, gehe ich davon aus, dass alles funktioniert
und nur im Convert_T ein Fehler ist. Aber ich verstehe nicht wo.
Vielleicht sieht ja jemand über meine Blindheit hinweg:

ds1820_convert_t:
  push  para1
  ldi    para1,0x44
  rcall  ds1820_write

;  sbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Ausgang
;  sbi    ds1820_ctrl_port,ds1820_1wr_bit  ;Parasite Power!
;  rcall  delay750ms
;  cbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Eingang
;  pop    para1
;  ret

  sbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Ausgang
  cbi    ds1820_ctrl_port,ds1820_1wr_bit  ;schreiben
  rcall  delay10us            ;min. 1us warten, max. 15us
  cbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Eingang
  rcall  delay10us
_ds1820_convert_t:
  sbis  ds1820_in_port,ds1820_1wr_bit  ;wartet bis conversion zu Ende 
ist
  rjmp  _ds1820_convert_t
  rcall  delay40us            ;Slot min. 60us
  rcall  delay10us
  pop    para1
  ret

Das auskommentierte ist nur für parasite Power. Im Moment benutze ich
aber ganz normal 5V. Aber auch der parasite power mode bringt keine
Unterschiede zu Tage.

von Robin P (Gast)


Lesenswert?

nabend,

probier doch mal die abfrage ob er mit dem Convert_T fertig ist
wegzulassen und mach ein 1s oder 2s delay rein. vielleicht unterbrichst
du ihn immer schon während dem Convert_T ?? und das dauert ja ungefähr
1s...

gruss
robin

ps: aber nen wirklichen fehler kann ich so au net entdecken...
bin aber au kein asm experte

von Peter D. (peda)


Lesenswert?

Ich kann jetzt nicht sagen, ob Dein Busy-Test richtig ist.

Ich warte auch einfach immer 1s, geht ja bei parasite Power nicht
anders.

Zu schnelles Auslesen heizt den Sensor auch nur unnnötig auf (5mW).


Peter

von Ronny Schulz (Gast)


Lesenswert?

Naja wenn ich den parasitär betreibe sieht das ja nicht anders aus. Dann
ist VDD nit GND verbunden und für convert_t nehme ich nur das
auskommentierte. Was dann so aussieht:


ds1820_convert_t:
  push  para1
  ldi    para1,0x44
  rcall  ds1820_write
  sbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Ausgang
  sbi    ds1820_ctrl_port,ds1820_1wr_bit  ;Parasite Power!
  rcall  delay750ms
  cbi    ds1820_ctrl_ddr,ds1820_1wr_bit  ;Port für 1-wire auf Eingang
  pop    para1
  ret

Und wie ich das verstanden habe braucht der bis zu 750ms. Und dennoch
bekomme ich am Ende 85°C.

von Robin P (Gast)


Lesenswert?

vielleicht ist dein pullup widerstand zu groß. aber wenn du dich an die
4,7k im datenblatt für self-powerd gehalten hast dann müssts doch
gehen.

mahlzeit
robin

ps: sonst probier doch mal nen anderen aus

von Ronny Schulz (Gast)


Lesenswert?

Ja .. ich habe natürlich den 4.7k rangehangen. Ich habe hier 2 DS18S20
.. beide zeigen genau das Gleiche. Vielleicht sind beide kaputt. Wäre
ärgerlich, denn billig sind die ja nicht gerade.

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.