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