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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Оператор "printf" и функция "putchar" для работы с символьным LCD
Буратино
сообщение Mar 19 2010, 11:47
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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.

Мне нужно выводить на экран простые конструкции состоящие из текста и числовых данных, что делать? smile.gif

Сообщение отредактировал Буратино - Mar 19 2010, 12:46


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
barabek
сообщение Mar 19 2010, 12:09
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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() тоже функция , а не оператор.
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 12:12
Сообщение #3


Профессионал
*****

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



printf("%f", 30.0); выводит "0.000000"
printf("%.2f", 30.0); выводит "0.00"


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2010, 12:34
Сообщение #4


Гуру
******

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



Цитата(Буратино @ Mar 19 2010, 14:47) *
Прописал "putchar" в виде:
void putchar( char c )

Для начала эта функция НЕ putchar(), ибо ну зря продали букварь Карабасу smile.gif - буквари надо читать sad.gif. Ну а дальше по нарастающей....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 12:43
Сообщение #5


Профессионал
*****

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



А почему эта функция не putchar()?

---
Буратино продал букварь НЕ Карабасу.


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2010, 12:46
Сообщение #6


Гуру
******

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



Цитата(Буратино @ Mar 19 2010, 15:43) *
А почему эта функция не putchar()?

А вот об этом написано в Букваре:
Цитата
#include <stdio.h>
int putchar( int c );

Цитата
Буратино продал букварь НЕ Карабасу.

Главное, что продали НЕ читая sad.gif
Ладно, если Букварь не читали, то может, хоть форум почитаете? Вопрос дежурный sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 12:51
Сообщение #7


Профессионал
*****

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



Цитата(zltigo @ Mar 19 2010, 15:46) *
А вот об этом написано в Букваре:


Главное, что продали НЕ читая sad.gif
Ладно, если Букварь не читали, то может, хоть форум почитаете? Вопрос дежурный sad.gif


Да. Вы правы. Сейчас посмотрю повнимательнее.


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 15:36
Сообщение #8


Профессионал
*****

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



Пересмотрел форум, и понял ,что функция printf() занимает много места в ОЗУ. Я установил в опциях ИАР минимальную конфигурацию для нее (print formatter - Small), менял размер области памяти под стек, но ничего не получается. Вместо того, что я ожидаю получаю абракадабруsad.gif
Идея форматированого вывода на 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


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2010, 15:49
Сообщение #9


Гуру
******

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



Цитата(Буратино @ Mar 19 2010, 18:36) *
Я установил в опциях ИАР минимальную конфигурацию для нее (print formatter - Small)

Ага, и решили попечатать float smile.gif
Цитата
Мне не хочется вникать в...

Ну тогда займитесь чем-нибудь другим по жизни. Тем более, что тонкостей-то и нет sad.gif. Налицо какая-то безалаберность, например, ну никак не мог, если его не задушить до полного безразличия, не ругаться компилятор на void putchar( char ). Что и куда Вы сейчас подсунули - тоже неведомо никому, как и того, что и как делает дивная функция Transmit_Byte(), как настроен, и как должен быть настроен UART....
Если Вам "не хочется вникать в", то от других тогда тоже не ожидайте особого желания вникать, и уж тем более вытягивать из Вас информацию.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Mar 19 2010, 15:49
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



А в контроллер уже зашиты ASCII коды?

Может, я не прав, но всё, что мне встричалось, программировалось по SPI.
Обязательно объявлялись константы ASCII кодов, в массив заносился текст с помощью sprintf() или memcpy(), и уже этот массив отправлялся по SPI

Сообщение отредактировал one_eight_seven - Mar 19 2010, 15:50
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 15:59
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2010, 16:34
Сообщение #12


Гуру
******

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



Цитата(Буратино @ Mar 19 2010, 18:59) *
zltigo ,почему Вы такой злой?

Что-бы больше разбирались сами, и меньше загадывали шарады.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 18:20
Сообщение #13


Профессионал
*****

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



Все, разобрался (хотя и остались некоторые непонятки):
Не включил в проект #include <stdio.h> rolleyes.gif
---
zltigo, прошу прощения, что наорал на Вас, злой очень был.
Все никак не решусь на новый виток в образовании, вот если бы ногу или руку сломать (на крайний случай ветрянка сойдет), чтоб дома в кровати валяться и книги умные читать..

Сообщение отредактировал Буратино - Mar 19 2010, 18:28


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2010, 18:37
Сообщение #14


Гуру
******

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



Цитата(Буратино @ Mar 19 2010, 21:20) *
Все, разобрался (хотя и остались некоторые непонятки):

Некошерно смотрится дергание бита разрешения прерывания sad.gif. Ну и volatile для UART_TxHead0 лишнее - только warning вызывает. tmptail0 лишняя сущность... Про имена помолчу.... Прототипы своих функций тоже игнорируем sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2010, 18:45
Сообщение #15


Профессионал
*****

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



Цитата(zltigo @ Mar 19 2010, 21:37) *
Некошерно смотрится дергание бита разрешения прерывания sad.gif. Ну и volatile для UART_TxHead0 лишнее - только warning вызывает. tmptail0 лишняя сущность... Про имена помолчу....


Я тут на сайте нашел документ "Стандарт кодирования на СИ" Вы его еще чихвостили в той ветке не слабо, но мне понравилось.
Планирую переписывать все что буду писать в соответствии с этим стандартом, включая форматирование и соглашение об именах.
Старый код пока не буду трогать.
Что касается разрешения прерывания, то пересмотрю источник (не помню какая апликуха атмела) возможно я уже что-то напакостил в тексте. Справедливости ради хочу заметить что этот код уже гигибайта три прокачалsmile.gif
volatile ,как и все остальные косяки в работе с ИАР буду стараться исправить, многого конечно не получится, но с варнингами точно "поквитаюсь":)

Все, спасибо всем!

Сообщение отредактировал Буратино - Mar 19 2010, 19:00


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post

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

 


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


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