Hallo Forum-Team. Ich habe eine Frage zum 1-Wire-Bus. Ich habe mit CodeVision ein kleines Testprogramm geschrieben, dass mir die Temperatur von zwei DS18B20 auf ein Display anzeigt. Ich verwende einen ATmega16. Das Programm funktioniert einwandfrei. Dieses Programm beschränkt sich einzig und allein auf die DS18B20. Also nichts anderes steht in diesem Testprogramm. Jetzt habe ich ein ganz anderes Programm das wirklich relativ groß ist. Fast alle Komponenten im Mega 16 werden verwendet. Unter anderem habe ich in diesem Projekt eine 12V Lampe die über fast PWM mit dem Systemclock 4MHz läuft. Ich habe jetzt riesen Probleme die DS18B20 auszulesen. Was seltsam ist, die Erkennungb wie viel Busteilnehmer am Bus hängen (unter anderem ein kleines Programm in der Hilfe von CodeVision) funktioniert nicht. Wenn ich den Pin für das PWM Signal (OC2 = PD7) in der Initialisierung auf 1 setzte (DDDR = 0x80) dann funktioniert mein Licht ganz normal, allerdings werden keine Teilnehmer erkannt. Das wundert mich schon sehr, da der 1Wire-Bus am PD5 hängt. Ich habe ihn auch schon an einen ganz anderen Pin-Port gehängt, aber auch das ging nicht. Wenn ich dann den Port D anderes initialisiere (DDRD0x00), dann geht die Erkennung, manchmal. Aber auch nicht immer. Natürlich geht dann das Licht nicht!! In dem großen Programm geht auch gar keine Temperaturauswertung. Es wird keine Temperatur angezeigt (die Klassische -9999). Es ist aber die gleich Hardware wie bei dem kleinen Programm, nur die Software auf dem Mega 16 ist anders. Sprich, es werden von mir keine Timer, ISRs und I2C verwendet. Meine Frage an euch ist, welche Komponenten werden den intern für den 1-Wire-Bus verwendet die mir im großen Programm eventuell Probleme machen?? Woran kann es liegen dass die Erkennung für den 1-Wire-Bus bei den zwei unterschiedlichen DDDR Einstellungen mal geht und mal nicht obwohl diese Einstellung nichts mit dem Pin zu tun hat?? Hat einer eine Idee wieso die Temperatur im kleinen Testprogramm erkannt wird und beim großen nicht. Die zwei Programme sind eigentlich identisch nur das im Großen einfach viel mehr drin steht. Klar, ihr könnt nicht in mein Programm rein schauen, aber das will ich keinem zumuten :o) Aber vielleicht hat ja jemand ähnliche Erfahrungen gemacht . Wäre sehr dankbar wenn mir vielleicht jemand weiterhelfen könnte. Mit bestem Gruß, Marcel
Also da du das 1-Wire anscheinend über Software gelöst hast, würde ich vorschlagen in den 1-Wire Routinen die Interrups zu deaktivieren, da dass Timing bei 1-Wire von maßgebender Bedeuting ist. Ein Interrupt wärend einer LOW-Phase des Busses würde diese verlängern und zwar so erheblich, dass es nicht mehr richtig ausgewertet werden kann. Gerade bei großen Programmen werden meist auch mehr Interrupts verwendet und daher wahrscheinlich auch bei dir der Fehler. Ich würde also sagen, entweder Interrupts aus oder über nen separaten 1-Wire Master IC.
Hallo MasterFX. Hmmm, das klingt für mich logisch. Leider kann ich die Interrupts nicht ausschalten. Ein seperater 1-Wire-Master IC hört sich interressant an. Ich wusste nicht das es soetwas gibt. Hast du damit schon Erfahrungen gemacht oder kannst du mir da einen bestimmten IC empfehlen?? Ich werde bei gelegenheit mal "googlen" Vielen Dank für deine Antwort. Grüße, Marcel
Hallo! Da gibts auch noch nen Trick, uart zu verwenden (falls du noch eine frei hast). Habs selber nicht probiert, sollte aber funktionieren. Für Strong-Pull UP musst halt noch was eigenes programmieren. http://pdfserv.maxim-ic.com/en/an/AN214.pdf mfg Weichinger Klaus
Hallo Klaus, Danke für deinen Tip. Aber ich habe ein Display, das an der USART hängt und eine 2. USART hat der Mega 16 leider nicht :( Das Dokument ist aber trotzdem interessant. Danke für deinen Tip!!! Grüße Marcel
Ich glaube da gibts nur die IC's von Dallas. Das ganze läuft über I²C und sollte für dich daher das richtige sein http://www.maxim-ic.com/quick_view2.cfm/qv_pk/4382
Hi! @Marcel: Wieso kannst du in deinen 1-Wire Routinen deine Interrupts nicht deaktivieren? Ich meine nur für den kurzen Zeitraum wo die Routine benötigt wird. Danach kannst und sollst sie ja wieder deaktivieren. Wenn man Interrupts verwendet und nicht verhindert, dass sich die Interrupts gegenseitig ins Handwerk pfuschen kommt meist Mist raus....
@ MasterFX. Das ist ein interessanter IC. Das wäre natürlich eine gute Idee da ich sowieso einen I2C-Bus habe. Ich werde mir mal ein Muster zuschicken lassen. @ Christian. Wieso ich keinen Interrupt ausschalten kann?? Hmmm, das war eine schnelle Äußerung. Vielleicht geht es doch, ich müsste es wirklich ausprobieren. Ich habe ein Touchpanel das an der USART hängt. Wenn ich den "globalen Interrupt" abschalte dann könnte es eventuell Probleme mit der "Touchauswertung" geben. Außerdem habe ich eine DCF-Antenne am Mega16 hängen. Das Signal darf man auch nicht einfach "abklemmen". Ein Versuch wäre es Wert, wenn man direkt nach dem Antennen-Signal die "Temp-Auswertung" vom DS1820 machen würde. Nach dem DCF Signal habe ich etwa 0,7 Sekunden zeit bis ich das nächste Signal auswerten muss. Ich werde das mal ausprobieren!! Vielen Dank für eure Tipps. Mit bestem Gruß, Marcel (",)
Hi! Ich würde halt eine Prioritätenliste der Interrupts machen. Stell dir vor du tipst auf dem Touchpanel, gleichzeitig kommt ein DCF Signal und am 1-Wire tut sich auch was und jetzt springst du von einer Routine in die nächste ohne eine abzuschließen und womöglich verändert ein Interrupt auch noch Werte die in dem anderen gebraucht werden und schon ist das Chaos perfekt, nix geht mehr. Ich würde gefühlsmäßig die Touchpanel Routine auf niedrigste Prioritäe einstufen, schließlich kann der Anwender ein paar ms Verzögerung verkraften und willentlich Fehler korrigieren, die dadurch entstehen könnten. Die UART ist gepuffert und kann auch kurz warten. Wie das mit den DCF Signalen ausschaut musst du entscheiden, genauso wie die 1-Wire Geschichte. Also in jeder Interrupt -Routine die Interrupts deaktivieren und am Ende wieder aktivieren. Dabei aufpassen dass nur das wichtigste in den Routinen steht, damit die Verzögerung nicht allzugroß wird. Im GCC Tutorial steht wie man das mit den Interrupts recht gut lösen kann. ciao Fasti
Hallo Marcel, von dallas gibt es den ds2482 als busmaster, der über i²c an deinen mc angeschlossen werden kann. ich benutze den ds2482-100 und hab damit keine probleme. da ich verschiedene interrupts habe, die wichtiger sind als der onewire bus, stellt der ic eine einfache lösung da, sich das problem vom hals zu schafen. grüsse
@ Gert: Danke für den Hinweiß. Ich werde mich auf jenden Fall mal mit diesem IC beschäftigen. Das hört sich schon recht interressant an. Bin mal gespannt wie ich das hin bekomme. Danke!! @Fasti: Also ich programmiere schon ne weile, aber es war immer so das es ohne große Ansprüche funktioniert hat. Ich habe mir über die Reihenfolge (Priorität) der ISR's nie gedanken gemacht. Es ist mir allerdings schon logisch das es, gerade bei großen Programmen, wichtig ist so eine Prio-Liste zu erstellen. Ich habe mir das GCC Tutorial mal durchgelesen. Das ist doch recht viel Info. Weiß aber immer noch nicht so genau wie ich das machen soll. Ich werd mich mal da reinarbeiten. Das DCF-Signal ist für mich schon das wichtigste. Wird ein Wert von der USART trotzdem gepuffert, auch wenn der Interrupt ausgeschaltet ist?? Oh je, jetzt merke ich erst mal wie wenig ich von der Interrupt-Geschichte weiß g Auf jeden Fall mal danke für die Info. Hat mir schon sehr geholfen.... Grüße, Marcel
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.