PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC18F452 und FT245



flownfluid
13.10.2005, 10:21
Hallo zusammen,

ich weiss nicht genau in welches Forum ich es ablegen muss, also seid mir bitte nicht böse falls es am falschen Ort ist...

Ich arbeite das erste mal mit einem FT245 Chip und habe da so meine
Probleme.
Ich brauche diesen Chip um die Daten, welcher mir ein PIC18F452
bereitstellt, zu lesen.

Laut Doku von FTDI beim D2XX- Treiber kann man die Daten unter C++ auf
zwei verschiedenen Arten lesen:

1. immer die aktuellen Daten
2. mit einem timout

Die 2. Methode funktioniert mir aber ich bräuchte die 1. Methode und
diese Funktioniert mir irgendwie nicht.

Mein C- Funktion sieht so aus:
void USB::readFTDIonce()
{
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD TxBytes;
DWORD BytesReceived;
DWORD RxBytes;
unsigned char RxBuffer[256];

FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
if(RxBytes > 0)
{
ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);

if(ftStatus = FT_OK)
{
for(int i = 0 ; i< int(RxBytes) ; i++)
{
printf("%i\n",RxBuffer[i]);
}
}
else
{
printf("no value was writen on the bus\n");
}
}
else
{
printf("can't read\n");
}
}

und fürs öffnen des devices:
void USB::openFTDI()
{
FT_STATUS ftStatus;
ftStatus = FT_Open(0,&ftHandle);

if(ftStatus == FT_OK)
{
printf("CONNECTED\n");
}
else
{
printf("NOT CONNECTED\n");
}
}

mit dem Pic schreibe ich folgendermassen auf den Bus:

void main(void)
{
init();

USB_D_NRD = 1;
USB_D_WR = 0;

while(1)
{
while(USB_D_NTXE == 1)
{
}
PORTD = 0xFF;
USB_D_WR = 1;
asm(" NOP");
USB_D_WR = 0;
}
}

void init()
{
PORTD = 0x00;
TRISD = ALL_OUTPUT;

PORTC = 0x00;
TRISC = 0x59;
}

und noch die Variabelndeklarationen
static bit USB_D_NRD @ (unsigned)&PORTC*8+1; /* */
static bit USB_D_WR @ (unsigned)&PORTC*8+2; /* */
static bit USB_D_NTXE @ (unsigned)&PORTC*8+3; /* */
static bit USB_D_NRXF @ (unsigned)&PORTC*8+4; /* */

Leider zeigt mir die Dos-Console immer "no value was writen on the
bus" und ich habe keine Ahnung wieso

Leider habe ich keine Ahnung wo der Fehler ist, vielleicht mache ich etwas auf der Seite vom PIC falsch das heisst irgend eine falsche Initialisation oder sonst was, oder ich kann den FTDI- Code nicht nachvollziehen...

Vielen Dank für euere Hilfe



Gruss

unclejamal
04.01.2006, 19:06
hallo!

leider kann ich dir nicht genau im bezug auf dein problem helfen. sorry.

aber eine frage habe ich: welchen c compiler benutzt du, und weißt du wo es source-codes für c++ für die ansteuerung des ft245 gibt?

danke, und ich wünsch dir noch viel gelingen mit deinem projekt!

flownfluid
05.01.2006, 11:22
Hallo,

ich kompiliere den Quellcode mit dem HI- Tech Kompiler.

Um in C++ darauf zuzugreifen, habe ich die zweite Variante benützt also mit einem Timeout. Das Programm funktioniert und läuft meinenserachten einwandfrei. Wenn du möchtest kann ich es reinstellen.

Gruss

stegr
05.01.2006, 14:00
Wäre ganz toll, wenn du das machen könntest.
Hab ich mir vor ner Weile auch schonmal überlegt, aber dann den Aufwand gescheut... ;)

Btw.
Der Hi-Tech-Code ist zu 99,9% kompatibel zum C18-Code, also kann man auch dann auch den kostenlosen Compiler nehmen :)

MfG
Stefan

unclejamal
05.01.2006, 17:57
also da wär super, please c++ code posten!
...und welchen c++ compiler verwendest du?
gibts andere source-codes im internet auch?

vielen dank!

flownfluid
06.01.2006, 21:33
Hallo zusammen,

also Kompiliert habe ich es mit dem Visual Studio 6.0...

Dies ist ein sehr einfaches Programm welches nach meiner Meinung nach nicht gerade ideal ist. Es funktioniert zwar einwandfrei aber man sollte die Timeoutmethode von FTDI ersetzen und durch ein eigenständiges Thread das man selber programmiert hat einfügen.

Oder eine andere Möglichkeit ist es mit einem eigenenständigen Thread die Funktion readFTDI aufrufen so hat man keine Probleme mit der Systemauslastung.

