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.
Hat denn keiner von euch einen DS1820 oder eher DS18S20 programmiert
bisher? Vielleicht bin ich einfach nur blind und sehe einen einfachen
Fehler nicht.
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
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
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?
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
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!
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
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.
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
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.
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.
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.
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.
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.
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
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
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.
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
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.