Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: hello world на usart atxmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Tapochka
Добрый день, совсем недавно начал осваивать avr axmega, до этого имел дело с arm, решил забабацать hello world с помощью выплевывания строки по usart на терминал брея. В проге ничего нету практически, ошибок нет, однако hello world! на терминалке не наблюдается. Помогите разобраться в чем дело, просто уж хочется добить первую прогу

Код
CODE
#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>


static int usart_putchar (char data, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE);
void delay();
void initall();

void delay(uint32_t i)
{
while(i) i--;
}

int main(void)
{
cli();
initall();
sei();
stdout = &mystdout;
while(1)
{
printf('Hello world\n');
delay(0xFFFF);
}
}

void initall(void)
{
PORTD.DIR|=1<<7; //высокий уровень на TXD1, 7 нога
PORTD.OUT=0xA0; //TXD1 и XCK1 высокий логический уровни
USARTD0.CTRLC= USART_PMODE1_bm | USART_CHSIZE0_bm | USART_CHSIZE1_bm; //разрешен четный паритет, по 8 бит, стоп-бит 1
USARTD0.CTRLB= USART_TXEN_bm; //включен передатчик
USARTD0.BAUDCTRLA=0x91; // BSEL = 401
USARTD0.BAUDCTRLB=0xC1; // BSCALE = -4, Реальная скорость ~115200
}

int usart_putchar(char data, FILE *stream)
{
if (data=='\n') usart_putchar('\r', stream); //для терминала bray
else
{
while (!(USARTD0.STATUS & (USART_TXCIF_bm))) //пока флаг TXCIF не равен единице
USARTD0.DATA = data;
}
return 0;
}
Fusion
Вот код который работает на асме:
Инициализация
Код
USART_init:
;***************** USART PortC0 (PC) ****************
        ldi temp, 3<<USART_RXCINTLVL_gp
        sts USARTC0_CTRLA, temp
        ldi temp, 1<<USART_RXEN_bp | 1<<USART_TXEN_bp
        sts USARTC0_CTRLB, temp
        ldi temp, 3<<USART_CHSIZE_gp
        sts USARTC0_CTRLC, temp
        ldi temp, 51
                ;207            ; 9600
                ;51            ; 38400        BSEL = (OSC/16)/BAUD - 1

        sts USARTC0_BAUDCTRLA, temp

        ldi temp, 1<<PMIC_LOLVLEN_bp | 1<<PMIC_MEDLVLEN_bp | 1<<PMIC_HILVLEN_bp
        sts PMIC_CTRL, temp
        ret

Вывод
Код
TransmitPC:
    push temp
        sts USARTC0_DATA, temp
Wait_TransmitPC:
        lds temp, USARTC0_STATUS
        sbrs temp, 5        ; SPIF
        rjmp Wait_TransmitPC
    pop temp
ret


Хмега тактируется 32 МГц
Код
    ldi temp,OSC_RC32MEN_bm        ; switch to 32 MHZ
    sts OSC_CTRL,temp
    lds temp,OSC_STATUS
    sbrs temp,1
    rjmp PC-3
    ldi temp,CCP_IOREG_gc
    out CPU_CCP,temp
    ldi temp,CLK_SCLKSEL_RC32M_gc
    sts CLK_CTRL,temp

Настраиваем порт
Код
        ldi temp, 0b00001000        ;  -   -   -   - TXD RXD    -   -
        sts PORTC_DIR, temp        ;  I   I    I   I   O      I        I   I
Tapochka
спасибо за ответ, но в моей проге что не так все же хотелось бы узнать)
piroman
Вы используете USARTD0, который использует в PORTD пины 2 и 3, а инициализируете пины 6 и 7. Это то, что я заметил.
Tapochka
да, я это тоже заметил, исправил, не помогло)
Tapochka
мда, заработало: вместо TXCIF поставил DREIF, и после while запятая не стояла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.