Auserdem gibt es von FTDI eine hervoragende API.

--> Nicht vergessen die Library einzubinden...<--






includes:

#include "stdio.h"
#include "stdafx.h"
#include "ftd2xx.h"

globale Variabeln:

T_HANDLE ftHandle;


void USB::openFTDI()
{
FT_STATUS ftStatus;

ftStatus = FT_Open(0,&ftHandle);

if(ftStatus == FT_OK)
{
printf("CONNECTED\n");
}
else
{
printf("NOT CONNECTED\n");
}
}

void USB::closeFTDI()
{
FT_STATUS ftStatus;

ftStatus = FT_Close(ftHandle);

if(ftStatus == FT_OK)
{
printf("DISCONNECTED\n");
}
else
{
printf("NOT DISCONNECTED\n");
}

}
void USB::readFTDI()
{

FT_STATUS ftStatus;

DWORD RxBytes = 10;
DWORD BytesReceived;
unsigned char RxBuffer[256];

FT_SetTimeouts(ftHandle,5000,0);
ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);
if(ftStatus == FT_OK)
{
if(BytesReceived == RxBytes)
{
for(int i = 0 ; i < int(BytesReceived) ; i++)
{
printf("%d \n",RxBuffer[i]);
}
}
else
{
printf("no value was writen on the bus\n");
}
}
else
{
printf("can not read FTDI chip\n");
}
}


viel Spass daran, hoffe es bringt euch weiter sonst fragt... ;-)

unclejamal
07.01.2006, 19:00
vielen dank flownfluid,
die *.h-include-files sind die von ftdi oder (erhältlich auf der ftdi homepage?)? ist hier diese "Timeoutmethode von FTDI " drinnen?

die library (*.dll oder) - wo finde ich die?

danke!!!!!!!!!!!!!!

ps: das ganze sollte auch mit dem von dlp-design (dlpdesign.com) modul "dlp-usb245" funzn oder?

flownfluid
07.01.2006, 22:12
Hallo,
-----------------------------------------------------------------------
wegen den includes:
-----------------------------------------------------------------------
#include "stdio.h"
Standart c- library für in/ und outputstreams. in diesem Beispiel nicht nötig aber ganz nützlich für Daten zu speichern...

#include "stdafx.h"
Standart C- library für die printf- Funktion

#include "ftd2xx.h"
FTDI Treiber... findet man unter http://www.ftdichip.com/Drivers/D2XX.htm

-----------------------------------------------------------------------
wegen der FTDI- Library
-----------------------------------------------------------------------
Wenn du gut C++ proggen kannst, nimm die ftd2xx.dll Datei aber dann musst du selber die Funktionen als Pointer implementieren.
Falls du dich da nicht gerade wohl fühlst würde ich sagen, benutze lieber die ftd2xx.lib Datei. So kannst du die Funktionen direkt aufrufen, musst aber beim Linken die Library angeben

-----------------------------------------------------------------------
"Timeoutmethode von FTDI "
-----------------------------------------------------------------------
ja in der readfunktion
FT_SetTimeouts(ftHandle,5000,0); (5000-> 5s)

falls du nun in der Mainmethode irgenwie sowas schreibst:
while(1)
{
myUsbDriver->readFTDI();
}

so wird nachdem das Programm gestartet worden ist, alle 5 sec der FTDI Chip abgefragt.
Die 5sec sind Variabel und kann selbst eingestellt werden.

Aber Vorsicht bei dieser Art der Programmiereung, Die while- Schlaufe sollte durch eine eigenes Thread immer wieder aufgerufen werden. So kann man ohne Probleme die Daten nebenbei noch auswerten und mit diesen Arbeiten...

-----------------------------------------------------------------------
"dlp-usb245"
-----------------------------------------------------------------------
Nach meiner Meinung wird es ohne Probleme funktionieren...

Gruss und schönes Wochenende

unclejamal
11.01.2006, 20:36
da ich den borland c++ builder für c++ verwende, habe ich ein kleines problem bei der umsetzung des source codes, und zwar folgendes:

deine globale Variabeln:

T_HANDLE ftHandle;

die variablendefinition T_HANDLE gibts es im c++-builder nicht, bitte beschreibe diesen variablentyp damit ich eine gleiche im c++-builder finden kann.

danke

flownfluid
12.01.2006, 22:51
Hallo,

sollte ein FT_HANDLE sein und nicht ein T_HANDLE...

entschuldige

gruss

unclejamal
13.01.2006, 18:13
hatte es dann eh selber rausgefunden.
was vielleicht noch zu bemerken ist, für andere user, dass die FTD2XX.DLL auch noch einbinden muss.

