Irgendwo habe ich vor einiger Zeit aufgeschnappt, dass man statt zweier externer Pull-Up-Widerstände auch interne Pull-Up-Widerstände aktivieren kann. Man spart dadurch zwei Bauteile und Platz auf der Platine ein. Zudem kann man so komfortabel per Software steuern, ob Pull-Up-Widerstände da sind oder nicht.
Ich kann jetzt aber nicht finden, wo ich das gelesen habe. Die Beispiele bei der Wire-Bibliothek helfen überhaupt nicht (bei 3 der 4 Beispiele werden Pull-Up-Widerstände nicht einmal erwähnt).
Kann mir jemand sagen, wie ich diese Pull-Up-Widerstände per Software de-/aktivieren kann?
gregorss:
Kann mir jemand sagen, wie ich diese Pull-Up-Widerstände per Software de-/aktivieren kann?
Welche Hardware? AVR? Ich bin mir nicht sicher ob die interne haben, müsste ins Datenblatt schauen.
HotSystems:
Bei I2C kannst du die internen Pullups nicht aktivieren.
Das kann man nicht ohne Angabe des zu verwendenden Devices wissen, ausserdem hängt dies sicher nicht von der Verwendung von I2C, sondern von der Pin-Konfiguration ab.
Aresloom:
Das kann man nicht ohne Angabe des zu verwendenden Devices wissen, ausserdem hängt dies sicher nicht von der Verwendung von I2C, sondern von der Pin-Konfiguration ab.
Der TO hat ja bisher immer noch nicht verraten um welches Device es sich handelt.
Meinst du das hier?
".....aber da die Pins im Setup nicht definiert werden, gibt es keine Möglichkeit."
Doch natürlich, änder eifach das zugehörige PORTx-Register?!? Habe schon seit nem Weilchen nicht mehr mit Atmel-Devices gearbeitet, aber das Geile bei Arduino is doch, dass die ganzen Headerfiles eingebunden sind.
Ok, das macht das Ganze natürlich wieder Interessant.
Wobei dann der Widerstandswert außerhalb der I2C-Spezifikation liegt.
Was aber nicht heißt, dass es dennoch funktioniert.
HotSystems:
Ok, das macht das Ganze natürlich wieder Interessant.
Wobei dann der Widerstandswert außerhalb der I2C-Spezifikation liegt.
Was aber nicht heißt, dass es dennoch funktioniert.
Spezifikationen sind Richtlinien, keine Garantie für das Funktionieren eines Systems. Bei geringeren Frequenzen kannst du grössere Widerstände benutzen als bei höheren.
Wieso? Die Kabel bilden einen Kondensator. Kondensator glätten die Flanken der Clockleitung und zerstören so das Signal.
Kleinerer Widerstand --> Schnellere Entladung des Kondensators (Der Kabel)
Was ist die Standardfrequenz von Arduino 100kHz? Da das spielt das alles keine Rolle, das kannste locker nen 40k, oder was auch immer in nem AVR verbaut ist, nehmen. Kabel kurz halten dann passt das.
Danke! Das habe ich inzwischen quergelesen – von Pull-Up-Widerständen an den analogen Ports 4 und 5 habe ich aber nichts gesehen. Bei nächster Gelegenheit lese ich das mal konzentriert durch.
Aresloom:
Nicht einfach Threads schliessen weil Sie im ersten Augenblick abgeschlossen erscheinen-.-
gregorss:
Es geht um einen stinknormalen ATmega328 auf einem Arduino Nano.
Ok, die Info hilft ;D
[/quote]
gregorss:
Danke! Das habe ich inzwischen quergelesen – von Pull-Up-Widerständen an den analogen Ports 4 und 5 habe ich aber nichts gesehen. Bei nächster Gelegenheit lese ich das mal konzentriert durch.
Soweit ich weiß schaltet die WIRE-Bibliothek automatisch die Pullupwiderstände an den beiden Pins an. Das diese aber zwischen 20 und 50kOhm liegen, kann man keine langen I2C Busse haben.
Ich verwende erfolgreich einen I2C Bus zwischen einem Arduino NANO und einem RTC DS1307 auf einer Länge von 5 cm ohne externe Widerstände.
Für mehrere Devices oder längere Leitungen am I2C Bus brauchst Du externe Pullupwiderstände.
uwefed:
Soweit ich weiß schaltet die WIRE-Bibliothek automatisch die Pullupwiderstände an den beiden Pins an. Das diese aber zwischen 20 und 50kOhm liegen, kann man keine langen I2C Busse haben.
Ich verwende erfolgreich einen I2C Bus zwischen einem Arduino NANO und einem RTC DS1307 auf einer Länge von 5 cm ohne externe Widerstände.
Für mehrere Devices oder längere Leitungen am I2C Bus brauchst Du externe Pullupwiderstände.
Ich habe in einem Projekt (als ich vor einem halben Jahr die ersten Gehversuche mit Arduino (Nano) machte), die beiden Pullup-Widerstände aus Unwissenheit nicht an den I2C-Bus von Nano angeschlossen.
I2C steuerte ein LCD-Display mit 20cm langem Buskabel dank Wire.h ohne Probleme an. Baue inzwischen aber immer 4k7..10k ein.
@uwefed: Hier wird bestätigt, dass Wire.h interne pullups schaltet.
Aus der twi.h aus dem Arduino core bzw. src aus der 1.6.9:
void twi_init(void)
{
// initialize state
twi_state = TWI_READY;
twi_sendStop = true; // default value
twi_inRepStart = false;
// activate internal pullups for twi.
digitalWrite(SDA, 1);
digitalWrite(SCL, 1);
// initialize twi prescaler and bit rate
cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
/* twi bit rate formula from atmega128 manual pg 204
SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
note: TWBR should be 10 or higher for master mode
It is 72 for a 16mhz Wiring board with 100kHz TWI */
// enable twi module, acks, and twi interrupt
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
}
Die twi_init wird doch die Wire-Lib von der Arduino IDE aufgerufen und dort werden definitiv die internen Pull-Ups genutzt. Diese Reichen in den meisten Fällen aus wenn es nur um einen bis max " Slaves in der nähe des Atmegas sind. Also eine Nachbar RTC und EEPROM sind meist kein Problem.
Das Problem der "internen" Pullups liegt eher dabei das sie nur einen Wert zwischen 20-50k heben aber bei I2C man eher zwischen 1-4.7k nutzt.
Wenn man I2C auf den kleine Attinys 85/84 nutzt macht man das mit der USI-Interface bei dem man keine internen Pull-Up in der Verbindung nutzten kann, funktioniert die Kommunikation nur mit externen Pull Ups ohne keine Kommunikation. (selbst getestet)
Gregorss kann ja mal mit dem Multimeter messen wie viel Ohm er auf den Pull-Up hat.
Meiner Meinung nach sollten die Pull-Ups für 100kHz genügen. Erst gerade 1MHz SPI über n altes Breadboard via 25cm Kabelgewirr gejagt. Solche IC's sind erstaunlich tolerant.
Wenn man aus der Bastelphase rauskommt und das ganze realisieren will, sind die 10 Cent für n paar Widerstände ja dann auch nicht die Welt.
Viel wichtiger als sich wegen ein paar Ohm bei den Pull-Ups nervös zu machen, ist eine zuverlässige Speisung/Netzteil. Netzbrummen a la 50Hz lässt grüssen...
Aresloom:
Meiner Meinung nach sollten die Pull-Ups für 100kHz genügen. Erst gerade 1MHz SPI über n altes Breadboard via 25cm Kabelgewirr gejagt. Solche IC's sind erstaunlich tolerant.
Du kannst SPI nicht mit I2C vergleichen.
SPI hat Ausgänge, die mittels Transistoren auf +5V und auf Masse geschaltet werden. Darum wird die Leitung durch ziemlich viel Strom auf eines der beiden Level gedrücket.
I2C hat nur einne Transistor der die Leitung auf Masse schaltet. Der Pullupwiderstand muß bei ausgeschaltenen Transistoren die Leitungskapazität laden und dazu noch den Eingangsstrom aller Devices aufbringen. Das macht ein 20kOhm Widerstand ziemlich langsam bezogen auf die 100k bzw 400kHz Takt bzw Daten.
gregorss:
PS: Ab sofort überlege ich es mir zweimal, ob ich einen Thread als erledigt kennzeichne
Du müßtest uns doch langsam gut genug kennen, daß wir immer das letzte Wort haben. Und wenn wir es nicht haben, erfinden wir was dazu