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

Printf in USART on AtMega8 IAR compiler

Ни как не получается заставить 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;

}

#

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


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

Ни как не получается заставить Printf печатать в UART под IAR. Пример брал из ICC компилятора, проверял всё на Proteus, что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо, в реалии в UART симворы не выводит.

вот такой код

....

Я так понимаю в протеусе не заработало.

Rx,Tx к терминалу правильно подключены?

Кварц какой?

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


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

что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо,
Симулятор печатает в терминал находясь в вашей функции putchar или в какой-то своей внутренней? Вы используете компилятор в режиме С или C++?

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


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

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;

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


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

это я пробовал все возможные варианты, часть из 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;

}

post-30423-1198156303_thumb.jpg

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


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

...

Кварц на 7.2326мгц

...

 

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

 

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

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


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

это я пробовал все возможные варианты, часть из ICC компилятора оставил, там так было, здесь это не проходит.

 

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

 

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

 

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

 

Кварц на 7.2326мгц

 

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

 

С УВ.

 

В IAR надо еще определить putchar(), например так:

/***********************************************************************
*  Вывод на USART символа                                              *
***********************************************************************/
int putchar(int c)
    {
    while ( !(UCSRA & (1<<UDRE)) );
    UDR=c;
    return 0;
    }

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


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

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

 

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

 

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

 

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

чтото похожее на это

 

int getchar(void)

{

while ((USR & 0x80) == 0) ;

return UDR;

}

 

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

 

 

 

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

Изменено пользователем west329_

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


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

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

 

Ну на самом деле dimka76 указал на вашу ошибку!

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

 

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

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

 

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

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

 

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

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


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

Ну на самом деле dimka76 указал на вашу ошибку!

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

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

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

 

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

 

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

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


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

Вот пример, проверил, работает без 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");

}

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


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

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

 

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

 

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

 

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

 

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

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


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

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

Вообще-то версий происхождения O.K. больше, чем одна ;)

http://ru.wikipedia.org/wiki/OK

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

http://en.wikipedia.org/wiki/OK

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


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

2 rezident:

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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