Tapochka 0 14 января, 2014 Опубликовано 14 января, 2014 (изменено) · Жалоба Добрый день, совсем недавно начал осваивать 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; } Изменено 14 января, 2014 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fusion 0 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба Вот код который работает на асме: Инициализация 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 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба спасибо за ответ, но в моей проге что не так все же хотелось бы узнать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба Вы используете USARTD0, который использует в PORTD пины 2 и 3, а инициализируете пины 6 и 7. Это то, что я заметил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tapochka 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба да, я это тоже заметил, исправил, не помогло) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tapochka 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба мда, заработало: вместо TXCIF поставил DREIF, и после while запятая не стояла Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться