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.
Code:
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:
Code:
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:
Code:
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?
Lesezeichen