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
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 ;-)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.