Forum: Mikrocontroller und Digitale Elektronik USART Empfangs bzw. Sendeproblem


von W. M. (muhh)


Angehängte Dateien:

Lesenswert?

Hey Leute,

habe mal mit dem USART des xmegas rumgespielt und auch schon eine 
Verbindung zum PC herstellen können, doch leider kommen bei mir in HTerm 
immer nur 00 an, wenn ich was an den MC sende.

Wisst ihr woran das liegen kann? Ist die interne Clock vielleicht zu 
ungenau?

Hier der Code:
1
#include <stdint.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
int main(void)
6
{
7
  PORTE.DIR = 0xff;    // LED-Port als Ausgang schalten
8
  PORTE.OUT = 0xff;    // LEDs ausschalten
9
  
10
  cli();          // Globale Interrupts deaktivieren
11
  
12
  USARTC0.BAUDCTRLA = 0x67;              // Baudrate einstellen (19200)
13
  USARTC0.BAUDCTRLB = 0;                // BSEL = 0
14
  USARTC0.CTRLA = USART_RXCINTLVL_HI_gc;        // Receive Interrupt Enable, Interrupt Level High
15
  USARTC0.CTRLC = USART_CHSIZE_8BIT_gc |        // Bit Größe auf 8 Bit stellen
16
          USART_CMODE_ASYNCHRONOUS_gc |    // Asynchroner Modus
17
          USART_PMODE_DISABLED_gc;      // Parity Bit deaktivieren
18
  USARTC0.CTRLB = USART_TXEN_bm | USART_RXEN_bm;    // Transmitt + Receive Enable
19
  PORTC.DIR = 0x08;                  // TxD Pin als Ausgang schalten
20
  
21
  PMIC.CTRL = PMIC_HILVLEN_bm;    // High Level Interrupts aktivieren
22
  sei();                // Globale Interrupts aktivieren
23
  
24
    while(1)
25
    {
26
    PORTE.OUTTGL = 0x01;
27
    }
28
}
29
30
ISR(USARTC0_RXC_vect)
31
{
32
  PORTE.OUTTGL = 0x88;              // wird ISR auch wirklich aufgerufen ?
33
  while (!(USARTC0.STATUS & USART_DREIF_bm));    // Warte bis das Data Register Empty Flag gesetzt ist
34
  USARTC0.DATA = USARTC0.DATA;          // Schreibe den Wert des Receive Buffers gleich wieder in das TX Register
35
}

Ich habe nochmal ein Screenshot von HTerm gemacht, damit ihr seht was 
ich meine.

Viele Grüße

von spontan (Gast)


Lesenswert?

Und wie sieht die Hardware aus????

von Martin V. (oldmax)


Lesenswert?

Hi
Mit einem XMega hab ich noch nicht gearbeitet, aber 19200 Baud beim 
internen Takt, ganz schön optimistisch! Versuch es doch erst einmal mit 
1200, bevor du Speed machst.
Gruß oldmax

von Flash Gordon (Gast)


Lesenswert?

interner takt ... aahhh

von H.Joachim S. (crazyhorse)


Lesenswert?

Quatsch, daran liegt es nicht.
Es würden zwar Fehler auftreten, aber nicht dauerhaft ne Null 
zurückgesendet.

von W. M. (muhh)


Lesenswert?

@spontan:
Also die Hardware ist ein Atmel XMega 128A1 auf einem Atmel ATXMega 
xplained A1 Board

@Martin:
Haha, okay, ich schraube mal die Baudrate runter ;)

von Karl H. (kbuchegg)


Lesenswert?

Für 20 gesendete Zeichen hast du 80 Zeichen Echo.
Da musst du aber ordentlich daneben sein.

Was komisch ist: das da immer 0 zurück kommt. Das ist untypisch.

Pegel verkehrt rum? gehst du mit einer TTL-Seriellen auf den Seriellen 
Eingang vom PC? Ist da ein RS232-USB Konverter im Spiel?

von Karl H. (kbuchegg)


Lesenswert?

> USARTC0.BAUDCTRLA = 0x67;              // Baudrate einstellen (19200)

Mit solchen Dingen hab ich wenig Freude. Das lässt sich so herrlich ohne 
Datenblatt überhaupt nicht nachvollziehen, wie die zustande kommen und 
welches die Bestimmungsgrößen sind.

von W. M. (muhh)


Angehängte Dateien:

Lesenswert?

Okay, anscheinend bin ich wirklich zu optimistisch gewesen ;) Mit 1200 
Baud gehts einigermaßen, oft kommen die Zeichen aber noch falsch an

@Karl:

Der Wert der in USARTC0.CTRLA geschrieben wird, brechnet sich wie folgt 
(mit BSCALE = 0):

Im Anhang nochmal ein Screenshot von 1200 Baud.
Ist nicht ganz das was zurückkommen sollte, aber schon mal besser als 
vorher :D

: Bearbeitet durch User
von W. M. (muhh)


Lesenswert?

Okay, das Problem hat sich damit dann auch erledigt, ich hatte mit 32MHz 
Clock gerechnet, eingestellt waren aber 2MHz -.-

Jetzt übertrage ich sogar mit 115,2k baud mit einem Fehler von -0.1% :)

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.