Forum: Mikrocontroller und Digitale Elektronik XMega - USART Pins geben kein Signal aus


von Fabian H. (nasenbaerexpress)


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

von Moby (Gast)


Lesenswert?

Fabian Holl schrieb:
> Nun zur Situation: Wenn ich an PORTD die Pins als Output konfiguriere,
> funktionieren diese einwandfrei.

Werf noch mal nen Blick ins Manual, Thema UART-Initialisierung...
Dazu gehört eben, TXD als Output zu konfigurieren ;-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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
}

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Hallo,

du solltest dir mal die Einstellung der Baudrate noch mal anschauen, da 
gibts 2 Register und mit deinem Wert komme ich auf ca. 38400Bd.

Sascha

von Fabian H. (nasenbaerexpress)


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 :)

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.