west329 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Ни как не получается заставить 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; } # Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Странник 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Ни как не получается заставить Printf печатать в UART под IAR. Пример брал из ICC компилятора, проверял всё на Proteus, что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо, в реалии в UART симворы не выводит. вот такой код .... Я так понимаю в протеусе не заработало. Rx,Tx к терминалу правильно подключены? Кварц какой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба что самое интересное IAR в своём симуляторе C-SPY печатает в терминал как надо,Симулятор печатает в терминал находясь в вашей функции putchar или в какой-то своей внутренней? Вы используете компилятор в режиме С или C++? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба 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 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба это я пробовал все возможные варианты, часть из 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 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба ... Кварц на 7.2326мгц ... должно быть 7.3728 МГц В случае использования Вашего кварца разность в частотах составит почти 2%, а это уже где-то на грани устойчивой связи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
676038 0 21 декабря, 2007 Опубликовано 21 декабря, 2007 · Жалоба это я пробовал все возможные варианты, часть из ICC компилятора оставил, там так было, здесь это не проходит. Вот немного подчистил, всёравно не работает. Использую С (Сlib). Рисунок в протеусе прикрепил. Кварц на 7.2326мгц Если есть у когото рабочая Printf под IAR пожалуйса выложите. С УВ. В IAR надо еще определить putchar(), например так: /*********************************************************************** * Вывод на USART символа * ***********************************************************************/ int putchar(int c) { while ( !(UCSRA & (1<<UDRE)) ); UDR=c; return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 21 декабря, 2007 Опубликовано 21 декабря, 2007 (изменено) · Жалоба 676038 был совершенно прав. оказывается надо определить прототип функции. Ох уж эти платформеннонезависымые языки программирования. Да с кварцем я погарячился, память подвела ;) теперь всё заработало. Это теперь по аналогии надо наверно и прототим GetChar прописать чтото похожее на это int getchar(void) { while ((USR & 0x80) == 0) ; return UDR; } только наверно надо getchar к прерыванию по RX подвязать ??? или как тогда эта процедура будет вызыватся, или она у них в библиотеках IAR уже гдето сидит ?? Теперь возник вопрос с кольцевым буфером, посоветуйте чтото по проще, я просто с таким никогда не сталкивался ?? и как его правильно прикрутить ? Изменено 21 декабря, 2007 пользователем west329_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Sam_ 0 21 декабря, 2007 Опубликовано 21 декабря, 2007 · Жалоба 676038 был совершенно прав. оказывается надо определить прототип функции. Ну на самом деле dimka76 указал на вашу ошибку! Прототип в самом IAR прописан, просто если компилятор встречает описание функции, соотв. прототипу из библиотеки, то он уже берет не библиотечную функцию, а пользовательскую. Ох уж эти платформеннонезависымые языки программирования. Не до конца разбираясь в сути, эту фразу можно употреблять для любой области знаний:) только наверно надо getchar к прерыванию по RX подвязать ??? или как тогда эта процедура будет вызыватся, или она у них в библиотеках IAR уже гдето сидит ?? Всё точно также как и c putchar. Putchar вызывается из printf, а getchar из scanf. Вы же не привязывали putchar к прерыванию! Думаю вам надо немного приостановиться, и до конца разобраться как работает ваш printf! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 21 декабря, 2007 Опубликовано 21 декабря, 2007 · Жалоба Типовой атмеловский пример USART2.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 21 декабря, 2007 Опубликовано 21 декабря, 2007 · Жалоба Ну на самом деле dimka76 указал на вашу ошибку! Прототип в самом IAR прописан, просто если компилятор встречает описание функции, соотв. прототипу из библиотеки, то он уже берет не библиотечную функцию, а пользовательскую. Не до конца разбираясь в сути, эту фразу можно употреблять для любой области знаний:) Всё точно также как и c putchar. Putchar вызывается из printf, а getchar из scanf. Вы же не привязывали putchar к прерыванию! Думаю вам надо немного приостановиться, и до конца разобраться как работает ваш printf! Еслиб этот прототип заработал сразу на юарт, я бы наверно не просил помощи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
__nik__ 0 23 декабря, 2007 Опубликовано 23 декабря, 2007 · Жалоба Вот пример, проверил, работает без 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 0 23 декабря, 2007 Опубликовано 23 декабря, 2007 · Жалоба Извините, не в тему! Слишком часто в жизни встречаю неправильное использование "ОК". Поэтому неудержался и поправляю. 1. Один немец-перец в начале 19-го века иммигрировал в США. Устроился каким-то клерком, в какую-то шарагу. Работа его заключалась в проверке каких-то бумаг, на которых он должен был ставить свою резолюцию. По английски резолюция звучала так "All correct" (т.е. "Все нормально"). Но поскольку, это был не чистый англоговрящий чувак, а немец, то "Олл-Коррэкт" он так и писал сокращенно - "ОК". (Т.е, уважаемый __nik__, в самой аббревиатуре ОК слово "All" уже присутствует.) Америкосам (видимо, там тоже были свои подонки) понравилось это ОК, и они его просто растиражировали на все сферы деятельности. Потом это ОК расползлось по всему свету. 2. ОК -- всегда пишется большими буквами, без точек. Это правило. Поосто примем его, как постулат, и все! -- Is it OK? Надеюсь, никому не досадил своими нравочениями. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 23 декабря, 2007 Опубликовано 23 декабря, 2007 · Жалоба Надеюсь, никому не досадил своими нравочениями. :) Вообще-то версий происхождения O.K. больше, чем одна ;) http://ru.wikipedia.org/wiki/OK А в англоязычной Википедии можно посмотреть, где в английском употребляется это сочетание http://en.wikipedia.org/wiki/OK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 23 декабря, 2007 Опубликовано 23 декабря, 2007 · Жалоба 2 rezident: Спасибо, за замечания. На счет точек (О.К.), я, похоже, погорячился. Втречаются и такие написания. Хотя, пройдясь по англоязыной "территории", можно заметить, что в основном используются две формы -- OK и okey. Другие формы ОК тоже бывабт, но они как слово "because" -- как его только ни пишут! -- becose, becoze и даже coz. Это как наше -- "превед медвед!". Чем неправильнее, тем прикольнее. Это особенно проявляется в маркетинге, в поп-музыке, на приватных зашибись-сайтах. Ладно, пожалуй, не важно. Давно уже офф-топ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться