Forum: Mikrocontroller und Digitale Elektronik USART Atxmega128A1 X-Plained


von Matthias L. (mcl024)


Lesenswert?

Hallo Zusammen,

ich benutzte folgenden Code zum Initialisieren und Senden der USART 
Schnittstelle:
1
void USART_Init(void)
2
{
3
  PORTD.OUTSET |= PIN3_bm; // Für den Transmitter
4
  PORTD.DIRSET |= PIN3_bm; //     "
5
  PORTD.DIRCLR |= PIN2_bm; // Für den Reciver
6
  //keine Clockconfig--> int. 2MHz Takt nutzen --> BSEL = 12 für 9600baud
7
  USARTD0.BAUDCTRLA = 12;
8
  // 8bit UART, no parity, 1 stopbit
9
  USARTD0.CTRLC |= USART_CMODE_ASYNCHRONOUS_gc|USART_CHSIZE_8BIT_gc;
10
  // Receiver einschalten
11
  USARTD0.CTRLB |= USART_RXEN_bm;
12
}
13
14
void usart_transmit(uint8_t temp)
15
{
16
  USARTD0.DATA = temp;
17
  while (!(USARTD0.STATUS & USART_TXCIF_bm));
18
}

Leite RX und TX über einen RS232 Spannungwandler auf meine Serielle 
Schnittstelle vom PC. Benutze unter Linux HTERM. Aber es tut sich 
nichts.

von Matthias L. (mcl024)


Lesenswert?

Ich habe jetzt mal mit dem Oszi die PINs RX und TX angeschaut. Aber da 
tut sich gar nicht. Ist die Initialieserung falsch?

von Gerhard G. (xmega)


Lesenswert?

Hallo,

srtze mal die Ports so..

Matthias Laubnitz schrieb:



> PORTD.OUTSET = PIN3_bm; // Für den Transmitter
> PORTD.DIRSET = PIN3_bm; //     "
> PORTD.DIRCLR = PIN2_bm; // Für den Reciver

..SER ..CLR fordern kein |=

PORTD.OUT |= PIN3_bm; z.B braucht |=


Gruß Xmega

von Matthias L. (mcl024)


Lesenswert?

Leider tut sich nach der Änderung immer noch nichts.

von Simon A. (testnetz)


Lesenswert?

Der Atxmega läuft mit 3,3 der Max232 mit 5 V ich glaube du benötigst 
einen Max3232

von Matthias L. (mcl024)


Lesenswert?

Ok jetzt habe ich es.

USARTD0.CTRLB |= USART_TXEN_bm;

bringt den Erfolg!

Allerdings messe ich jetzt eine Frequenz von 75,7kHz

von Simon A. (testnetz)


Lesenswert?

Wo misst du das Signal mit dem Oszi?

von Matthias L. (mcl024)


Lesenswert?

Mein Oszillator ist folgendermaßen eingestellt:
1
void Oszilator_Init(void)
2
{
3
  /*Oscillator auf 32Mhz einstellen PIN1 = OSC_RC32MEN wird gesetzt */
4
  OSC.CTRL |= 0x02;
5
  /*Wenn Oscillator stabil wird das Flag RC32MRDY
6
  * gesetzt und 32Mhz können benutzt werden*/
7
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
8
  /*I/O Protection*/
9
  CCP = 0xD8;
10
  /*Clock auf 32Mhz einstellen*/
11
  CLK.CTRL = 0x01;
12
}

Auf was steht jetzt Fper?

von Matthias L. (mcl024)


Lesenswert?

Simon A. schrieb:
> Wo misst du das Signal mit dem Oszi?

Direkt am TX Pin. Also PD3.

von Matthias L. (mcl024)


Lesenswert?

Ok jetzt habe ich es. Fper steht auch auf 32MHz und somit ergibt sich 
für eine Baudrate von 9600 ein Wert für BSEL = 207 wenn BSCALE = 0.

Danke für eure Unterstützung

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.