PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pcf8591



red13
09.04.2011, 21:19
Ich habe mir die AD-Wandler erweiterung gekauft und nach folgender Seite angeschlossen und programmiert:
AsuroWiki - I2C Analog Porterweiterung (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/I2CAnalogPorterweiterung)
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:

read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
i2c_start(0x90); //<--wird nicht vollendet
...
}


Ich vermute mal der PCF8591 sendet kein Acknowledge, aber ich weiß nicht warum =/
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

radbruch
09.04.2011, 21:29
Hast du an die PullUps an SDA und SCL gedacht? R1 und R2 bei der LCD-Erweiterung per I2C:

http://www.asurowiki.de/pmwiki/pmwiki.php/Main/LCDErweiterung

red13
09.04.2011, 21:46
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?

Valen
09.04.2011, 21:53
Wie du in dem Quellcode sehen kannst auf die Wiki seite, ist i2c_start ein Funktion der die Acknowledge bit zuruck geben soll.


...
//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
...

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!".

radbruch
09.04.2011, 21:57
R14 und R15 (je 20k) ziehen die Pins gegen GND. Beim I2C werden die Pins aber als OpenCollector (http://de.wikipedia.org/wiki/Open-Collector-Ausgang) 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.

red13
09.04.2011, 21:58
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

Valen
09.04.2011, 22:02
..
Gibt es Probleme, wenn ich später die LCD-Erweiterung zusätzlich am Bus habe und dann 2 Pull-Ups sind je Leitung sind?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.

radbruch
09.04.2011, 22:27
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/showthread.php?37232-LCD-an-RP6-Base&p=488207&viewfull=1#post488207

Valen
09.04.2011, 22:32
Dieses Artikel hat mir viel Erklärt:

http://www.dsscircuits.com/articles/effects-of-varying-i2c-pull-up-resistors.html

red13
10.04.2011, 19:19
hab jetzt nur einmal 4k7 und das klappt super
danke euch