Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Printf in USART on AtMega8 IAR compiler
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
west329_
Ни как не получается заставить Printf печатать в UART под IAR. Пример брал из ICC компилятора, проверял всё на Proteus, что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо, в реалии в UART симворы не выводит.



вот такой код


#
#define ENABLE_BIT_DEFINITIONS

#include <iom8.h>
#include <inavr.h>

#include <stdio.h>

//extern int _textmode;


int putchar(int c)
{
// if (_textmode && c == '\n')
putchar('\r');
//while ((USR & 0x20) == 0) // UDRE, data register empty
// ;
while ( !( UCSRA & (1<<UDRE)) );

UDR = c;
return c;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0,0%)
/*
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
//UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x2F; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}*/


void uart0_init(void)
{
/* Set baud rate */
UBRRH = 0x00;
UBRRL = 0x2F;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}


int main( void )
{
uart0_init();
while(1)
{
putchar('1');
printf("dcvjkxcznhkvxncv");
}

return 0;
}
#
Странник
Цитата(west329_ @ Dec 20 2007, 16:24) *
Ни как не получается заставить Printf печатать в UART под IAR. Пример брал из ICC компилятора, проверял всё на Proteus, что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо, в реалии в UART симворы не выводит.
вот такой код
....

Я так понимаю в протеусе не заработало.
Rx,Tx к терминалу правильно подключены?
Кварц какой?
Сергей Борщ
Цитата(west329_ @ Dec 20 2007, 14:24) *
что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо,
Симулятор печатает в терминал находясь в вашей функции putchar или в какой-то своей внутренней? Вы используете компилятор в режиме С или C++?
dimka76
Цитата(west329_ @ Dec 20 2007, 15:24) *
int putchar(int c)
{
// if (_textmode && c == '\n')
putchar('\r');
//while ((USR & 0x20) == 0) // UDRE, data register empty
// ;
while ( !( UCSRA & (1<<UDRE)) );

UDR = c;
return c;
}


Вы в функции int putchar(int c) вызываете putchar('\r'); т.е. саму себя и происходит зацикливание не дойдя до строчки UDR = c;
west329_
это я пробовал все возможные варианты, часть из ICC компилятора оставил, там так было, здесь это не проходит.

Вот немного подчистил, всёравно не работает.

Использую С (Сlib).

Рисунок в протеусе прикрепил.

Кварц на 7.2326мгц

Если есть у когото рабочая Printf под IAR пожалуйса выложите.

С УВ.




#define ENABLE_BIT_DEFINITIONS

#include <iom8.h>
#include <inavr.h>

#include <stdio.h>




void uart0_init(void)
{
/* Set baud rate */
UBRRH = 0x00;
UBRRL = 0x2F;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}


int main( void )
{
uart0_init();
while(1)
{
putchar('1');
printf("dcvjkxcznhkvxncv");
}

return 0;
}
zhevak
Цитата(west329_ @ Dec 20 2007, 18:17) *
...
Кварц на 7.2326мгц
...


должно быть 7.3728 МГц

В случае использования Вашего кварца разность в частотах составит почти 2%, а это уже где-то на грани устойчивой связи.
676038
Цитата(west329_ @ Dec 20 2007, 18:17) *
это я пробовал все возможные варианты, часть из ICC компилятора оставил, там так было, здесь это не проходит.

Вот немного подчистил, всёравно не работает.

Использую С (Сlib).

Рисунок в протеусе прикрепил.

Кварц на 7.2326мгц

Если есть у когото рабочая Printf под IAR пожалуйса выложите.

С УВ.


В IAR надо еще определить putchar(), например так:
Код
/***********************************************************************
*  Вывод на USART символа                                              *
***********************************************************************/
int putchar(int c)
    {
    while ( !(UCSRA & (1<<UDRE)) );
    UDR=c;
    return 0;
    }
west329_
676038 был совершенно прав. оказывается надо определить прототип функции.

Ох уж эти платформеннонезависымые языки программирования.

Да с кварцем я погарячился, память подвела wink.gif

теперь всё заработало. Это теперь по аналогии надо наверно и прототим GetChar прописать
чтото похожее на это

int getchar(void)
{
while ((USR & 0x80) == 0) ;
return UDR;
}

только наверно надо getchar к прерыванию по RX подвязать ??? или как тогда эта процедура будет вызыватся, или она у них в библиотеках IAR уже гдето сидит ??



Теперь возник вопрос с кольцевым буфером, посоветуйте чтото по проще, я просто с таким никогда не сталкивался ?? и как его правильно прикрутить ?
_Sam_
Цитата(west329_ @ Dec 21 2007, 10:01) *
676038 был совершенно прав. оказывается надо определить прототип функции.


Ну на самом деле dimka76 указал на вашу ошибку!
Прототип в самом IAR прописан, просто если компилятор встречает описание функции, соотв. прототипу из библиотеки, то он уже берет не библиотечную функцию, а пользовательскую.

