- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: PIC18F452 und FT245

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2005
    Beiträge
    27

    PIC18F452 und FT245

    Anzeige

    Praxistest und DIY Projekte
    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,&EventDWor d);
    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:penFTDI()
    {
    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    11
    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!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2005
    Beiträge
    27
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    41
    Beiträge
    506
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    11
    also da wär super, please c++ code posten!
    ...und welchen c++ compiler verwendest du?
    gibts andere source-codes im internet auch?

    vielen dank!

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2005
    Beiträge
    27
    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...<--




    Code:
    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...

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    11
    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?

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2005
    Beiträge
    27
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    11

    ?

    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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    21.09.2005
    Beiträge
    27
    Hallo,

    sollte ein FT_HANDLE sein und nicht ein T_HANDLE...

    entschuldige

    gruss

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen