Forum: Mikrocontroller und Digitale Elektronik 1 Wire Bus


von Marcel (Gast)


Lesenswert?

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, ISR’s 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

von MasterFX (Gast)


Lesenswert?

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.

von Marcel (Gast)


Lesenswert?

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

von Weinga-Unity (Gast)


Lesenswert?

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

von Marcel (Gast)


Lesenswert?

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

von MasterFX (Gast)


Lesenswert?

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

von Christian F. (fasti)


Lesenswert?

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....

von Marcel (Gast)


Lesenswert?

@ 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 (",)

von Christian F. (fasti)


Lesenswert?

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

von Gerd (Gast)


Lesenswert?

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

von Marcel (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.