Цитата
Ох уж эти платформеннонезависымые языки программирования.

Не до конца разбираясь в сути, эту фразу можно употреблять для любой области знанийsmile.gif

Цитата
только наверно надо getchar к прерыванию по RX подвязать ??? или как тогда эта процедура будет вызыватся, или она у них в библиотеках IAR уже гдето сидит ??

Всё точно также как и c putchar. Putchar вызывается из printf, а getchar из scanf. Вы же не привязывали putchar к прерыванию!

Думаю вам надо немного приостановиться, и до конца разобраться как работает ваш printf!
vesago
Типовой атмеловский пример
west329_
Цитата(_Sam_ @ Dec 21 2007, 13:00) *
Ну на самом деле dimka76 указал на вашу ошибку!
Прототип в самом IAR прописан, просто если компилятор встречает описание функции, соотв. прототипу из библиотеки, то он уже берет не библиотечную функцию, а пользовательскую.
Не до конца разбираясь в сути, эту фразу можно употреблять для любой области знанийsmile.gif
Всё точно также как и c putchar. Putchar вызывается из printf, а getchar из scanf. Вы же не привязывали putchar к прерыванию!

Думаю вам надо немного приостановиться, и до конца разобраться как работает ваш printf!


Еслиб этот прототип заработал сразу на юарт, я бы наверно не просил помощи.
__nik__
Вот пример, проверил, работает без stdio выдает варнинг

#include <inavr.h>
#include <ioavr.h>

#define FOSC 7372800
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
#include <stdlib.h>
#include <stdio.h>
#include <ISO646.H>

int putchar(int ch)
{
while ( !( UCSRA & (1<<UDRE)) )
;
// Put data into buffer, sends the data
UDR = ch;
return ch;
}

void USART_Init( unsigned int ubrr)
{
// Enable receiver and transmitter
// UCSR0B = (1<<RXEN0)|(1<<TXEN0);
// Set frame format: 8data, 2stop bit
// UCSR0C = (1<<USBS0)|(3<<UCSZ00);
UCSRB=0x18;
UCSRC=0x06;
// Set baud rate
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
}


__C_task void main( void )
{
USART_Init(MYUBRR);
printf("All ok");
}
zhevak
Извините, не в тему!

Слишком часто в жизни встречаю неправильное использование "ОК". Поэтому неудержался и поправляю.

1. Один немец-перец в начале 19-го века иммигрировал в США. Устроился каким-то клерком, в какую-то шарагу. Работа его заключалась в проверке каких-то бумаг, на которых он должен был ставить свою резолюцию. По английски резолюция звучала так "All correct" (т.е. "Все нормально"). Но поскольку, это был не чистый англоговрящий чувак, а немец, то "Олл-Коррэкт" он так и писал сокращенно - "ОК". (Т.е, уважаемый __nik__, в самой аббревиатуре ОК слово "All" уже присутствует.) Америкосам (видимо, там тоже были свои подонки) понравилось это ОК, и они его просто растиражировали на все сферы деятельности. Потом это ОК расползлось по всему свету.

2. ОК -- всегда пишется большими буквами, без точек. Это правило. Поосто примем его, как постулат, и все! -- Is it OK?

Надеюсь, никому не досадил своими нравочениями. smile.gif
rezident
Цитата(zhevak @ Dec 24 2007, 01:56) *
Надеюсь, никому не досадил своими нравочениями. smile.gif

Вообще-то версий происхождения O.K. больше, чем одна wink.gif
http://ru.wikipedia.org/wiki/OK
А в англоязычной Википедии можно посмотреть, где в английском употребляется это сочетание
http://en.wikipedia.org/wiki/OK
zhevak
2 rezident:
Спасибо, за замечания. На счет точек (О.К.), я, похоже, погорячился. Втречаются и такие написания. Хотя, пройдясь по англоязыной "территории", можно заметить, что в основном используются две формы -- OK и okey. Другие формы ОК тоже бывабт, но они как слово "because" -- как его только ни пишут! -- becose, becoze и даже coz. Это как наше -- "превед медвед!". Чем неправильнее, тем прикольнее. Это особенно проявляется в маркетинге, в поп-музыке, на приватных зашибись-сайтах. Ладно, пожалуй, не важно. Давно уже офф-топ!
west329_
Это форум по английскому языку ????
_Sam_
Цитата
Еслиб этот прототип заработал сразу на юарт, я бы наверно не просил помощи.

Вы так и не поняли в чем разница между объявлением функции и её прототипом.

676038 вам сказал, что надо объявить putchar. Но она у вас и была уже объявлена! Ошибка была в самой функции, а не в её объявлении!

Вам же по-русски было написано:
Цитата
Вы в функции int putchar(int c) вызываете putchar('\r'); т.е. саму себя и происходит зацикливание не дойдя до строчки UDR = c;


Внимательней надо быть к ответам! smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.