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 }
Ok....problem hat sich gelöst...man sollte auch RD und WR als Ausgänge definieren!! ...blöder Fehler!
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?
@ 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...
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 }
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.