Forum: Compiler & IDEs FTDI 245 und Terminalprogramm


von USBStarTER (Gast)


Lesenswert?

Hallo! Seit ein paar Stunden bin ich besitzer des FTDI 245. Ich habe die
Treibe installiert und habe ihn als COM Port erkannt. Ich verwende auf
der PC Seite das Terminalprogramm Bray und habe ein kleines Programm
geschrieben, mit dem ich etwas zum PC schicken möchte. Nur leider zeigt
mir das Terminalprogramm keine Empfangenen Daten an! WARUM blos nicht???
Danke für Tipps.

____________________
Programm: zum Senden
____________________

int main(void)
{
DDRA = 0xFF;          // Port A als Ausgang
PORTA = 0xCC;         // 0xCC soll gesendet werden
PORTD |= (1<<1);      // WR setzen
asm("nop");           // kleine Pause
PORTD &= ~(1<<1);     // WR löschen
PORTD |= (1<<4);      // Positive Flanke an SLP => Sende Daten
PORTD &= ~(1<<4);
}

____________________
Programm: zum Empfangen
____________________

volatile unsigned int usbData;

int main(void)
{
PORTA = 0x00;         // keine Pullups
DDRA = 0x00;          // Port A als Eingänge
PORTD &= ~(1<<0);     // RD löschen
asm("nop");           // kleine Pause
usbData = PINA;       // Einlesen der 8Bit
PORTD |= (1<<0);      // RD setzen

PORTC = 0xFF;   //zum Test: PORTC als Ausgang
PORTC = usbData; //usbData an LEDs von STK500
}

von USBStarTER (Gast)


Lesenswert?

Ok....problem hat sich gelöst...man sollte auch RD und WR als Ausgänge
definieren!! ...blöder Fehler!

von Matthias (Gast)


Lesenswert?

Ich habe auch das FTDI-Modul. Senden funktioniert einwandfrei, Senden 
dagegen nur eingeschränkt.
Habe vom Prinzip her den gleichen Code wie oben beschrieben und es ist 
bei mir so, dass nur jedes zweite Byte, das ich über den COM-Port 
schicke, am µC auch ankommt.
Ich vermute, dass es mit dem RXF#-Signal zusammenhängt. Wenn ich es vor 
dem ersten Auf-Null-Ziehen von RD abfrage, kommen keine Daten an. Wenn 
ich es nicht abfrage, kommen wie beschrieben nur jedes zweite Byte an.
Hat vielleicht jemand einen funktionierenden Code-Schnipsel für den 
FTDI, an dem ich mich orientieren kann?

von Matthias (Gast)


Lesenswert?

@ Matthias: (Hallo Namensbruder ;-) - nein ich red nicht mit mir 
selbst...)

Poste mal den Code im Forum. Ich hab leider keine Kristallkugel, die
mir sagt, wo bei dir der Fehler ist...



von Matthias (Gast)


Lesenswert?

Ich sagte ja, im Prinzip wie der Code oben.
Die Funktion receive() ruf ich dann im Hauptprogramm auf und bekomme 
dann die empfangenen Daten geliefert.


unsigned char receive (void)    //Werte von PC empfangen

{unsigned char data;
data=0x00;                              //Variable auf Null setzen
DDRA=0x00;              //Port A Eingang
PORTB &= ~(1 << RD);                    //lösche RD -->
asm("nop");                             //kleine Pause
data=PINA;                              //Daten werden in Variable 
geschriebe
PORTB |=(1<<RD);                        //setze RD
return (data);                          //Rückgabe der empfangenen Daten
}

von Matthias (Gast)


Lesenswert?

Also, wenn ich das richtig verstehe, dann sollte es sich bei dir
um ein Timing-Problem handeln. (Aber wir klopfen wohl besser alles der
Reihe nach ab ...)

Du wirst in jedem Fall das RXF# Signal abfragen müssen.
Die Leute von FTDI stellen Dir das Signal nicht umsonst zur Verfügung.
Schau Dir in jedem Fall die Timing-Diagramme an und rechne nach, ob dein
Controller die Daten zu schnell oder zu langsam abruft.

Dann eine Kleinigkeit für alle Leute, die das bisher noch nicht so ganz
im Blick haben:

Man muss immer einen 100% definierten Zustand haben. Bei deim Code
könnte ich mir vorstellen, dass Du den WR versehentlich auf "high" 
setzt.

Ver such mal deine Funktion umzuschreiben:

bool char_receive( char * dat )
{
 // Ab hier werde ich Pseudocode/Realcode-mix verwenden

 /*
 Datenrichtungen "richtig" setzen;
 Portregister "richtig" setzen; // Also nicht versehentlich Pullups 
setzen!
 */

 if( RXF# == LOW )
 {
   Daten in dat lesen;
   // z.B. "*dat = PINX;" - kannst Du mir Zeigern umgehen?
 }
 else return false;

}

Dann brauchst Du nur folgendes:

void main (void)
{
 char datum;

 if( char_receive(&datum) )
 {
   Hurra! Hab was empfangen und verarbeite es;
 }
 else tu nix; // Bzw. weiter mit anderen Dingen, falls vorhanden.

}


Sorg aber bei jeder schreib, bzw. Lesefunktion dafür, dass alle
Signalpins auch immer den richtigen Pegel haben.
Wenn Versehentlich RD=low und WR=high ist, dann liest Du Hausnummern,
aber keine sinnvollen Daten.

Ich persönlich würde zwar die Daten über einen Interrupt, der durch 
wechsel
von high->low an RXF ausgelöst wird empfangen. Aber so wie ich das sehe,
bist Du nicht gerade der ultimative Profi, und daher gehe ich nicht 
davon aus, dass Dir der Controller schon vollständig "aus der Hand 
frisst" ;-)

Wenn Du nach dem Überarbeiten der genannten Punkte immernoch Probleme 
hast,
dann schick mal den Schaltplan und Sourcecode. Wenn möglich auch noch
- Geschwindikeit des µC und Typ
- Fuse/Konfigurationsbits
- Datenrate, mit der Daten an den Controller gesendet werden
- Was Du schon geprüft bzw. abgeklopft hast

Ich glaub zwar nicht, dass es so kompliziert ist, aber wer weiss ;-)

von Matthias (Gast)


Lesenswert?

OOPS,

hab was vergessen. Es muss so aussehen !!!

 if( RXF# == LOW )
 {
   Daten in dat lesen;
   // z.B. "*dat = PINX;" - kannst Du mir Zeigern umgehen?
   return true; // !!! Sollte man nicht vergessen ;) !!!
 }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.