|
Printf in USART on AtMega8 IAR compiler, не получается заставить работать на IAR компиляторе |
|
|
|
Dec 20 2007, 12:29
|

Участник

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

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

Местный
  
Группа: Свой
Сообщений: 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; }
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 20 2007, 20:28
|

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

|
Цитата(west329_ @ Dec 20 2007, 18:17)  ... Кварц на 7.2326мгц ... должно быть 7.3728 МГц В случае использования Вашего кварца разность в частотах составит почти 2%, а это уже где-то на грани устойчивой связи.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Dec 21 2007, 04:15
|
Участник

Группа: Участник
Сообщений: 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; }
|
|
|
|
|
Dec 21 2007, 07:01
|

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

|
676038 был совершенно прав. оказывается надо определить прототип функции. Ох уж эти платформеннонезависымые языки программирования. Да с кварцем я погарячился, память подвела  теперь всё заработало. Это теперь по аналогии надо наверно и прототим GetChar прописать чтото похожее на это int getchar(void) { while ((USR & 0x80) == 0) ; return UDR; } только наверно надо getchar к прерыванию по RX подвязать ??? или как тогда эта процедура будет вызыватся, или она у них в библиотеках IAR уже гдето сидит ?? Теперь возник вопрос с кольцевым буфером, посоветуйте чтото по проще, я просто с таким никогда не сталкивался ?? и как его правильно прикрутить ?
Сообщение отредактировал west329_ - Dec 21 2007, 07:13
|
|
|
|
|
Dec 21 2007, 09:00
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата(west329_ @ Dec 21 2007, 10:01)  676038 был совершенно прав. оказывается надо определить прототип функции. Ну на самом деле dimka76 указал на вашу ошибку! Прототип в самом IAR прописан, просто если компилятор встречает описание функции, соотв. прототипу из библиотеки, то он уже берет не библиотечную функцию, а пользовательскую. Цитата Ох уж эти платформеннонезависымые языки программирования. Не до конца разбираясь в сути, эту фразу можно употреблять для любой области знаний  Цитата только наверно надо getchar к прерыванию по RX подвязать ??? или как тогда эта процедура будет вызыватся, или она у них в библиотеках IAR уже гдето сидит ?? Всё точно также как и c putchar. Putchar вызывается из printf, а getchar из scanf. Вы же не привязывали putchar к прерыванию! Думаю вам надо немного приостановиться, и до конца разобраться как работает ваш printf!
|
|
|
|
|
Dec 21 2007, 09:41
|

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

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

Группа: Свой
Сообщений: 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"); }
|
|
|
|
|
Dec 23 2007, 20:56
|

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

|
Извините, не в тему! Слишком часто в жизни встречаю неправильное использование "ОК". Поэтому неудержался и поправляю. 1. Один немец-перец в начале 19-го века иммигрировал в США. Устроился каким-то клерком, в какую-то шарагу. Работа его заключалась в проверке каких-то бумаг, на которых он должен был ставить свою резолюцию. По английски резолюция звучала так "All correct" (т.е. "Все нормально"). Но поскольку, это был не чистый англоговрящий чувак, а немец, то "Олл-Коррэкт" он так и писал сокращенно - "ОК". (Т.е, уважаемый __nik__, в самой аббревиатуре ОК слово "All" уже присутствует.) Америкосам (видимо, там тоже были свои подонки) понравилось это ОК, и они его просто растиражировали на все сферы деятельности. Потом это ОК расползлось по всему свету. 2. ОК -- всегда пишется большими буквами, без точек. Это правило. Поосто примем его, как постулат, и все! -- Is it OK? Надеюсь, никому не досадил своими нравочениями.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Dec 23 2007, 22:16
|

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

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