I2C hat PullUps?
sast
I2C hat PullUps?
sast
雅思特史特芬
开发及研究
So ist es.Das bedeutet sicher, falls der Watchdog zuschlägt, beginnt das Programm wieder bei 0, also mit den voreingestellten Variablen aus dem Setup?
Allerdings sollte im Programm die Peripherie dann Resettet werden.
Über ein Register ( MCUSR ) kann man feststellen, durch was der Reset ausgelöst wurde und dementsprechend die Initialisierungen anpassen.
Die Pullups für I²C gehören natürlich auch mit rein.
Wenn mit den Pullups externe Widerstände an A4 und A5 (SDA & SCL) des Arduino gemeint sind, dann gibt es die bisher bei mir nicht! Die Schaltung im ersten Post zeigt die aktuelle Situation.
Ich lese, daß bei 5V Vcc 4,7k als Pullup OK sind. Ich habe ja aber nur die 3,3V Version. Dann sollte wohl 3,3kOhm besser sein, oder?
Gruß Uwe
Wie fast immer hilft ein passendes Datenblatt. Beispielsweise dies hier, auf Seite 42. Anmerkung: ich habe bei 1,5 m (ein + einhalb Meter) Leitungslänge zu vier Slaves sogar 1,1 kΩ. Ausserdem hilft auch ein Oszilloskop und die kritische Betrachtung der Peaks - oder Nicht-Peaks *gg* bei der jeweils eingestellten Übertragungsrate (kann man die I²C-Frequenz bei arduion denn überhaupt festlegen?)... externe Widerstände an A4 und A5 (SDA & SCL) .. gibt es die bisher bei mir nicht .. bei 5V Vcc 4,7k .. die 3,3V Version .. 3,3kOhm besser sein, oder ..
Geändert von oberallgeier (14.02.2018 um 18:04 Uhr) Grund: Oh weh, Volt mit Kiloohm verwechselt :-/
Ciao sagt der JoeamBerg
Die Arduinos funktionieren im Allgemeinen perfekt mit Pullups zwischen 1,4k bis 10kOhm.
Der ArduinoMega (5V) hat z.B. 10k Pullups fest eingebaut, der Arduino Due (3.3V) 1,47 k; beide funktionieren für I2C clock von 100kHz bis 1MHz
Zum Vergleich:
Der Raspberry Pi (3.3V) hat fest eingebaute Pullups von 1.8k, ebenfalls für I2C clock von 100kHz bis 1MHz (ggf. sogar noch schneller, nicht getestet)
2.2k bis 4.7k sind also sicher immer ein guter Mittelwert.
Danke für eure Antworten soweit.
Ich habe jetzt nacheinander zwei Dinge getan:
zuerst habe ich den Watchdog aktiviert (hoffentlich richtig?):
- #include <avr/wdt.h> (ganz oben im Code)
- wdt_enable(WDTO_1S); (im Setup)
- wdt_reset(); (als letztes in der Hauptschleife)
Trotzdem ist der Fehler wieder aufgetreten, ohne das der Watchdog reagiert hätte. Es hat also keinen Reset vom Watchdog gegeben. Das Ding friert einfach ein und gut ist.
Danach hab ich 1,8k Pullups am I2C eingelötet. Leider hat auch das den Fehler nicht beseitigt! Auch danach ist er schon wieder 1x hängen geblieben!
Ich bin also wieder am Anfang!
Wat nu???
Dann würd ich mal sagen, blockiert einer der Chips den I²C bus.
Oder ein Chip selber hängt sich auf.
Da war mal hier ein Threat drin, bei dem das gleiche passiert ist.
Schau mal im aufgehangenen Zustand, welche Pegel am I²C Bus anliegen.
Die Lösung war, wenn ich richtig bin, 8 bzw. 9 Clock Impulse auf SCL zu legen, aber lies Sicherheitshalber noch mal nach.
Lesezeichen