XMega - USART Pins geben kein Signal aus

OP #4036622
Lesenswert?
• ▲
▼
Hallo,

ich arbeite gerade an einer Implementierung mit einem AtXmega128A1.

Dieser soll Rückmeldungen an einen PC über die UART-Schnittstelle und 
dem Pegelwandler MAX3232, der +3,3V Pegel in +12/-12V-Pegel wandelt, 
geben.

Ich arbeite mit dem Terminal HTerm und einer Baudrate von 115200bd, 8bit 
Daten und 1 Stopbit;
Mein Systemtakt beträgt 32MHz.

Nun zur Situation: Wenn ich an PORTD die Pins als Output konfiguriere, 
funktionieren diese einwandfrei. Sobald er aber als UART eingestellt 
wird und mit der entsprechenden Funktion aufgerufen wird, gibt dieser 
Pin kein Signal raus(mit Oszi nachgemessen).

Jetzt ist folgende Frage: hab ich etwas falsch initialisiert oder geb 
ich das ganze falsch aus?

Da ich neu im Forum bin, bin ich mir nicht sicher, ob ich Quell-Code als 
ZIP mit anhängen darf.
Gerne gebe ich ihn auf Anfrage frei.

Grüße Fabian
(Firma: matzetronics)
Lesenswert?
• ▲
▼
Das kann z.B. so aussehen:
1
// serial port setup
2
 // Serial Comm. Speed   
3
 // 51 = 19200 baud
4
 //   
5
#define BSEL_VALUE 51
6
#define USART USARTF0
7
#define USART_PORT PORTF
8
#define TXD_PIN PIN3_bm
9
#define RXD_PIN PIN2_bm
10
static void USARTInit(void)
11
{
12
  USART_PORT.DIRSET   = TXD_PIN;   // Pin 3 (TXD0) as output.
13
  USART_PORT.DIRCLR   = RXD_PIN;   // Pin 2 (RXD0) as input.
14
  // USARTD0, 8 Data bits, No Parity, 1 Stop bit
15
  USART.CTRLC = (uint8_t) USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc | false;
16
   /* Target: Internal RC 32MHz (default) 
17
    * Example (19200bps)  :   - I/O clock = 16MHz
18
   *                        - UBRR = 16MHz/(16*19200)-1 = 51
19
   *                        - ScaleFactor = 0
20
  */  
21
  USART.BAUDCTRLA = BSEL_VALUE;
22
  // Enable both RX and TX
23
  USART.CTRLB |= USART_RXEN_bm;
24
  USART.CTRLB |= USART_TXEN_bm;
25
}
OP
Lesenswert?
• ▲
▼
Vielen Dank für eure zahlreichen Tipps.
Ich hab leider vor lauter Bäumen den Wald nicht mehr gesehen..
Die Konfiguration der BAUDCTRL-Register ist richtig und wurde auch 
korrekt berechnet.
Nur habe ich, wie von Moby Beschrieben, den Pin nicht als Ausgang 
konfiguriert. Dabei bin ich davon ausgegangen, dass es sich bei meinem 
Makro TXDMASK in der .h-Datei um eine Bitposition ähnlich zu "PIN2_bp" 
handelt. Dementsprechend habe ich auch im Initialisierungscode eine 
Schiebe-Operation durchgeführt.
Allerdings lautete das Makro "#define TXDMASK (1<<3)" und somit 
übersetzte der Präprozessor daraus den Code in der .c-Datei zu 
"USART_PORT.DIRSET   = 1<<(1<<3)", was natürlich nicht zum gewünschten 
Ergebnis führt.
Ich hab dies schleunigst geändert und das Makro zu "#define  TXD_bp  3" 
geändert.

Ich bedanke mich bei euch nochmal und erklärt das Problem als gelöst :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.