Моделирование AVR XMEGA USART

Используя приведенный ниже тестовый код, я пытаюсь отправить данные через USART из xmega128a3u, используя simulator из Atmel Studio.. Наблюдая за представлением ввода-вывода, регистр данных никогда не устанавливается, хотя я его устанавливаю. Что-то не так с моим кодом или симулятором или что?

#include <avr/io.h>
#include <avr/interrupt.h>

#define bscale 0
#define bsel 0x0003 //250kbps
#define packetFormat (USART_SBMODE_bm | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc)


uint8_t n;

int main(void)
{
    //ALLOW PORTB AND PORTF TO BE WRITTEN TO! TURNS OFF JTAG
    CCP = 0xD8; //Allow Protected IO changing
    MCU_MCUCR = 0x1;

    //CRYSTAL SETUP
    OSC_XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; // 16Mhz Crystal
    OSC_CTRL |= OSC_XOSCEN_bm;
    while(!(OSC_STATUS & OSC_XOSCRDY_bm)); //Wait for crystal to stabilize.
    CCP = CCP_IOREG_gc;
    CLK_CTRL = CLK_SCLKSEL_XOSC_gc;
    //END CRYSTAL SETUP


    cli();


    //Enable Interrupts
    USARTF0.CTRLA = USART_TXCINTLVL_LO_gc | USART_DREINTLVL_LO_gc;

    //Enable transmitter
    USARTF0.CTRLB = USART_TXEN_bm;

    PMIC.CTRL |= PMIC_LOLVLEX_bm;

    //Set baud
    USARTF0.BAUDCTRLB = bscale;
    USARTF0.BAUDCTRLA = bsel;

    //Set packet format
    USARTF0.CTRLC = packetFormat;

    sei();

    while (1) 
    {
        if(n < 255) {
            USARTF0.DATA  = n;

        } else {
            n = 0;  
        }
    }
}

ISR(USARTF0_TXC_vect) {
    n++;
}

ISR(USARTF0_DRE_vect) {
    n++;
}

введите здесь описание изображения


person bwoogie    schedule 30.10.2015    source источник
comment
Вероятно, в этом случае вам следует сделать n volatile, так как есть очень большая вероятность, что компилятор не увидит код ISR и, следовательно, оптимизирует ветвь if(n < 255), потому что n не изменяется в этой части кода.   -  person shuttle87    schedule 30.10.2015


Ответы (1)


Обновляются ли другие регистры, только не ДАННЫЕ? Если нет, убедитесь, что вы включили часы для USART. Многие микропроцессоры также используют один регистр DATA для чтения и записи. Таким образом, попытка прочитать регистр DATA после записи (т. е. представление отладки выполняет чтение) ничего не вернет, если данные не были получены. Таким образом, вы, вероятно, увидите такое же поведение, даже если будете выполнять его на оборудовании.

Тем не менее, по моему опыту, симулятор в Atmel Studio не очень хорошо имитирует прерывания или работу периферийных устройств.

Редактировать, чтобы включить информацию из комментариев ниже: Поскольку вы не можете прочитать то, что вы только что записали в регистр DATA, проверка флага DREIF в регистре STATUS сразу после записи данных подтвердит, действительно ли данные передаются.

person CodingHero    schedule 30.10.2015
comment
Да, другие регистры обновляются. Я добавил скриншот. - person bwoogie; 30.10.2015
comment
ХОРОШО. Я просмотрел руководство для xmega128A3U, и регистр DATA для USART выполняет двойную функцию: когда вы записываете в него, он копирует этот символ в свой сдвиговый регистр передачи, а когда вы читаете, он считывает полученные данные. Таким образом, всякий раз, когда вы записываете данные в регистр для передачи, вы не сможете прочитать их обратно. Попробуйте проверить флаг DREIF в регистре USART STATUS сразу после записи в DATA. Это должно указать, отправляются ли данные или нет, хотя я не уверен, насколько хорошо симулятор покажет это. - person CodingHero; 30.10.2015
comment
Да, флаг DREIF установлен. Я попробовал код на реальном чипе, и все сработало. Таким образом, симулятор не может отображать значение регистра данных. - person bwoogie; 31.10.2015
comment
Хорошо, что это всего лишь симулятор. Если это отвечает на ваш вопрос, я был бы признателен, если бы вы отметили мой ответ выше как принятый. - person CodingHero; 31.10.2015