www.mikrocontroller.net

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


Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine idee?

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ungefähr so:
long ret;
unsigned char buffer[256];
long written;
long bytes = 1;  // immer nur 1 Byte ausgeben

buffer[0] = 1;   // Bit0 = 1 -> EIN
ret = FT_Write(hDev, &buffer, bytes, &written);
if (ret>FT_OK || written!=bytes) {
  // error
}

delay(1000);     // 1 Sekunde warten

buffer[0] = 0;   // Bit0 = 0 -> AUS
ret = FT_Write(hDev, &buffer, bytes, &written);
if (ret>FT_OK || written!=bytes) {
  // error
}

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

Gruss, Bernd

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Baudrate spielt nur eine Rolle, wenn Du mehrere Bytes auf einmal 
ausgibst:
long ret;
unsigned char buffer[256];
long written;
long bytes;

buffer[0] = 1;   // Bit0 = 1 -> EIN
buffer[1] = 0;   // Bit0 = 0 -> AUS
buffer[2] = 1;   // Bit0 = 1 -> EIN
buffer[3] = 0;   // Bit0 = 0 -> AUS
bytes = 4;       // diesmal 4 Bytes

ret = FT_Write(hDev, &buffer, bytes, &written);
if (ret>FT_OK || written!=bytes) {
  // error
}

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

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht 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.
  unsigned char wert;

  wert &= 0xFE; // Bit 0 rücksetzen
  buffer[0] = wert;
  // hier Ausgabe...

  wert |= 0x01; // Bit 0 setzen
  buffer[0] = wert;
  // hier Ausgabe...

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

Gruss

Autor: Sabine (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sabine (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das schon an einem FT245 ausprobiert.
Ist für Visual Basic.

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist Bit4 = DTR = Pin21 der Ausgang. Du musst wert und written als 
Pointer übergeben. Das müsste ungefähr so aussehen:
Dim wert As Byte
Dim written As Long

wert = 16
ret = FT_Write(hDev, @wert, 1, @written);
if (ret>FT_OK) {
  // error
}

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Telco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.