PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 2560 USB UART : nur schreiben, kein lesen, C-Quellcod



sportfreak
27.08.2009, 18:51
Hallo,

ich habe ein RN-2560 module von Roboternetz, also ein kleines Board mit Atmega2560 und USB-Anschluß hat. Diesen Programmiere ich über JTAG, dem AVR-Studio und C-Code.

Mein Ziel ist es über UART (so heißt die Komponenten, die man auf dem Atmega2560 ansprechen muss) auf USB Daten auszugeben und einzulesen. Der erste Teil ist gelungen, denn alle Daten, die ich vom Atmega2560 ausgebe, kommen in meinem Terminalprogramm auf dem PC an. -> also müssen alle Parameter der RS232-Kommunikation auch richtig eingestellt sein??? (Baudrate und so)

Aber leider kann ich über das Terminal (den PC) nicht an den Atmega2560 senden.

Die folgenden Routine, welche so in vielen Foren und im Manual des MC zu finden ist, springt nicht an (die while-schleife wird nie verlassen):


#define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
#define USART_BAUD_RATE 9600

void uart_init()
{
uint16_t ubrr = (F_CPU / (USART_BAUD_RATE * 16L) - 1);

UBRR3H = (uint8_t) (ubrr>>8);
UBRR3L = (uint8_t) (ubrr);

//###### ziel: 8 Datenbits, kein Parity, 1 Stopbit

// UART Receiver und Transmitter anschalten
// Data mode 8N1 (UCSZnx + USBSn), asynchron (UMSELnx)
UCSR3C &= ~((1 << UPM31)&&(1 << UPM30)); //kein Parity
UCSR3C &= ~(1<<USBS3); //1 Stop Bit
UCSR3B |= (1 << RXEN3) | (1 << TXEN3);
UCSR3C |= (1 << UCSZ31) | (1 << UCSZ30); //8-bit
UCSR3C &= ~((1 << UMSEL31)&&(1 << UMSEL30)); //asynchron
}

static inline uint8_t uart_getc_wait()
{
// Warten, bis etwas empfangen wird
while (!(UCSR3A & (1 << RXC3)));

// Das empfangene Zeichen zurückliefern
return UDR3;
}


Da das Senden geht sollte der zur RN-CD mitgelieferte USB-Seriell-treiber korrekt installiert sein, das USB-Kabel funktionieren und der Atmega2560 auch. Somit hab ich leider keine Idee mehr, woran es noch liegen kann. Habe es schon mit zwei verschiedenen PCs ausprobiert.

sportfreak
27.08.2009, 18:57
Ich hab auch keine Idee mehr, wie ich die Kommunikation zwischen dem MC und meinem Windows-Terminal tiefergehend überwachen an, um das Problem zu finden.

Von daher kann ich jetzt nur noch auf eure Hilfe hoffen.

Hubert.G
27.08.2009, 19:15
Hast du schon mal geschaut ob etwas empfangen wird, eine Led anmachen.

sportfreak
27.08.2009, 19:21
Da ich mit JTAG arbeite, habe ich den Code debuggt. Also z.B. eine Breakpoint direkt hinter diese Whileschleife gesetzt und bin mir somit sicher, dass sie nie verlassen wird.

Eine LED ist somit nur eine andere (primitivere ;-) ) Art des Debuggens und das hab ich somit schon getan.

Danke, aber vielleicht gibt es noch andere Ideen?

Hubert.G
27.08.2009, 20:17
Das mit JTAG habe ich überlesen.
Hast du eine Möglichkeit an RXD3 zu prüfen ob dort Daten ankommen?

sportfreak
28.08.2009, 12:28
das Board und die Platine, die ich benutze, sind hier dokumentiert:

http://www.robotikhardware.de/download/rnmega2560.pdf

hier steht auch, wie der USB-UART-Treiber auf dem PCinstalliert wird. Das hab ich so auch getan und es hat genauso funktioniert, wie es dort beschrieben ist.

Der einzigste Unterschied meiner Arbeit zu diesem HowTo-Datasheet ist, dass dort nur mit dem BasCom-compiler rumgespielt wird, den ich nicht nehmen kann (weil ich nur das JTAG habe und das nicht unterstützt wird) ... und es auch nicht möchte.

Außerdem programmiere ich in C, was dort im Datenblatt auch anders ist.

Nun noch zu deiner Frage, ob ich den Port RXD3 beobachten kann:
Ja, das kann ich. Aber das funktioniert schon. Im genannten PDF Seite 34 Schaltplan ist zu sehen, dass das gesamte USB-Modul nur über die beiden Pins TX03 und RX03 kommuniziert. Somit wird über diese beiden Ports ein Protokoll gefahren, welches für Handschakes, Rückmeldungen und anderes bidirektional kommunizieren muss.

Der TX03 und RX03 Port werden also bereits schon beim Senden (vom MC zum PC) vollends "gleichzeitig" benutzt. Es ist also bestimmt nicht so, dass über TX03 alle kommunikation vom MC zum PC läuft und über RX03 nur die gegenläufige. Jede Kommunikationsrichtung (MC->PC, PC->MC) benutzt bestimmt beide Ports gleichzeitig.

Von daher meine ich OHNE explizit auf RX03 beim Senden PC->MC zu sehen, sagen zu können: wenn das Senden von MC zu PC klappt, dann funktionieren die Ports TX03 und RX03 und brauchen keinen weiteren Test.

oder siehst du das anders. Ich lass mich auch gern eines besseren belehren... solange ich nur bald das Problem gelöst bekomme.

Hubert.G
28.08.2009, 13:50
Das RX und TX immer gleichzeitig benutzt werden ist mir neu. Das wäre nur der Fall wenn es z.B. Checksummen Rückmeldungen geben würde.
Ansonsten wird aus Sicht des µC zum Senden nur TX und zum Empfangen nur RX genutzt. Handshake-Leitungen sind im USART nicht vorgesehen, da müsstest du dir einen eigene Routine schreiben.
Wenn du nur Empfängst, kannst du TX ohne weiteres weglassen.
Was auf USB-Seite passiert interessiert den µC überhaupt nicht.

sportfreak
31.08.2009, 09:17
Ich danke für deine Antworten und Hilfe.

Ich denke den Fehler gefunden zu haben: man muss das Handshake deaktivieren.

Es verwundert mich zwar noch immer, warum der Verkehr vom MC zum PC ging, umgekehrt aber nicht... Wenn Handshaking falsch eingestellt ist, dann sollten doch beide Richtungen nicht funktionieren...

..aber egal. Jetzt läuft's.

Danke soweit.