Forum: Mikrocontroller und Digitale Elektronik Ständige Receive Complete Feuerung xMega USART


von Hugo H. (jenspeter_t)


Lesenswert?

Hallo,
ich versuche USART-Daten über einen xMega64A3u an meinen PC 
weiterzuleiten.

-Die Daten kommen von einem Sender auf Knopfdruck (921,6 kBaud)
Der Sender ist an PortC/Pin2 angeschlossen.

-Die eben eingegangenen Daten sollen den xMega unverändert zu meinem PC 
über PortE/Pin3 verlassen(115,2 kBaud)

-Ich versuche die USART Beispiele aus AVR1307 entsprechend 
umzuschreiben. Ich habe keinen Hardware Debugger.

Ich sende einmal per Knopfdruck ein paar Bytes vom meinem Sender zum 
xMega und dieser hört dann nicht mehr auf die ISR USARTC0_RXC_vect 
aufzurufen (schickt meinem PC den Buchstaben J). Es hilft nur ein Reset.

Warum ist das so?

Ich habe ein Oszilloskop am Eingang, der Sender schickt nur während des 
Knopfdrucks. Im Ruhezustand liegt am Eingang High an. Das sollte richtig 
sein.
1
#include "usart_driver.h"
2
#include "clksys_driver.h"
3
#include "avr_compiler.h"
4
5
/*! Define that selects the Usart used in example. */
6
#define USARTT USARTE0
7
#define USARTR USARTC0
8
9
/*! USART data struct used in example. */
10
USART_data_t USART_data;
11
12
int main(void)
13
{
14
  //set 16mhz external programmable clock 
15
  CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
16
  false,
17
  OSC_XOSCSEL_EXTCLK_gc );
18
  CLKSYS_Enable( OSC_XOSCEN_bm );
19
  do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
20
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
21
22
  /* PIN3 (TXD0) as output. */
23
  PORTE.DIRSET = PIN3_bm;
24
  /* PC2 (RXD0) as input. */
25
  PORTC.DIRCLR = PIN2_bm;
26
  
27
  
28
  /* Use USARTC0 and initialize buffers. */
29
  USART_InterruptDriver_Initialize(&USART_data, &USARTR,&USARTT,  USART_DREINTLVL_LO_gc);
30
31
  /* USARTC0, 8 Data bits, No Parity, 1 Stop bit. */
32
  USART_Format_Set(&USARTR, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, false);
33
  /* USARTE0, 8 Data bits, No Parity, 1 Stop bit. */
34
  USART_Format_Set(&USARTT, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, false);
35
  
36
  /* Enable RXC interrupt. */
37
  USART_RxdInterruptLevel_Set(&USARTR, USART_RXCINTLVL_LO_gc);
38
39
  //921600 baud
40
  USART_Baudrate_Set(&USARTR, 11 , -7);
41
  //11500 baud
42
  USART_Baudrate_Set(&USARTT, 983 , -7);
43
44
  /* Enable both RX and TX. */
45
  USART_Rx_Enable(&USARTR);
46
  USART_Tx_Enable(&USARTT);  
47
  /* Enable PMIC interrupt level low. */
48
  PMIC.CTRL |= PMIC_LOLVLEX_bm;
49
  sei();
50
  while(true) {
51
  }  
52
}
53
ISR(USARTC0_RXC_vect)
54
{
55
  while (!(USARTE0.STATUS & USART_DREIF_bm));
56
  USARTE0.DATA=0x4a;
57
}

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jens-Peter T. schrieb:
> ISR(USARTC0_RXC_vect)

Wenn du vom USARTC0 Datenbuffer nichts liest, bleibt auch das Flag 
gesetzt.
Also noch ein
1
uint8_t dummy;
2
 dummy = USARTC0.DATA;
in die ISR einfügen.

von Peter D. (peda)


Lesenswert?

Vermutlich so, wie bei den standard AVRs, man muß das Datenbyte lesen.
Aber das sollte ja im Datenblatt stehen.

von Spess53 (Gast)


Lesenswert?

Hi

>  /* PIN3 (TXD0) as output. */
>  PORTE.DIRSET = PIN3_bm;
>  /* PC2 (RXD0) as input. */
>  PORTC.DIRCLR = PIN2_bm;

Wozu? Das wird doch schon mit TXEN und RXEN gemacht:

Manual:

'The receiver will override normal port operation for the RxD pin, when
'enabled.

'The transmitter will override normal port operation for the TxD pin,
'when enabled.

MfG Spess

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.