PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehere Ausgangspins



Snow Wolf
13.03.2011, 00:13
Ich bin mir nicht sicher ob das der richtige Bereich für meine Frage ist aber ich versuch es mal.

Ich möchte meinen µC mit mehr Ausgangspins ausstatten weiß aber nicht genau wie :confused:, deshalb hab ich mich im Internet zu dem Thema schlau gemacht und bin dann auf Schieberegister gestoßen, das Problem ist dass ich über keine Erfahrung mit Schieberegistern und der gleichen habe. Meine Frage ist also wie/ welches Schieberegister ich an meinen µC anschließen soll. Falls das eine Hilfe ist ich brauch das ganze für meine RP6 M32 Erweiterungsplatine.

MfG Snow Wolf

PICture
13.03.2011, 00:40
Hallo Snow Wolf!

Ich werde gerne versuchen dir zu helfen. :)

In allgemeinem gibt es zwei Arten von Schieberegister (SR), wie im Code:

1. Mit seriellen Eigang (Daten werden bitweise "eigeschoben") und parallellem Ausgang ("eigeschobene" Bits sind paralell z.B. als Byte am Augängen verfügbar). Solche SR werden als Erweiterung von Ausgangspins von einem µC benutzt und benötigen zwei davon (DATAIN und CLOCK).

2. Mit paralellen Eingang (Daten werden paralell z.B. byteweise geladen) und seriellem Ausgang (geladenes Byte wird bitweise "ausgeschoben"). Solche SR werden als Erweiterung von Eigangspins von einem µC benutzt und benötigen drei davon (LOAD, DATAOUT und CLOCK).

Beide verlangsamen die Geschwindigkeit des Datentransfers, z.B. für 8-bittige SR 8-fach.

Wenn dich noch etwas daruber interressiert, dann bitte fragen. :)





D D D D D D D D
7 6 5 4 3 2 1 0

A A A A A A A A
| | | | | | | |
.---------------.
vom µC DATAIN ->| |
vom µC CLOCK ->| |
'---------------'
1.



2.
.---------------.
zum µC DATAOUT <-| |
vom µC CLOCK ->| |
vom µC LOAD ->| |
'---------------'
A A A A A A A A
| | | | | | | |

D D D D D D D D
7 6 5 4 3 2 1 0



