mikrocontroller.net

Forum: Compiler & IDEs FTDI D2XX problem


Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich bin fast am verzweifeln.
ich versuche eine kommunikation aufzubauen mit dem ftdi.
mein uC soll Daten zum PC senden. Am Besten sagt der mikrocontroller am 
anfang wieviele Byte, sodass der PC etwas Ahnung hat.

Momentan versuche ich erstmal einzelne Byte zu verschicken.

AVR Code:
while (1) {
    uart_putc (0xFF); //255
    uart_putc (0xEE); //238
    uart_putc (0xAB); //171
    uart_putc (99); //anzahl pakete
    for (i=0;i<99;i++) {
      uart_putc(i);  
      
    }
  }

auf PC seite geh ich nach der D2xx programmers guide vor.
int FTDI_COMM::receive(unsigned char* message, FT_STATUS &ftStatus, FT_HANDLE &ftHandle1, bool debuginfo){    
    // receive a message
    DWORD RxBytes;
    DWORD RxBytes_man =1;
    DWORD TxBytes;
    DWORD EventDWord;
    DWORD BytesReceived;
    unsigned char RxBuffer[1];
    
    int var_int;
    

    ftStatus = FT_GetStatus(ftHandle1,&RxBytes,&TxBytes,&EventDWord);
    if ( ftStatus != FT_OK ) {
      cout<<"Could not get status!";
      return -1;
    }
  
  

    if (RxBytes = 1) {
      ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
      if (ftStatus == FT_OK) {
    

        *message = RxBuffer[0];
                
      
      }
      else {
        // FT_Read Failed
        cout<<"Read Buffer Failed!";
        return -1;
      }
    }

    else return -1;

    return 1;
}


Das Problem ist: wenn ich AVR und PC Seite mit 57600 Baud konfiguriere 
klappt das noch. Der AVR macht keine Delays und Codeoptimierung ist auf 
0.
wenn ich auf 115200 Baud erhoehe dann verlier ich ne Menge pakete.

struct ftdi_paket {
  unsigned char a;
  unsigned char b;
  unsigned char c;
};

...

...
int main...

while (1){
    myFTDIobject.receive(&act_char,ftStatus,ftHandle,0);
    paket.a = act_char;
    paket.c = paket.b;
    paket.b = last_char;
    
/*
    printf("ausgelesen 1 : %d ",paket.a);    
    printf("  ausgelesen 2 : %d ",paket.b);
    printf("  ausgelesen 3 : %d \n",paket.c);
    */

    if ((last_char+1) != act_char) {
      printf(" Error: Aktueller Wert: %d  Letzter Wert: %d  OK:%i \n", act_char, last_char, ok);
      ok=0;
    }
    else  {      
      ok++;
    }
    
    if ((paket.a == 0xAB) && (paket.b==0xEE)&&(paket.c==0xFF)){
        printf (">>>>>>>>>>> HEADER GEFUNDEN!!!!!! <<<<<<<<\n");
        ok++;
    }

    last_char= act_char;
  }




Hat jemand n Beispiel wie man mit D2XX wirklich schnell daten 
transferieren kann? wenn ich auf 57600 beschraenkt bin, kann ichs grad 
vergessen. und den ftdi hab ich extra wegen der schneller uebertragung 
geholt.

danke fuer die hilfe
Pak

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder einfach mal ganz anders:

wie kann man mit dem FTDI 232R daten schnell vom uC zum PC uebertragen?
eine recht grosse menge in kuerzester zeit...

ich such einfach nur ein gescheites codebeispiel und nicht den muell der 
FTDI Seite.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
230Kbps mit Mega168 und FT232R ist überhaupt kein Problem. Vorausgesetzt 
die Bitrate passt. Woher kriegt der AVR denn den Bitratentakt?

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm keine ahnung. Ich nutz die UART Library vom Peter Fleury !???!
dort drin setz ich die baudrate auf den gewuenschten wert. ich benutze 
einen externen 16 mhz takt.
aber spaeter wollte ich auf einen Atmega644 mit 20mhz umsteigen.

kannst du etwas code bereitstellen? ich dreh hier noch am rad mit der 
miesen dokumentation

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tip: Baudratenquarz

Bei Taktraten immer dran denken, dass die Bitraten auch sauber erzeugt
werden können. So sind 18,432 MHz für hohe Bitraten geeignet, 16 MHz
oder 20 MHz jedoch nicht.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok,

wie siehts mit der Konfiguration der FTDI Kommunikation aus?

ich kann Latency, Baudrate, FlowControl, TimeOuts, Datacharacteristics 
usw setzen...
ist da etwas spezielles empfehlenswert?

Autor: Andreas K. (a-k)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel für Initialisierung mit Flow-Control.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok die initialisieung war schon recht aehnlich.

ich hatte die Timeouts auf 100,100
Die flow control auf "none"
LATENCYTIMER hab ich auf 50!! ????
FT_SetDataCharacteristics war gleich.
mit 57600 baud ist das ergebnis ok. !!!

wenn ich die baudrate erhoehe (115200), geht wieder mal alles schief.

im moment benutze ich:
ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
zum empfangen wobei:
DWORD RxBytes_man =1;
DWORD BytesReceived;
unsigned char RxBuffer[1];
  

ist das ok? wenn ich die bytes nicht einzeln empfange hatte ich das 
problem dass sich die pakete untereinander verschieben. Beim 
mikrocontroller sende ich z.b. A,B,C die ganze zeit.
empfange dann aber B,C,A. somit konnte ich das nicht mehr zuordnen. also 
bin ich auf einzelne pakete zurueck gegangen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wenn ich die baudrate erhoehe, geht wieder mal alles schief.

Schon mal versucht, 16000000 durch 115200*16 zu teilen? Was kommt dabei 
raus? Bei 57600 ist die Abweichung noch erträglich, bei 115200 nicht 
mehr.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> 230Kbps mit Mega168 und FT232R ist überhaupt kein Problem. Vorausgesetzt
> die Bitrate passt. Woher kriegt der AVR denn den Bitratentakt?

aber wie erreichst du dann diese Baudrate?
mit 18,432 MHz Quarz und FT_BAUD_230400 ???????

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
18432000 / (230400*16) = 5. Im /8-Modus der UART ginge folglich auch 
noch 460Kbps.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok klingt ueberzeugend.... leider hab ich kein passendes quarz gerade 
da. muss erst bestellen.


mit
ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
einzelne Bytes zu empfangen ist aber soweit ok?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Passt schon. Ist zwar recht unökonomisch, immer nur 1 Byte zu lesen, 
aber erst einmal irrelevant.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok jetzt hab ich einfach mal
baudrate auf 250000 eingestellt. denn das passt ja vom teiler her. und 
sihe da ich bekomm ne uebertragung wie mit 56700. nur schneller denk ich 
(aber ich kann noch nicht messen)!!

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leider erkennt mein Windows jetzt die ganze Zeit einen Microsoft 
pointer... und meine mouse wird nun vom FTDI bewegt... ganz toll

Autor: MNR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, mal ne Frage: Wenn du sowieso über den D2XX Treiber gehst, wieso 
willst du dann noch mit den krummen Baudraten rummachen? Also bei meinem 
232RL gehen 500KBit mit 16MHz Takt ohne Probleme. Man könnte auch 1MBit 
oder 250KBit oder 125KBit mit "geraden" Quarzen fahren.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@MNR

haette ich das nur frueher gewusst... ich dachte ich hab Codeprobleme... 
aber hjetzt funktionierts wuderbar. auch mit 1MBaud. Thanks a lot

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.