PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rx tx lötpads uart-prog01



TobeFFM
11.01.2009, 14:16
Hi!
Ich hab mal die Lötpads rx/tx neben dem start/stop-button bestückt, und die kabel (zusammen mit GND natürlich) an mein usb-prog angeschlossen.
Das Teil simuliert einfach nur ne serielle Schnittstelle am PC immo, und benutzt auch 5V-Pegel auf der Seriellen. Habe es auch bereits erfolgreich direkt an einem atmega8 getestet, da hat alles funktioniert.

Nur der RP6 wehrt sich immer noch :-) Also wie gesagt, Verkabelung ist richtig soweit, rx/tx und GND sind angeschlossen, baudrate ist auf 38400 eingestellt, 8-N-1, aber ich krieg überhaupt nichts am PC raus, nichtmal Datenmüll..
Gibts da noch irgendwo nen Jumper oder muss ich noch irgendwas anschliessen, um das zum laufen zu kriegen?

Muss ich noch RST anschliessen? Eigentlich doch nicht, oder? Soweit ich das verstanden hab ist der nur dazu da, nen Soft-Reset auszuführen?

andieh
11.01.2009, 18:19
diese drei pins sind genug für eine verbindung zu dem robo, so wie ich das jetzt sehe. am programmierstecker ist pin 1 = gnd, 4 = tx und 10 = rx, wenn man oben links anfängt zu zählen. verbindet man nur die drei pins mit der usbplatine, bekomme ich eine verbindung hin mit gtkterm.

mit minicom passiert aber nix. erst nachdem man in gtkterm "toggle rts" ausgewählt hat, fließt etwas über den ether. da liegt wohl das problem, eine passende möglichkeit bei minicom habe ich nicht gefunden.

okee, jetzt gilt es, die schnittstelle direkt auszulesen und damit rts zu toggeln.

hat schon jemand so was gemacht? ich glaube, dann könnten wir uns ne menge arbeit sparen =P~

grüße
andieh

andieh
11.01.2009, 23:39
okee, der thread mutiert zur blauderecke zwischen tobi und mir, aber ich glaube, das könnte schon den einen oder anderen interessieren.

folgender code liest die serielle schnittstelle aus. es setzt am anfang den request to send richtig und sendet auch gleich noch das "s" um den code auf dem rp6 zu starten.

übersetzt wird mit gcc -o test test.c, aber wem erzähl ich das. wenn ihr das orginalkabel vom rp6 benutzt, sollte das device /dev/ttyUSB0 sein (äh ok, ist nur unter linux getestet!), andernfalls einfach ändern.

viel spaß damit. verbesserungen nehmen wir natürlich dankend entgegen. besonders die prozessorlast geht schon ordentlich in die höhe! code ist noch lange nicht fertig, wird jetzt auch zeit für die heija!



#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/ioctl.h>


int serial_port_fd = -1;

void Set_signals()
{
int stat_;

if(serial_port_fd == -1)
return;

if(ioctl(serial_port_fd, TIOCMGET, &stat_) == -1)
{
printf("Control signals read\n");
return;
}

//Toggle RTS
if(stat_ & TIOCM_RTS)
stat_ &= ~TIOCM_RTS;
else
stat_ |= TIOCM_RTS;

if(ioctl(serial_port_fd, TIOCMSET, &stat_) == -1)
printf("RTS write\n");

}

int Config_port(void)
{
struct termios termios_p;

//open serial port
serial_port_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

if(serial_port_fd == -1)
return 0;

//read config from port?
tcgetattr(serial_port_fd, &termios_p);

//set baudrate to 38400
termios_p.c_cflag = B38400;

//set 8 data bits
termios_p.c_cflag |= CS8;

//stopbit 1
termios_p.c_cflag &= ~CSTOPB;

//enable receiver
termios_p.c_cflag |= CREAD;

//character size
termios_p.c_cflag &= ~CSIZE;

//some other stuff (?)
termios_p.c_cflag &= ~CRTSCTS;
termios_p.c_cflag &= ~PARENB;
termios_p.c_iflag = IGNPAR | IGNBRK;
termios_p.c_cflag |= CLOCAL;
termios_p.c_oflag = 0;
termios_p.c_lflag = 0;
termios_p.c_cc[VTIME] = 0;
termios_p.c_cc[VMIN] = 1;
tcsetattr(serial_port_fd, TCSANOW, &termios_p);
tcflush(serial_port_fd, TCOFLUSH);
tcflush(serial_port_fd, TCIFLUSH);

return 1;
}

main() {
char buf[255];
int res,i;

if (Config_port()) {
printf("Port opened ...\n");

//toggle RTS, needed to enable serial output on the RP6
Set_signals();

//wait a little time
sleep(2);

//start program uploaded to your rp6.
//be sure to check, if the correct program was uploaded!
write(serial_port_fd, "s", 1);

while(1) {
//read 100 bytes from serial
res = read(serial_port_fd,buf,100);

if (res>1) {
//printf("get %d bytes\n", res);
for (i=0; i<res; i++) { //for all chars in string
printf("%c",buf[i]);
}
}
}

//close serial port
close(serial_port_fd);

}
}

SlyD
12.01.2009, 07:51
//toggle RTS, needed to enable serial output on the RP6

RTS ist beim RP6 eigentlich nur am RESET Pin angeschlossen. Das hat mit Request To Send nix mehr zu tun ;)
Aber wenn Du den eh nicht angeschlossen hast, dann liegt's bei minicom wohl daran das "Hardware Handshake" (oder wie auch immer das bei minicom heisst) aktiviert ist...


Also funktioniert es bei Dir jetzt, andieh?
(weil Du das ja auch in arexx.com Forum gefragt hattest...)

MfG,
SlyD

andieh
12.01.2009, 08:59
Danke SlyD, es läuft!

Keine ahnung, ob das jetzt am RTS lag oder nicht, jedenfalls ging es bei GtkTerm nur, wenn ich eben genau das angeklickt habe. Dank schöner open source Software habe ich dann diesen part aus dem Quellcode kopiert, der dann auch meinem Programm die arbeit ermöglichte!

jetzt geht es wie schon gesagt um die Performance des Systems, irgendwo is da noch der Wurm drin. 100% Prozessorlast geht gar nicht.

SlyD
12.01.2009, 09:23
while(1) {

...

da musst Du auch mal an andere Threads abgeben - im einfachsten fall nen paar ms pause...

andieh
12.01.2009, 10:04
joah das liegt dann aber an dem Non-Blocking-Device, oder? Aber ja, ein paar ms pause könnten nicht schaden, wobei dann die Gefahr der verpassten Pakete schon steigen wird, denke ich mal.

Was aber auf meinem System so viel Last verursacht, ist X und die Konsole, die so viel Output produzieren. Auch nicht schlecht.

Danke soweit!

harm-1
27.02.2009, 15:32
Hallo andieh,

ich habe deinen Code hier an meinem RP6 mit dem USB-Interface eingesetzt. Er tut genau das, was ich seit einigen Versuchen ergenislos probiert hatte. Ich habe probehalber das Toggle-RTS herausgenommen, aber dann funktioniert der Code nicht.

danke für deinen Code

harm-1

andieh
27.02.2009, 16:54
Hey!

Freut mich, das der Code auch bei sonst noch wem funktioniert. Mitlerweile haben wir das Programm aber noch mal ordentlich durchgewürfelt. Sollten wir soweit sein, wird es auf infolexikon.de (http://infolexikon.de) nen ausführlichen Bericht geben!

Mein Robo ist ja schon wieder zurück, da werd ich hoffentlich baldigst mal was auf die Beine stellen!

Grüße
andieh