PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Input/Output I2C Bus Interface



Eidechse
11.12.2013, 14:37
Hallo zusammen!

Zur Zeit arbeite ich an einem Projekt, und zwar will ich ein Interface bauen um

RoboHolIC
11.12.2013, 20:15
Hi, Eidechse.

Erst mal willkommen im Forum!

Was mir zuallererst auffällt, sind die fehlenden Basiswiderstände und die untypische Schalttransistor-Beschaltung: Üblich -weil sehr sinnvoll- ist es, den Basisstrom direkt von der Basis über den Emitter nach "0V" fließen zu lassen, der Verbraucher hingegen gehört zwischen +5V und den Kollektor.

Funktional habe ich mir deinen Schaltplan nicht angesehen.
Wo sind denn Eingänge?
Warum bist du am verzweifeln? Die Bilder geben keine Anhaltspunkte dafür.

Gruß
RoboHolIC

Dirk
11.12.2013, 20:20
1. Wenn die LEDs mit Vorwiderständen in den Platinen gemeinsam gegen GND verschaltet sind, kannst du die Treibertransistoren so verschalten, wie du das gemacht hast. Allerdings kann man diese Treiber dann nicht direkt mit dem PCF8574 ansteuern, sondern man braucht noch für jeden Kanal einen weiteren Transistor in Emitterschaltung. Dazu gehören dann auch noch je 2 Widerstände (Basiswiderstand und Kollektorwiderstand). Alternativ nimmt man einen PNP-Typ als Treiber für die LEDs.
2. Wenn die LEDs auch anders zu beschalten sind (also gegen Plus), kriegt man das auch mit 1 Transistor hin.
3. Bei den Eingängen weiss ich nicht genau, was der NXT erwartet, daher kann ich dazu nichts sagen. Ich kann auch aus deinem Schaltplan nicht sicher erkennen, wo die Eingänge anliegen.

Wenn du weitere Hilfe brauchst, müßtest du auch beschreiben, WAS genau nicht funktioniert.

redround
11.12.2013, 21:01
die Pull-Up Widerstände für SDA und SCL sind meiner Meinung nach auch deutlich zu hoch. Üblicherweise verwende ich dafür 4k7 und keine 82k! Dann sollte man die auch nur einmal pro Bus verwenden - üblicherweise direkt am Master und nicht auf den Slave-Platinen. Dafür fehlen die Basis-Widerstände an den Transistoren. Darüber, dass die Last üblicherweise im Collector-Pfad hängt wurde ja schon erwähnt.

Eidechse
12.12.2013, 07:57
Hm okay, danke schon mal für die Antworten und Tipps.

redround
12.12.2013, 08:33
Um einen PCF8574 als Eingang zu benutzen musst Du zuerst schreibend alle Pins auf HIGH setzen. Die externe Beschaltung zieht die Pegel dann auf LOW indem sie die Pins auf Masse schaltet. Diesen Low-Pegel kannst Du dann beim Einlesen des Portexpanders erkennen.

Hier ein Beispiel, wie man das mit C z. B. für einen Arduiono machen kann: http://cboden.de/mikro-controller/digispark/20-mikrocontroller/45-pin-finder Dabei wird ein PCF8574 so angesteuert, dass seine Pins als Eingänge fungieren. Wenn Du die ganzen lcd Aufrufe weg lässt, bleibt nicht mehr viel Code für den PCF8574 übrig. Der Code sollte mehr oder weniger selbsterklärend sein. Bei Fragen dazu kann ich Dir aber gerne helfen. Anpassen auf Deine Programmierumgebung musst Du ihn aber selbst ;-)

- - - Aktualisiert - - -

hier mal der zusammengekürzte Programmcode, der nur noch die für den PCF8574 relevanten Teile beinhaltet:


// --------------------------------
// Benötigte Bibliotheken einbinden
// --------------------------------
#include <TinyWireM.h> // I2C

// ---------------------
// Konstanten definieren
// ---------------------
#define PORT_ADDR 0x20 // I2C-Adresse für Port-Expander

// -------------------------
// globale Variablen anlegen
// -------------------------
boolean data_received = false; // Flag zum erkennen, ob Daten gelesen werden konnten

// --------------------------------------------------------
// Setup-Routine (wird automatisch beim Starten ausgeführt)
// --------------------------------------------------------
void setup(){
// I2C Schnittstelle initialisieren
TinyWireM.begin();

// Port-Expander initialisieren
writePort(PORT_ADDR, 0xff);
}

// ------------------------------------------------------------
// Haupt-Routine (wird kontinuierlich als Schleife durchlaufen)
// ------------------------------------------------------------
void loop(){
byte data;

// Eingänge lesen
data=readPort(PORT_ADDR);

// prüfen, ob valide Ergebnisse geliefert wurden
if (data_received){

// Ab hier stehen die Stati des Portexpanders in der Variable
// data zur Verfügung
}
}

// --------------------------------------------
// Routinen zur Kommunikation mit dem Expander
// --------------------------------------------
byte readPort(int address) {
byte data=0xff;
TinyWireM.requestFrom(address,1);
if(TinyWireM.available()){
data=TinyWireM.receive();
data_received=true;
}
else {
data_received=false;
}

return data;
}

