Forum: Mikrocontroller und Digitale Elektronik 1-wire bei 4MHZ i.O. bei 16Mhz n.i.O.!?


von chris (Gast)


Lesenswert?

Hallo Forum,

hat von euch auch schon mal einer das Problem gehabt, daß ein 1-wire
Bus mit 4Mhz läuft und mit 16MHz nicht mehr?
Zur Situation.
Ich habe im Haus mehrere DS18b20 über verschiedene Leitungen d.h.
meheren Bussen (4Stk.)auf einen Atmega 32 gelegt. Also es wurden
mehrere Ports des Atmega verwendet, da ich ansonsten Probleme mit den
Leitungskapazitäten hatte. Habe als Leitungen LIYY 3x0,14 verwendet.
CAT-Kabel gingen wegen dem Kabelquerschnitt nicht. Die verschiedenen
Ports sind dann in der onewire Routine von Peter Danneger so verknüpft,
dass sie als ein Port gesehen werden.
Ich habe den Controller jetzt mehrere Monate mit 4MHz betrieben und
alles ging wunderbar. Da aber das Programm immer mehr wächst
wollte/will ich den Controller auf 16MHz laufen lassen.
Doch mit 16Mhz habe ich das Problem, das nur noch die Busse mit kurzer
Leitungslänge funktionieren. Die längeren mit mehr Kapazität gehen
nicht mehr.
Aber irgendwie verstehe ich nicht warum. Ich habe im Makefile
umgestellt und die kürzeren Busse laufen ja. Wie kann die höhere
Taktfrequenz auf die Busse noch Auswirkungen haben?

Hat dieses Problem schon jemand mal gehabt? Was könnte Abhilfe
schaffen?

Im voraus schon mal Danke für die Antworten

Gruß,
Christian

von Peter D. (peda)


Lesenswert?

Jedes Datenbit wird ja mit >=1µs Low eingeleitet, könnte sein, daß der
Impuls zu kurz ist (ein paar NOPs einfügen).

Bei langen Leitungen helfen auch 47..100 Ohm in Reihe mit dem MC-Pin
(Dämpfung der Überschwinger).


Wenn die Sensoren an separaten Pins sind, würde ich sie auch separat
ansprechen, dann braucht man das ROM-Search nicht mehr.

Dazu speichert man in einer Variable die Bitmaske, die dem Pin
entspricht.
Zum Setzen wird der Port mit der Bitmaske verORt zum Löschen mit der
Bitmaske verEXORt und zum Testen der Input-Port eingelesen und
verANDet.


Peter

von chris (Gast)


Lesenswert?

Hallo Peter,
ich habe schon mal probiert das delay von 1us auf 3us zu setzen. Aber
das brachte keine Wirkung.
Rom-Search benutze ich sowieso nicht. Ich habe alle Sensoren
(mitlerweile 15 Stk.) in ein Array aufgenommen, von dem aus spreche ich
denn den Sensor an, den ich gerade abfragen will. Es hat auch nicht
jeder Sonsor einen eigenen PIN, sondern es sind halt immer die lokal
nahe liegenden zusammengefasst.
Die Verknüpfungen der Ports funktionieren ja. Der Vorteil ist, ich habe
die unterschiedlichen Busse steckbar am Controller. Somit muß ich nicht
immer darauf auchten, dass ich den richten Sensor am richtigen Port
habe.
Ich hatte schon mal das Oszi am Bus hängen, jedoch schien mir da eher
das Problem zu sein, dass der Bus immer zulange Braucht bis er wieder
auf high kommt (Kondensator-Ladekurve). Bin mir allerdings nicht
sicher, ob da nicht auch noch das OSZI bei der Messung noch einiges an
Kapazität ins System brachte und somit kein Wirklich brauchbares
Ergebnis lieferte.

Das mit den Widerständen verstehe ich nicht ganz. Bekomme ich da dann
nicht noch mehr Probleme, da ich ja über den Port auch den Bus
möglichst schnell auf Low bringen muß und der R den Vorgang doch eher
bremst?

Die Veränderungen in der onewire.h sehen so aus:
#define OW_GET_IN()   ( *OW_IN & (1<<PC7) && *OW_IN & (1<<PC6) &&
*OW_IN & (1<<PC5) )   //OW_PIN_MASK
und
OW_PIN_MASK=(1<<PC7) | (1<<PC6) | (1<<PC5);

Gruß

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.