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
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.)
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?
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.
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.
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)
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
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)
...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??
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.
;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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.