PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] USART am XMEGA32A4U wird im Simulator von Studio 7 nicht angesprochen



wkrug
09.02.2019, 19:43
Hallo
Ich möchte über einen ATXMEGA32A4U Daten über den USART E0 versenden.

Ich muss dazu sagen, das sind meine ersten Gehversuche mit einem ATXMEGA Controller.

Am Original Controller kann ich leider noch nicht testen, deshalb behelfe ich mir mit dem Simulator des AVR Studio 7 ( Version: 7.0.1417 - ).

Der Controller ist auf 32MHz konfiguriert.

void clock_init (void)
{
OSC.CTRL |= OSC_RC32MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
}

Der USART wurde mit folgendem Code Initialisiert:

void init_usart (void)
{
//Baudrate ( 115200 )
USARTE0.BAUDCTRLA = 1047 & 0xFF;
USARTE0.BAUDCTRLB = ((1047 & 0xF00) >> 0x08);
//Scale Faktor für 115200
USARTE0.BAUDCTRLB |= ((-6 & 0x0F) << 0x04);
//Sender aktivieren
USARTE0.CTRLB = USART_TXEN_bm; // | USART_RXEN_bm für Empfänger Aktivierung
//8Bit
USARTE0.CTRLC = USART_CHSIZE_8BIT_gc;
//Port E TX als Ausgang
PORTE.DIR |= (1<<3);
}
Die Sendung der Bytes im Main Loop schaut so aus:

while(!(USARTE0.STATUS & USART_DREIF_bm))
{
USARTE0.DATA = midibuffer[send_pointer++];
if(send_pointer > bufferlen)
{
send_pointer=0;
}
}
Die while Bedingung wird zwar angesprungen, aber der dahinter stehende Code nie ausgeführt.
Der Grund ist, das im Simulator das Data Register Empty Flag des USART immer auf 1 steht ( USARTE0.STATUS Register Bit 5 ).
Es lässt sich auch nicht manuell ( per Mausklick ) auf 0 setzen.

Ist das ein Bug des Simulators, oder hab ich da irgendwo was falsch initialisiert?

Siro
09.02.2019, 19:58
evtl. hilft das weiter:

https://www.avrfreaks.net/forum/usartdreifbm-after-reset-never-set-pwr-downup-works

seite5
10.02.2019, 07:54
while(!(USARTE0.STATUS & USART_DREIF_bm));
fehlt mindestens 1 Semikolon, wenn das Data Register Empty Flag gesetzt ist, kann das DATA Register beschrieben werden.
mfg
Achim

wkrug
10.02.2019, 08:22
Habs gefunden.
Das DREIF Bit ist gesetzt wenn das DATA Register zur Aufnahme eines Bytes bereit ist.
Deshalb musste der Code lediglich wie folgt geändert werden:

while(USARTE0.STATUS & USART_DREIF_bm)
Also die nicht Anweisung ( ! ) entfernt werden.
Das war in der Beschreibung die Ich hatte leider auch falsch.
Und der Codewizzard von CodeVision AVR macht es leider auch falsch.

Die Rettung war der Link von Siro - Danke dafür!