USART Empfangs bzw. Sendeproblem

OP #3345527
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
Angehängte Dateien:
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?
> 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.
OP
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.