(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

BMS
13.03.2011, 09:57
Hallo,
es gibt auch Portexpander, die man über den I²C-Bus ansteuern kann, wie z.B. den PCF8574. Damit kannst du 8 zusätzliche Ein-/Ausgänge erhalten. Es lassen sich auch mehrere ICs von der Sorte betreiben, wenn du ihnen unterschiedliche I²C-Adressen zuordnest.
Grüße, Bernhard

Snow Wolf
13.03.2011, 12:12
Es sind beide Möglichkeiten sehr interessant nur das Problem ist das ich keinerlei Erfahrungen mit den Systemen habe, und mir deshalb etwas schwer tue mir etwas darunter vorzustellen.

MfG Snow Wolf

021aet04
13.03.2011, 12:53
Damit du verstehst wie das funktioniert musst du dich in den jeweiligen Bus einlesen. Wie schon geschrieben wurde gibt es mehrere Möglichkeiten eine Erweiterung zu verwenden.
Wenn du dich für die Schieberegister interresierst musst du dich in den SPI (Seriell Peripheral Interface) Bus einlesen. Der Nachteil bei diesem Bus ist, wie schon Picture geschrieben hat, das du für den Eingabe und Ausgabe jeweils eigene ICs brauchst.

Wenn du dich für I2C interresierst gibt es dafür Portexpander, wie den PCF8574, den du für die Eingabe und Ausgabe nutzen kannst. Wie du ihn ansteuerst steht im Datenblatt (z.B. http://www.nxp.com/documents/data_sheet/PCF8574.pdf ).
Ein weiterer Vorteil vom PCF8574 ist, dass du einen Interruptausgang hast. Wenn sich am Port etwas ändert (wenn als Eingang genutzt) wird ein Interruptsignal erzeugt. Das hat den Vorteil, dass der PCF nur dann ausgelesen werden muss, wenn sich etwas ändert. Das erspart dem µC Rechenzeit.

Für welchen Bus du dich entscheidest ist Geschmackssache. Du solltest dir auch überlegen, was du noch brauchen wirst. Am SPI Bus kannst du z.B. auch Funkübertragungssysteme nutzen, aber auch SD Karten auslesen/beschreiben.
Für den I2C Bus gibt es auch sehr viele sinnvolle Erweiterung wie z.B. Echtzeituhr (RTC), Analog Ein- bzw Ausgabe,....

MfG Hannes

Searcher
13.03.2011, 13:00
Es sind beide Möglichkeiten sehr interessant nur das Problem ist das ich keinerlei Erfahrungen mit den Systemen habe, und mir deshalb etwas schwer tue mir etwas darunter vorzustellen.

Und jetzt ?

An dem Punkt hab ich folgendes gelesen:
1. http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht
2. http://www.rn-wissen.de/index.php/Portexpander_am_AVR

Dazu immer versucht die zugehörigen Datenblätter zu verstehen und dann experimentiert.

Herausgekommen ist bisher das:
https://www.roboternetz.de/community/showthread.php?51654-4x7-Seg.-mit-3-Ader-SW-SPI-Einstieg-mit-BASCOM-u.-ATtiny45

Danach sollten für Dich Modifikationen an der M32 Platine nicht mehr so unüberwindlich erscheinen. Konkrete Fragen werden bestimmt im Forum beantwortet.

Gruß
Searcher

Snow Wolf
13.03.2011, 14:29
Dann werde ich es einmal mit dem Port-Expander PCF8574 versuchen nur dann stellt sich die Frage wie ich den Port-Expander PCF8574 an den I²C Bus anschließe.


MfG Snwo Wolf

021aet04
13.03.2011, 14:38
Das steht im Datenblatt. Du brauchst VCC (positive Versorgungsspannung), GND (0V), SCL (Taktleitung für den Bus) und SDA (Datenleitung für den Bus). Beim Bus darfst du den Pullup Widerstand nicht vergessen.

MfG Hannes

Snow Wolf
13.03.2011, 22:17
Dann werde ich mir mal ein paar von den IC's kaufen und herumprobieren. Aber es stellen sich noch einige Fragen wie kann ich die Adresse des IC's ändern, und wie kann ich die Ausgänge über I²C schalten.

MfG Snow Wolf

b_spitzer
13.03.2011, 23:32
Steht alles im Datenblatt...
http://www.nxp.com/documents/data_sheet/PCF8574.pdf
Von den 7 Adressbits des I2C-Bus sind beim PCF8574 4 festgelegt, die anderen 3 kann man über die Leitungen A0-A2 einstellen. Damit sind 8 Bausteine an einem Bussegment möglich. (der PCF8574A hat einen anderen festen Adressteil, so dass damit nochmal 8 Bausteine möglich sind - siehe Fig.10, Seite 9 im Datenblatt)
Wenn man aber so viele IOs braucht, nimmt man besser gleich 16-Bit oder gar 32-Bit Portexpander.
Der 8574 hat Quasi-Bidirektionale Ein/Ausgänge. So wie beim alten 8051 ist ein Pin dann als Eingang verwendbar, wenn eine 1 im Output-Register steht. Wenn man eine 0 Schreibt, dann ist der Pin außen auf 0 gezogen. Jede "harte" Verbindung zu VCC muss dann vermieden werden. Also als reinen Ausgang einfach die gewünschten Bits setzten und löschen. Der Baustein kann bei einer 1 am Ausgang aber kaum Strom treiben. LEDs und Taster daher besser Low-Aktiv betreiben.
Bei den moderneren Bausteinen (8-Bit PCA9554, 16-Bit PCA9555) müssen die Ausgänge zunächst über das Port-Configuration-Register auf Ausgang geschaltet werden. Ein Schreibvorgang auf einen Eingangspin bleibt hier Wirkungslos.
Siehe 6.2 in http://www.nxp.com/documents/data_sheet/PCA9555.pdf

tschuessle
Bernhard

Snow Wolf
14.03.2011, 23:12
So dann werde ich mir mal den PCA9555 kaufen und probieren. Nur die Frage bleibt wie ich die Ausgänge über I²C Bus ansteuere (meine über M32).

MfG Snow Wolf

Richard
15.03.2011, 14:45
So dann werde ich mir mal den PCA9555 kaufen und probieren. Nur die Frage bleibt wie ich die Ausgänge über I²C Bus ansteuere (meine über M32).

MfG Snow Wolf

In dem man ein 01010101 Byte in das Ausgangs Register schreibt?

Gruß Richard

Snow Wolf
15.03.2011, 18:15
Das beantwortet meine Frage nur zum Teil, ich habe gemeint wie ich meiner M32 Erweiterungsplatine klar mache das am I2C Bus Ausgänge sind.


MfG Snow Wolf

Richard
15.03.2011, 19:48
Das beantwortet meine Frage nur zum Teil, ich habe gemeint wie ich meiner M32 Erweiterungsplatine klar mache das am I2C Bus Ausgänge sind.


MfG Snow Wolf

Da muss ich leider passen, ich habe keinen RP6 und C ist für mich auch nicht (mein Fall).

Gruß Richard

Snow Wolf
15.03.2011, 22:17
Naja dann werde ich mal schauen ob ich das irgendwie hin bekomme.

MfG Snow Wolf

Snow Wolf
23.04.2011, 17:37
So ich hab mir jetzt 2 PCA9555 gekauft und auf einer Platine verbaut. Jetzt hab ich das Problem das ich nicht genau weiß wie ich in meinem Programm festlege wo welcher Ausgang liegt bzw. welcher Widerstand an den Adressleitungen welche Adresse macht.

MfG Snow Wolf

Richard
23.04.2011, 18:30
So ich hab mir jetzt 2 PCA9555 gekauft und auf einer Platine verbaut. Jetzt hab ich das Problem das ich nicht genau weiß wie ich in meinem Programm festlege wo welcher Ausgang liegt bzw. welcher Widerstand an den Adressleitungen welche Adresse macht.

MfG Snow Wolf


Bei Google gleich der erste Treffer.. http://www.nxp.com/documents/data_sheet/PCA9555.pdf dort sollt alles zu finden sein.

Gruß Richard

Snow Wolf
23.04.2011, 19:24
Aus dem Datenblatt habe ich folgendes herausgefunden:
und zwar wenn man die 3 Eingänge für die Adresse auf Masse legt ist die Adresse 0100 000b und so weiter.
Wenn ich einen Ausgang will muss ich im Register C0.0 (bis C0.7) und C1.0 (bis C1.7) eine 0 stehen.
Die Ausgänge kann man im Register O0.0 (bis O0.7) und O1.0 (bis O1.7) setzten.
Jetzt stellt sich nur die Frage wie das ganze in C aussieht.

MfG Snow Wolf

Ps: Danke für das Datenblatt

Richard
23.04.2011, 19:36
Aus dem Datenblatt habe ich folgendes herausgefunden:
und zwar wenn man die 3 Eingänge für die Adresse auf Masse legt ist die Adresse 0100 000b und so weiter.
Wenn ich einen Ausgang will muss ich im Register C0.0 (bis C0.7) und C1.0 (bis C1.7) eine 0 stehen.
Die Ausgänge kann man im Register O0.0 (bis O0.7) und O1.0 (bis O1.7) setzten.
Jetzt stellt sich nur die Frage wie das ganze in C aussieht.

MfG Snow Wolf

Ps: Danke für das Datenblatt

Mit C stehe (ich) leider auf Kriegsfuß. :-( Aber ich vermute das unter rn Wissen beispiele zu finden sind?

Gruß Richard

Snow Wolf
23.04.2011, 19:53
Naja kann man nix machen aber jetzt weiß ich schon mehr als vorher das is auch was ich werd mich mal umschaun vl find ich was

MfG Snow Wolf

b_spitzer
23.04.2011, 20:14
Hallo Wolf,

ich habe am PCA9555 ein LCD im 8-Bit Modus und ein Tastenkreuz mit 5 Tastern hängen. Bei mir schaut der relevante Teil so aus:

// PCA9555D: Adresse 0100 000x
// Schreib-Adresse 0x40, Lese-Adresse 0x41
#define PCA9555_wr 0x40
#define PCA9555_rd 0x41

// Konfiguration: Port 1 Bits 3-7 auf Input 0-2 Output
// Port 0 auf Output
// Port 0 Register (Command 0x06) auf 0x00
// Port 1 Register (Command 0x07) auf 0xF8
void init_pca9555(void)
{
i2c_init (); // I2C-Bus initialisieren (Grundzustand)
i2c_start (); // Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_wr); // Adresse PCA9555
i2c_schreiben (0x06); // Control-Byte 6
i2c_schreiben (0x00); // Direction für Port 0
i2c_schreiben (0xF8 ); // Direction für Port 1
i2c_stop (); // Stoppbedingung I2C-Bus ausgeben
}
// pca9555_read_port1(void)
// Liest 8 Datenbit von Port 1
// P1.3-1.7 => Tastenkreuz
unsigned char pca9555_read_port1(void)
{
unsigned char wert;
i2c_init (); // I2C-Bus initialisieren (Grundzustand)
i2c_start (); // Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_wr); // Baustein Adresse Schreiben
i2c_schreiben (0x01); // Controll-Byte lese Port 1
i2c_start (); // repeated Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_rd); // Baustein Adresse lesen
wert = i2c_lesen (0);
i2c_stop (); // Stoppbedingung I2C-Bus ausgeben
return (wert);
}

Beim Schreiben und Lesen auf nachfolgende Register muss nur 1x die Startadresse angegeben werden. Danach inkrementiert der Baustein die Registeradresse automatisch.

gruß
Bernhard

Snow Wolf
23.04.2011, 21:47
Das hilft mir sehr weiter nur die Frage ist welche lib.h du einschließt. Ansonsten war da sehr hilfreich. Auch wenn ich mich einmal nur auf die Ausgänge konzentrieren will

MfG Snow Wolf

b_spitzer
23.04.2011, 22:16
Hallo,
ich Programmiere mit einem AT89C5131, also 8051-Familie. Auf dem RP6 ist ja ein ATMega128, aber dort gibt es doch auch eine I2C-Lib. Einfach die hier geposteten Funktionen anschauen und den groben Verlauf nachbauen, dann müsste es passen.
Ich habe mal in der Anleitung zum RP6 geschaut (S.107ff). Du musst den dann im Master-Mode initialisieren. Danach wird aus meiner init_PCA9555 zum Beispiel ein Aufruf der Funktion void I2CTWI_transmit3Bytes(uint8_t adr, uint8_t data1, uint8_t data2, uint8_t data3)
Konkret also I2CTWI_transmit3Bytes(PCA9555_wr, 0x06, 0x00, 0xF8 );
Lesen mehrerer Bytes macht die Funktion void I2CTWI_readBytes(uint8_t targetAdr, uint8_t * messageBuffer, uint8_t numberOfBytes);
Für das obige Beispiel muss aber (vermutlich) trotzdem die Schreibadresse des Bausteins eingesetzt werden:
I2CTWI_transmitByte(PCA9555_wr, 0x01); // Adresse auf Register 0x01 setzen
uint8_t Port[1]; // als Array definiert, obwohl nur 1 Byte. Macht die Pointerei einfacher.
I2CTWI_readBytes(PCA9555_wr, Port, 1); // der Pointer Port zeigt auf die Anfangsadresse des Arrays Port[], also auf Port[0]

viel Erfolg
Bernhard

b_spitzer
23.04.2011, 22:18
Das obige natürlich ohne Gewehr - äh Gewähr :)

tschuessle
B.

Snow Wolf
23.04.2011, 22:39
naja dann werd ich das mal versuchen vl funktioniert es, ich werd das Ergebnis spätestens nächste Woche posten

MfG Snow Wolf