Forum: Mikrocontroller und Digitale Elektronik BitBangMode FT2xxBM wie Ausgänge setzen?


von Telco (Gast)


Lesenswert?

Hallo Leute,

wie der Betreff schon sagt, möchte ich mittels BitBangMode paar Ausgänge 
des FT232BM setzen und löschen. Allerdings weiss ich im Moment nicht 
mehr weiter, ich habe mittels FT_SetBitMode(FT_Handle, 1,1) den 
asynchronen BitBandModus aktiviert und Bit0 als Ausgang definiert.
Wie sage ich nun dem Baustein, dass Bit0 1/high gesetzt werden soll?
Wenn ich mit FT_write(...) irgendwas schreibe, dann "flackert" an Bit0 
zwar irgendwas aber ich möchte, das Bit einfach nur High setzen und bei 
bedarf manuell wieder löschen. Kann mir da jemand helfen?
Danke im voraus
Telco

von Telco (Gast)


Lesenswert?

keiner eine idee?

von B e r n d W. (smiley46)


Lesenswert?

Ungefähr so:
1
long ret;
2
unsigned char buffer[256];
3
long written;
4
long bytes = 1;  // immer nur 1 Byte ausgeben
5
6
buffer[0] = 1;   // Bit0 = 1 -> EIN
7
ret = FT_Write(hDev, &buffer, bytes, &written);
8
if (ret>FT_OK || written!=bytes) {
9
  // error
10
}
11
12
delay(1000);     // 1 Sekunde warten
13
14
buffer[0] = 0;   // Bit0 = 0 -> AUS
15
ret = FT_Write(hDev, &buffer, bytes, &written);
16
if (ret>FT_OK || written!=bytes) {
17
  // error
18
}

Werden mehrere Bytes hintereinander ausgegeben, so geschieht das mit dem 
16 fachen der eingestellten Baudrate.

Gruss, Bernd

von Telco (Gast)


Lesenswert?

Vielen Dank,

aber der BitbangMode ist doch dafür da, um einzeln die Bits zu 
setzen/löschen, oder spielt da die Baudrate eine Rolle und bestimmt wie 
lange das Bitmuster anliegt? Wäre es also nicht möglich, ein Relais mit 
dem Bitbangmode anzusteuern?
Danke nochmal
gruss Telco

von B e r n d W. (smiley46)


Lesenswert?

Die Baudrate spielt nur eine Rolle, wenn Du mehrere Bytes auf einmal 
ausgibst:
1
long ret;
2
unsigned char buffer[256];
3
long written;
4
long bytes;
5
6
buffer[0] = 1;   // Bit0 = 1 -> EIN
7
buffer[1] = 0;   // Bit0 = 0 -> AUS
8
buffer[2] = 1;   // Bit0 = 1 -> EIN
9
buffer[3] = 0;   // Bit0 = 0 -> AUS
10
bytes = 4;       // diesmal 4 Bytes
11
12
ret = FT_Write(hDev, &buffer, bytes, &written);
13
if (ret>FT_OK || written!=bytes) {
14
  // error
15
}

Das erste Bit kommt mit einer Verzögerung von ca. 1ms, die weiteren Bits 
mit dem 16fachen der Baudrate. Der FT232B hat einen Buffer von 4096 
Bytes (glaub ich wenigstens noch im Hinterkopf zu haben). Diesen kann er 
ziemlich flott ausgeben. Beim nächsten Frame kann aber wieder eine Lücke 
von 1ms oder mehr entstehen, wenn z.B. gerade ein Festplattenzugriff 
stattfindet.

MFG. Bernd

von Telco (Gast)


Lesenswert?

Also würde mein Relais immer kurz "abfallen" ? Gibt es keine Möglichkeit 
die 8Bits einzeln zu setzen und wieder zu löschen? Wie in einem µC? Ist 
das nicht BitBang? Das was zur zeit passiert ist ja sowas wie eine 
parallele Ausgabe?

von B e r n d W. (smiley46)


Lesenswert?

Du musst immer 1 Byte schreiben, dabei sind die Bits:

Tx=0 Rx=1 Rts=2 Cts=3 Dtr=4 Dsr=5 Dcd=6 Ri=7

Du solltest Dir den Zustand des Bytes/Ports zwischenspeichern und 
änderst dann jeweils nur ein Bit. Die anderen Bits bleiben dadurch 
unverändert.
1
  unsigned char wert;
2
3
  wert &= 0xFE; // Bit 0 rücksetzen
4
  buffer[0] = wert;
5
  // hier Ausgabe...
6
7
  wert |= 0x01; // Bit 0 setzen
8
  buffer[0] = wert;
9
  // hier Ausgabe...

Bei "wert" könnte es sich z.B. um eine globale Variable handeln.

Gruss

von Sabine (Gast)


Lesenswert?

