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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hugo H. (jenspeter_t)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


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

von Spess53 (Gast)


Bewertung
1 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.