void writePort(int address, byte data) {
TinyWireM.beginTransmission(address);
TinyWireM.send(data);
TinyWireM.endTransmission();
delay(5);
}

Eidechse
12.12.2013, 08:39
Danke redround,
aber ich werde nichts programmieren, das Signal was kommt soll vom Lego NXT kommen.

redround
12.12.2013, 08:49
dann wie gesagt einfach die Pins, die als Eingang genutzt werden sollen z. B. mit einem Taster gegen Masse schalten ... fertig :-)

Eidechse
12.12.2013, 08:53
Ich will dazwischen noch ein

redround
12.12.2013, 09:13
Der ULN2003 ist ein Darlington-Treiber ... was willst Du damit erreichen? Und was verstehst Du unter einem Puffer?

Eidechse
12.12.2013, 09:27
Ich will das die LEDs geschützt sind.

redround
12.12.2013, 10:28
Du würfelst da einiges durcheinander. Entweder der PIN soll als Eingang genutzt werden. Dann einfach
PCF Pin X --> Schalter gegen Masse

Oder der Pin soll als Ausgang genutzt werden. Dann im einfachsten Fall
PCF Pin X --> Widerstand --> LED --> Masse

Wenn der Strom, den die LED aufnimmt größer ist, als der Strom den der PCF zur Verfügung stellen kann, dann braucht man einen Treiber. Das kann ein ULN sein oder einfach ein Transistor. Wenn Du einen ULN verwendest brauchst Du zusätzlich auch noch einen Inverter, da er bei LOW des PCF-Pin leitet und bei HIGH sperrt.

Pin + LED + Treiber + Schalter gegen Masse macht jedoch keinen Sinn

und wovor willst Du die LED schützen? Wichtig ist nur, dass der Vorwiderstand zur LED passt ... mehr Schutz ist nicht erforderlich und macht auch keinen Sinn.

Eidechse
12.12.2013, 11:45
Also zum Ausgang:

Eidechse
12.12.2013, 14:46
Hier nochmal besser erkennbar:

Eidechse
17.12.2013, 20:00
Noch wer da?

RoboHolIC
18.12.2013, 00:07
Noch wer da?
Naja, wie soll ich sagen - auf mich wirkt das schaltungstechnisch etwas überfordert.

Bei den Ausgängen:
Transistoren T9 .. T16, offenbar als potentialfreie Schaltausgänge geplant (analog zu Relais): das geht so nicht. Die Schalttransistoren müssten dann extern an ein Potential der Leistungsversorgung angebunden werden. Da wären dann NPN-Transistoren mit Emitter an GND besser, dann wäre die zu schaltende Spannung in ziemlich weitem Bereich variierbar. (Allerdings sollten dann auch die Diagnose-LEDs elektrisch anders drangeschaltet werden.
LED9 würde ich nicht direkt vom INT/-Ausgang treiben zu lassen. Die Abkopplung vom Bus ist für sich betrachtet schon richtig, damit nicht andere Busteilnehmer diese LED zum Leuchten bringen können.
Die Adressierung des PCF würde ich mit Pullups und Jumper gegen GND realisieren, dann sind keine undefinierten Pegel möglich.

Bei den Eingängen:
Warum die Pullups an IC2, wenn da zugleich die LEDs von (+) geschaltet werden? Die schaden nicht, sind aber überflüssig.
Was soll das mit den 1:1-Eingangsteilern (47k-47k) an IC2? Das ist zumindest eine untypische Beschaltung. Da sollen doch 5V-Logikpegel dran, oder? Dann besser keinen Eingangsteiler, zumal die Längswiderstände jeweils die Basisströme der ULN-Treiber unnötig reduzieren; die Vorwiderstände sind beim ULN2803 bereits passend für 5V-Logik integriert.

Zur Adressierung:
A0 ist die niederwertigste Adressleitung; die Zustände an A2, A1 und A0 sind in der Software als Dualzahl zu interpretieren.

Zum INT/:
T1 und T2 bilden eine scheinbar nutzlose doppelte Negierung. Stammt dieser Schaltungsteil aus LEGO-Quellen? Dann wäre der Grund für diesen Extraaufwand interessant zu wissen.

Die 82k-Pullups am I2C-Bus sind weiterhin hinterfragungswürdig.

Eidechse
19.12.2013, 21:12
Dankeschön.

RoboHolIC
19.12.2013, 22:56
Also.. welche der hier aufgelisteten Pins (http://de.wikipedia.org/wiki/Lego_Mindstorms_NXT) wird am INT/ des PCF angeschlossen?
Allem Anschein nach keiner.

Der INT/ des PCF informiert über einen Pegelwechsel an irgend einem der als Inputs arbeitenden I/O-Kanäle. Dieser Pin kann als externer Interruptauslöser am Controller verwendet werden oder aber unbeschaltet bleiben.
In dem von dir verlinkten Wikipedia-Artikel kann ich -genau wie du- keinen Interrupteingang beim NXT-Steckanschluss finden.