HANDLE ftHandle;   // valid handle returned from FT_Open or 
FT_W32_CreateFile
FT_STATUS ftStatus;
UCHAR Mask = 0x07;   // set bits 0, 1 and 2 to Output
UCHAR Mode = 1;   // set Asynchronous Bit Bang mode
ftStatus = FT_SetBitMode(ftHandle,Mask,Mode);
if (ftStatus == FT_OK) {
   // Asynchronous Bit bang Mode enabled
}
else {
   // FT_SetBitMode FAILED!
}
Mode = 2;
ftStatus = FT_SetBitMode(ftHandle,Mask,Mode);
//   vorher                            0000-0001
//   nachher                           0000-0010
Somit wird duch Mode = 2 das Bit-Posistion 0 gelöscht,
und Bit-Position 1 gesetzt.

von Sabine (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe das schon an einem FT245 ausprobiert.
Ist für Visual Basic.

von B e r n d W. (smiley46)


Lesenswert?

@Sabine

Aus "AN232B-01_BitBang.pdf"

FT_SetBitMode (ftHandle : Dword ; ucMask , ucEnable : Byte) : FT_Result;

This sets up which bits are input and which are output.
The ucMask byte sets the direction.

A ‘1’ means the corresponding bit is to be an output.
A ‘0’ means the corresponding bit is to be an input.

When read data is passed back to the PC, the current pin state for both 
inputs and outputs will used. The ucEnable byte will turn the bit bang 
mode off and on.

Setting bit 0 to ‘1’ turns it on.
Clearing bit 0 to ‘0’ turns it off.

Nochmal in deutsch:
Mask definiert, welche Leitung im Bitbangmodus als Ein- bzw. Ausgang 
verwendet wird. Der Mode schaltet den Bitbangmodus ein bzw. aus.
Der FT232BM verwendet laut Datenblatt beim Mode nur Bit 0.

Gruss, Bernd

von Telco (Gast)


Lesenswert?

Vielen Dank nochmal für alles... Das ist soweit klar, allerdings habe 
ich nun mit SetBitMode() meine Ein bzw Ausgänge definiert, aber wie 
setze ich die Ausgänge nun High? Das ist eigentlich mein Problem... 
Geschieht das mit dem ModeBit???

von B e r n d W. (smiley46)


Lesenswert?

Nein, sondern mit FT_Write(). Nur falls das Ausgangsbit schon gesetzt 
wäre, könnte man über das Datenrichtungsregister Eins oder Null 
ausgeben. Und auch nur, wenn am Ausgang ein Pull-Down hängt, eine Last, 
z.B. ein Transistor.

Darf ich fragen, mit was Du programmierst?

von Telco (Gast)


Lesenswert?

Danke nochmal an alle, ich verzweifel hier noch...
Programmiere in Visual Basic, also definiere ich mit 
FT_SetBitMode(Handle,16,1) Pin 21 des FT232BM als Output und setze mit 
FT_Write(Handle, ???, ???, ???) Pin 21 auf high?
Danke nochmal...
gruß Telco

von Telco (Gast)


Lesenswert?

nachtrag: ...und als Last, hängt eine LED an dem PIN, aber irgendwie 
bekomme ich das Write nicht hin. Muss ich ein ASCII-Zeichen mit dem 
dezimalen Wert von 16 senden?

von B e r n d W. (smiley46)


Lesenswert?

Dann ist Bit4 = DTR = Pin21 der Ausgang. Du musst wert und written als 
Pointer übergeben. Das müsste ungefähr so aussehen:
1
Dim wert As Byte
2
Dim written As Long
3
4
wert = 16
5
ret = FT_Write(hDev, @wert, 1, @written);
6
if (ret>FT_OK) {
7
  // error
8
}

von Telco (Gast)


Lesenswert?

Vielen Dank für eure Hilfe, es funktioniert nun :-) Die codesnippets 
haben mir sehr geholfen, besten Dank an alle... allerdings muss ich noch 
wissen, wie ich das alte bitmuster beibehalte und ZUSTÄTZLICH ein bit 
ändern kann. Sowas wie eine Bitweise Verknüpfung ( |= ) , aber wie sieht 
sowas syntaxmäßig in VB aus? Weiss das jemand???

von Telco (Gast)


Lesenswert?

...bzw was passiert, wenn ich einen mit SetBitMode definierten Eingang 
mit einer 0 mit FT_Write beschreibe bzw was zwangsweise geschieht beim 
schreiben, wenn ich nicht nur ausgänge habe? Sind meine Abschließenden 
fragen :-) Danke

von B e r n d W. (smiley46)


Lesenswert?

Beim Schreiben auf Eingänge gehen die entsprechenden Bits ins Leere. Nur 
an den als Ausgänge definierten Leitungen passiert was.

Beim Lesen im Bitbang Modus werden die aktuell anliegenden Zustände 
eingelesen. An den Leitungen, welche als Ausgänge definiert sind, liest 
man natürlich den selben Zustand wieder ein.

Empfehlung:
Obendrüber immer "Option Explicit", auch wenns am Anfang nervt.

Wie ich das alte bitmuster beibehalte: Oberhalb der ersten Funktion eine 
globale Variable definieren.

Option Explicit
Dim wert As Byte

wert = wert Or 16         ' Bit setzen
wert = wert And (255-16)  ' Bit rücksetzen

Dann noch viel Spass beim Programmieren.

MFG, Bernd

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.