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
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
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
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
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?
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
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.
Ich habe das schon an einem FT245 ausprobiert. Ist für Visual Basic.
@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
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???
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?
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
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?
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 | }
|
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???
...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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.