Перейти к содержанию
    

hello world на usart atxmega

Добрый день, совсем недавно начал осваивать avr axmega, до этого имел дело с arm, решил забабацать hello world с помощью выплевывания строки по usart на терминал брея. В проге ничего нету практически, ошибок нет, однако hello world! на терминалке не наблюдается. Помогите разобраться в чем дело, просто уж хочется добить первую прогу

 

Код

#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;
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот код который работает на асме:

Инициализация

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы используете USARTD0, который использует в PORTD пины 2 и 3, а инициализируете пины 6 и 7. Это то, что я заметил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...