реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Printf in USART on AtMega8 IAR compiler, не получается заставить работать на IAR компиляторе
west329_
сообщение Dec 20 2007, 12:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Ни как не получается заставить 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;
}
#
Go to the top of the page
 
+Quote Post
Странник
сообщение Dec 20 2007, 12:29
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-05-06
Из: Киев
Пользователь №: 16 944



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

Я так понимаю в протеусе не заработало.
Rx,Tx к терминалу правильно подключены?
Кварц какой?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 20 2007, 12:45
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(west329_ @ Dec 20 2007, 14:24) *
что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо,
Симулятор печатает в терминал находясь в вашей функции putchar или в какой-то своей внутренней? Вы используете компилятор в режиме С или C++?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Dec 20 2007, 12:52
Сообщение #4


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(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;


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
west329_
сообщение Dec 20 2007, 13:17
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



это я пробовал все возможные варианты, часть из 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;
}
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
zhevak
сообщение Dec 20 2007, 20:28
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



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


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

В случае использования Вашего кварца разность в частотах составит почти 2%, а это уже где-то на грани устойчивой связи.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
676038
сообщение Dec 21 2007, 04:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070



Цитата(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;
    }
Go to the top of the page
 
+Quote Post
west329_
сообщение Dec 21 2007, 07:01
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



676038 был совершенно прав. оказывается надо определить прототип функции.

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

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

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

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

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



Теперь возник вопрос с кольцевым буфером, посоветуйте чтото по проще, я просто с таким никогда не сталкивался ?? и как его правильно прикрутить ?

Сообщение отредактировал west329_ - Dec 21 2007, 07:13
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Dec 21 2007, 09:00
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



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


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

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

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

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

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

Думаю вам надо немного приостановиться, и до конца разобраться как работает ваш printf!
Go to the top of the page
 
+Quote Post
vesago
сообщение Dec 21 2007, 09:21
Сообщение #10


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Типовой атмеловский пример
Прикрепленные файлы
Прикрепленный файл  USART2.txt ( 4.09 килобайт ) Кол-во скачиваний: 183
 
Go to the top of the page
 
+Quote Post
west329_
сообщение Dec 21 2007, 09:41
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



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

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


Еслиб этот прототип заработал сразу на юарт, я бы наверно не просил помощи.
Go to the top of the page
 
+Quote Post
__nik__
сообщение Dec 23 2007, 20:33
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 52
Регистрация: 30-11-05
Из: С-Пб
Пользователь №: 11 619



Вот пример, проверил, работает без 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");
}
Go to the top of the page
 
+Quote Post
zhevak
сообщение Dec 23 2007, 20:56
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Извините, не в тему!

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

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

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

Надеюсь, никому не досадил своими нравочениями. smile.gif


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 23 2007, 21:34
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Вообще-то версий происхождения O.K. больше, чем одна wink.gif
http://ru.wikipedia.org/wiki/OK
А в англоязычной Википедии можно посмотреть, где в английском употребляется это сочетание
http://en.wikipedia.org/wiki/OK
Go to the top of the page
 
+Quote Post
zhevak
сообщение Dec 23 2007, 22:16
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



2 rezident:
Спасибо, за замечания. На счет точек (О.К.), я, похоже, погорячился. Втречаются и такие написания. Хотя, пройдясь по англоязыной "территории", можно заметить, что в основном используются две формы -- OK и okey. Другие формы ОК тоже бывабт, но они как слово "because" -- как его только ни пишут! -- becose, becoze и даже coz. Это как наше -- "превед медвед!". Чем неправильнее, тем прикольнее. Это особенно проявляется в маркетинге, в поп-музыке, на приватных зашибись-сайтах. Ладно, пожалуй, не важно. Давно уже офф-топ!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016