wenn es jemand benötigt, dann kann ich den source code für den c++ builder posten. (jedoch wurde das usb modul noch nicht getestet, da es bei mir noch nicht geliefert wurde, aber das programm läuft).

jedenfalls danke an alle!

sTEk
18.01.2006, 00:10
Hallo!

Ich "schlage" mich auch grad mit der FTD2XX-Treiber-Programmierung unter Visual C++ rum.

Ich habe es allerdings vorerst mit der Implementierung der LIB in den Linker-Optionen geschafft, daher würde mich die Lösung mit der DLL sehr freuen.

Die Kommunikation selbst klappt soweit, ein paar (Begriffs)Schwierigkeiten bereitet mir jedoch der Bit-Bang-Modus...irgendwie klappt das mit dem Zuweisen der Outputwerte nicht so richtig. Hat da irgendwer Erfahrungen drin?

unclejamal
22.01.2006, 15:06
...hab jetzt bisschchen programmiert, und hab da beim Schreiben zum usb, probleme. hab da irgendwo mal gehört, dass die ersten paar bytes im speicher des ft245 fix reserviert sind, und ich beim schreiben, erst nach diesen bytes meine daten ablegen kann (das heißt ich müsste zuerst irgendwelche "sinnlosen" bytes zum usb-teil schicken, bevor ich meine nutz-daten senden kann, oder?).

vielleicht kann ja jemand den code zum Schreiben (FT_Write) posten. danke.

ps @sTEk: kannst du mir kurz erklären was der bit-bang-modus ist?

unclejamal
29.01.2006, 16:25
?? gibts euch noch?

unclejamal
29.01.2006, 16:30
achja, hab jetzt das usb-teil bekommen, das modul lässt sich problemlos öffnen und schließen. mit dem lesen sollts auch funzn...
danke euch!

unclejamal
10.04.2006, 13:32
hab da ne frage:

meine funktion zu ReadFTDI() ist void:

void TFormMain::ReadFTDI (void)
{
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
DWORD BytesReceived;

unsigned char RxBuffer[256];
int iIndex;
int iX;

RxBytes=0;
TxBytes=0;
BytesReceived=0;
EventDWord=0;

for(iIndex=0; iIndex<=256; iIndex++)
{
RxBuffer[iIndex]=0;
}

FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
//FT_SetTimeouts(ftHandle,5000,0);
if(RxBytes > 0)
{
ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);
if(ftStatus == FT_OK)
{
if(BytesReceived == RxBytes)
{
for(iX = 0 ; iX < int(BytesReceived) ; iX++)
{
Memo->Lines->Add("RxBuffer[iX] = RxBuffer[" + IntToStr(iX) + "]:");
Memo->Lines->Add(RxBuffer[iX]);
}
}
else
{
//no value was written on the bus
}
}
else
{
//can not read FTDI chip
}
}code]

ich möchte folgende synchronisation mit einem µController, der auf dem USB-Modul hängt, vornehmen:
µC -> PC "Request"..... PC->µC "Reply"
wenn der µC 5mal eine Antwort vom PC bekommt sendet er einmalig noch eine Bestätigung.

Das Problem: die Fuktion ReadFTDI() liefert mir nichts zurück. wie kann ich aber meine Synchronisation machen. muss ich einen rückgabetyp wählen, wenn ja, welcher?
mit der folgendne funktion, hätte ich mir die synchronisation überlegt, allerdings ist es dann an obiger frage gescheitert:

[code]bool TFormMain::SyncUSB (void)
{
int iReceive; // erhaltene Zahl von uC
int iSuccess=0; // wie oft wurde REQUEST empfangen
bool bSync; // ganze Sync OK (wenn iSuccess=5);

iReceive = ReadFTDI(); // <--- ***** FEHLERMELDUNG ********

while (iReceive == 5)
{
if (iReceive == 245)
{
iSuccess++;
Memo->Lines->Add("uC Request: " + IntToStr(iSuccess) + "x mal erhalten");
WriteFTDI(246); // Reply
Memo->Lines->Add("Reply an uC gesendet");
}
else
{
Memo->Lines->Add("uC Request nicht erhalten");
}
}

return bSync; // Rückgabe des Status ob Sync erfolgreich oder nicht

}
//---------------------------------------------------------------------------

void __fastcall TFormMain::ButtonSyncStartClick(TObject *Sender) //Button zur synchronisation
{
MemoDebug->Lines->Add("--- SyncUSB gestartet ---");
if(SyncUSB() == 1) Memo->Lines->Add("Sync OK !!!");
else Memo->Lines->Add("Sync fehlgeschlagen!");
}
//---------------------------------------------------------------------------


hoffe das hier ist halbwegs übesichtlich,
danke
uj