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
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
longret;
2
unsignedcharbuffer[256];
3
longwritten;
4
longbytes;
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
unsignedcharwert;
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.
@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?
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