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.
hast du denn schonmal einen ConverT gemacht? ;) die 85° sind doch standardmäßig drin nach nem reset oder? gruss robin
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.