|
Оператор "printf" и функция "putchar" для работы с символьным LCD |
|
|
|
Mar 19 2010, 11:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
не понимаю, что за беда с выводом. Прописал "putchar" в виде: Код void putchar( char c ) { if ( !c ) return( 0 ); Transmit_Byte( c ); /*функция отправки сообщения в последовательный порт*/ } LCD оснащен контроллером, который принимает данные по последовательному порту и выводит на экран дисплея 16*02 Не могу разобраться почему: printf("%a", 30.0) выводит "???" printf("%.2A", 30.0) выводит "???" printf("%c", 'a') ничего выводит printf("<%3c|%-3c>", 'a', 'b') выводит "< крокозябра >" и т.д. совсем другими словами не то что я ожидаю. printf("Hello World!") выводит "Hello World!", но если использовать длинную строку или несколько операторов "printf" со строками, то выводятся куски строк в хаотичном порядке. размер Data Stack в компиляторе IAR установил в 0x300. Мне нужно выводить на экран простые конструкции состоящие из текста и числовых данных, что делать?
Сообщение отредактировал Буратино - Mar 19 2010, 12:46
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 19 2010, 12:09
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Буратино @ Mar 19 2010, 21:47)  printf("%a", 30.0) выводит "???" printf("%.2A", 30.0) выводит "? А если попробовать : printf("%f", 30.0); или printf("%.2f", 30.0); Кстати, касательно терминологии printf() тоже функция , а не оператор.
|
|
|
|
|
Mar 19 2010, 12:46
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Буратино @ Mar 19 2010, 15:43)  А почему эта функция не putchar()? А вот об этом написано в Букваре: Цитата #include <stdio.h> int putchar( int c ); Цитата Буратино продал букварь НЕ Карабасу. Главное, что продали НЕ читая  Ладно, если Букварь не читали, то может, хоть форум почитаете? Вопрос дежурный
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 19 2010, 15:36
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Пересмотрел форум, и понял ,что функция printf() занимает много места в ОЗУ. Я установил в опциях ИАР минимальную конфигурацию для нее (print formatter - Small), менял размер области памяти под стек, но ничего не получается. Вместо того, что я ожидаю получаю абракадабру  Идея форматированого вывода на LCD дисплей идет ко дну, вместе с моей уверенностью в своих собственных силах. Мне не хочется вникать в тонкости работы компилятора, я хочу сделать устройство для полива цветов на окне. Пожалуйста подскажите, что не так, куда копать? Вот реализация "putchar" Код int putchar( int c ) { Transmit_Byte( c ); /*выводит байт в UART*/ return c; } да и вот еще что: дело в том, что компилятор ругается на printf() и вот что пишет: Warning[w6]: Type conflict for external/entry "printf", in module main against external/entry in module ?printf; prototyped function vs K&R function /* In module main: */ /* K&R Function, args 0, attr 0 */ int (__version_3 printf)(); /* In module ?printf: */ /* Function, args 2, attr 0 */ int (__version_3 printf)(char const *, ...);
Сообщение отредактировал Буратино - Mar 19 2010, 15:42
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 19 2010, 15:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Буратино @ Mar 19 2010, 18:36)  Я установил в опциях ИАР минимальную конфигурацию для нее (print formatter - Small) Ага, и решили попечатать float  Цитата Мне не хочется вникать в... Ну тогда займитесь чем-нибудь другим по жизни. Тем более, что тонкостей-то и нет  . Налицо какая-то безалаберность, например, ну никак не мог, если его не задушить до полного безразличия, не ругаться компилятор на void putchar( char ). Что и куда Вы сейчас подсунули - тоже неведомо никому, как и того, что и как делает дивная функция Transmit_Byte(), как настроен, и как должен быть настроен UART.... Если Вам "не хочется вникать в", то от других тогда тоже не ожидайте особого желания вникать, и уж тем более вытягивать из Вас информацию.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 19 2010, 15:59
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
zltigo ,почему Вы такой злой? Ну нет желания помочь - ну и не нужно! В конце-концов весь мир не вокруг одного Вашего мизинчика вращается. Я достаточно обеспеченный человек, чтобы позволить себе заниматься электроникой в качестве хобби, и достаточно самостоятельный человек, чтобы разобраться, чем мне в жизни увлекаться. Уарт настроен на baud rate: 115200, char size: 8 bit, parity: Disabled Вот код функций: Код #define UART_TX_BUFFER_SIZE0 64 #define UART_TX_BUFFER_MASK0 ( UART_TX_BUFFER_SIZE0 - 1 )
static unsigned char UART_TxBuf0[UART_TX_BUFFER_SIZE0]; static volatile unsigned char UART_TxHead0; static volatile unsigned char UART_TxTail0;
void Transmit_Byte( unsigned char data0 ) { unsigned char tmphead0;
tmphead0 = ( UART_TxHead0 + 1 ) & UART_TX_BUFFER_MASK0; while ( tmphead0 == UART_TxTail0 ); UART_TxBuf0[tmphead0] = data0; UART_TxHead0 = tmphead0; UCSR0B |= (1<<UDRIE0); }
#pragma vector=USART_UDRE_vect __interrupt void USART0_TX_interrupt( void ) { unsigned char tmptail0;
if ( UART_TxHead0 != UART_TxTail0 ) { tmptail0 = ( UART_TxTail0 + 1 ) & UART_TX_BUFFER_MASK0; UART_TxTail0 = tmptail0; UDR0=UART_TxBuf0[tmptail0]; } else { UCSR0B &= ~(1<<UDRIE0); } } Повторяю, функция printf() выводит короткий текст типа "Hello World!", что само по себе свидетельство правильной работы UART, ведь данные были переданы и приняты процессорами.
Сообщение отредактировал Буратино - Mar 19 2010, 16:13
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 19 2010, 18:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Все, разобрался (хотя и остались некоторые непонятки): Не включил в проект #include <stdio.h> --- zltigo, прошу прощения, что наорал на Вас, злой очень был. Все никак не решусь на новый виток в образовании, вот если бы ногу или руку сломать (на крайний случай ветрянка сойдет), чтоб дома в кровати валяться и книги умные читать..
Сообщение отредактировал Буратино - Mar 19 2010, 18:28
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 19 2010, 18:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(zltigo @ Mar 19 2010, 21:37)  Некошерно смотрится дергание бита разрешения прерывания  . Ну и volatile для UART_TxHead0 лишнее - только warning вызывает. tmptail0 лишняя сущность... Про имена помолчу.... Я тут на сайте нашел документ "Стандарт кодирования на СИ" Вы его еще чихвостили в той ветке не слабо, но мне понравилось. Планирую переписывать все что буду писать в соответствии с этим стандартом, включая форматирование и соглашение об именах. Старый код пока не буду трогать. Что касается разрешения прерывания, то пересмотрю источник (не помню какая апликуха атмела) возможно я уже что-то напакостил в тексте. Справедливости ради хочу заметить что этот код уже гигибайта три прокачал  volatile ,как и все остальные косяки в работе с ИАР буду стараться исправить, многого конечно не получится, но с варнингами точно "поквитаюсь":) Все, спасибо всем!
Сообщение отредактировал Буратино - Mar 19 2010, 19:00
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|