Hast du an die PullUps an SDA und SCL gedacht? R1 und R2 bei der LCD-Erweiterung per I2C:
http://www.asurowiki.de/pmwiki/pmwik...LCDErweiterung
Ich habe mir die AD-Wandler erweiterung gekauft und nach folgender Seite angeschlossen und programmiert:
AsuroWiki - I2C Analog Porterweiterung
AGND habe ich am Kondensator an GND geschlossen
Nun habe ich erstmal einen Lichtsensor auf AIN1 angeschlossen und die anderen erstmal leer gelassen
Wenn ich jetzt versuche Irgendetwas auszulesen hört das Programm hier auf:
Ich vermute mal der PCF8591 sendet kein Acknowledge, aber ich weiß nicht warum =/PHP-Code:
read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
i2c_start(0x90); //<--wird nicht vollendet
...
}
Adresse stimmt
Schaltung sollte auch stimmen. (Es sei den im Datenblatt wir bei der Pinbelegung der Controller von unten gezeigt)
Ich hoffe ihr könnt mir irgendwie helfen
Hast du an die PullUps an SDA und SCL gedacht? R1 und R2 bei der LCD-Erweiterung per I2C:
http://www.asurowiki.de/pmwiki/pmwik...LCDErweiterung
Geändert von radbruch (09.04.2011 um 22:37 Uhr) Grund: Link zum LCD-Schaltplan eingefügt.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Sind die nicht auf der ASURO-Platine mit R14 - 15 vorhanden?
Ne, seh grad die sind beim LCD dran.
Vielen Dank, ich versuch das einmal.
Gibt es Probleme, wenn ich später die LCD-Erweiterung zusätzlich am Bus habe und dann 2 Pull-Ups sind je Leitung sind?
Wie du in dem Quellcode sehen kannst auf die Wiki seite, ist i2c_start ein Funktion der die Acknowledge bit zuruck geben soll.
Auf Basis der Zuruckgegeben wert kannst du zbs. ein LED leuchten lassen, den Wert uber UART senden, oder was sonnst damit Asuro dich mit teilt "etwas is schief!"....
//liest einen ADC Wert vom PCF8591
unsigned char read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
ret = i2c_start(pcf8591_address+I2C_WRITE); // Sende Start Condition
if (ret == 0)
ret = i2c_write(adc); // Senden des Control Bytes startet die A/D Wandlung
i2c_stop(); // Sende Stop Condition, Bus freigeben
...
R14 und R15 (je 20k) ziehen die Pins gegen GND. Beim I2C werden die Pins aber als OpenCollector betrieben, ein High wird durch einen hochohmigen Ausgang in Verbindung mit dem PullUp (der gegen 5V geschaltet wird) erzeugt. So kann bei Bedarf ein auf High stehender Pin durch ein Low vom Bus beeinflußt werden, ohne das der High-Pin durchbrennt.
Pro Bussystem benötigt man die PullUps jeweils nur einmal. Wenn du später die LCD-Erweiterung dazubaust, mußt du deren PullUps nicht einbauen.
Geändert von radbruch (09.04.2011 um 23:04 Uhr) Grund: Link zum Open Collector eingefügt
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Es passiert gar nichts.
Das Programm hört definitiv auf zu laufen.
Ich schau mal morgen ob ich noch 2 wiederstände habe und probier es damit mal aus
@ radbruch danke nochmal ich nehm die beim Display raus und benutze diese; klappt schon =D
Ich erkundige mich auch seit kurz in i2C. Den 2 Pull-ups pro Leitung stehen dann quasi im Parallel-schaltung. 2 sind dann immer starker als eins. Die Faust-regel der ich gefunden habe ist das die Pull-ups minimal (Vcc-0.4v)/3mamp sein sollte. Was schief geht wenn der beiden gesamt weniger Widerstand haben weiss ich nicht.
Bei meinen ersten Versuchen mit I2C (RP6, arm64 und zwei PCF8574) hatte ich erst Erfolg nachdem ich zu den serienmässigen 4k7-PullUps des RP6 (R32, R33) noch jeweils einen 1k dazugeschaltet hatte. Grenze sind wohl die 20mA pro Pin, also ca. 250 Ohm Gesamtwiderstand:
https://www.roboternetz.de/community...l=1#post488207
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Dieses Artikel hat mir viel Erklärt:
http://www.dsscircuits.com/articles/...resistors.html
hab jetzt nur einmal 4k7 und das klappt super
danke euch
Lesezeichen