|
Согласование переменных разных типов |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Feb 4 2010, 06:36
|

Частый гость
 
Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344

|
Цитата(GoodNews @ Feb 4 2010, 00:22)  Если есть одна переменная у которой тип "char", вторая переменная типа "uint16_t" на которой реализован счётчик. Как их представить в переменной типа "char" для последующей записи в порт LCD? Стандартное преобразование типов С : Код { char chValH, chValL; uint16 uiCnt;
chValL = (char) (uiCnt); chValH = (char) (uiCnt >> 8); } далее далее старшую и младшую часть в порт. Если счетчик обновляется в прерывании то предусмотреть запрет прерывания во время чтения счетчика.
--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть" "Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
|
|
|
|
|
Feb 4 2010, 08:54
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(Палыч @ Feb 4 2010, 09:44)  Вам - что, нужно получить последовательность символов, соответствующих значению счетчика? Тогда - функция sprintf. Ну, и поместить эту последовательность в переменную массив char'ов... Как-то так: Код uint16_t Cnt; char Array[10]; sprintf(Array, "%d", Cnt); Я хотел взять некоторое значение, например 125,3876, добавить к нему текст (в а конкретно "MHz"), и всё это отправить в lcd_putdata() в соответствующую строку дисплея (запись в дисплей у меня реализована, выбор строк тоже). Вот функция записи в дисплей: Код void lcd_putchar(char data) { LCD_CTL |= LCD_RS; //Включаем режим обработки данных дисплеем (если бит инвертирован, то - обработка инструкций) LCD_PORT = data; lcd_strobe(); LCD_CTL &= ~(LCD_RS|LCD_RW); } void lcd_putdata(uint8_t line, char* data) { lcd_select_addr(line); while(*data) { lcd_busy(); lcd_putchar(*data++); } } int main(void) { /// lcd_init(); lcd_putdata(1, "1234567890ABCDEF"); lcd_putdata(2, "GHIJKLMNOPQRSTUV"); lcd_putdata(3, "WXYZ!@#$%^&*()_+"); /// ..... }
|
|
|
|
|
Feb 4 2010, 09:05
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(GoodNews @ Feb 4 2010, 11:54)  Я хотел взять некоторое значение, например 125,3876, добавить к нему текст (в а конкретно "MHz"), и всё это отправить в lcd_putdata() в соответствующую строку дисплея (запись в дисплей у меня реализована, выбор строк тоже). Ну, так и воспользуйтесь функцией sprintf - это самый простой, но, правда, и самый затратный по памяти способ. Правда, я не понял как Вы из целого значения желаете получить "125,3876"? Если в целой переменной у Вас храниться частота в килогерцах, то более 65535 поместить в неё не удастся... PS. Для переменной типа uint_t нужно использовать sprintf(Array, "% u", Cnt);
|
|
|
|
|
Feb 4 2010, 09:20
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(Палыч @ Feb 4 2010, 11:05)  Ну, так и воспользуйтесь функцией sprintf - это самый простой, но, правда, и самый затратный по памяти способ. Правда, я не понял как Вы из целого значения желаете получить "125,3876"? Если в целой переменной у Вас храниться частота в килогерцах, то более 65535 поместить в неё не удастся...
PS. Для переменной типа uint_t нужно использовать sprintf(Array, "%u", Cnt); Тут скорее надо float, я не подумал как-то. По памяти - я отрабатываю каждый модуль отдельно (LCD, kbd ...), а потом всё будет собрано для mega128.
|
|
|
|
|
Feb 4 2010, 16:12
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(rezident @ Feb 4 2010, 15:18)  Да, да. Сначала во float преобразовать, а потом sprintf-ом на LCD вывести, и для этого mega на xmega поменять, потому что размера ОЗУ не хватает.  Вы бы погуглили вначале по теме BCD преобразования и использования fixed point арифметики. На форуме уже раз сто мусолили эти темы. так планируется в дальнейшем использование mega128, просто mega16 доступнее в плане цены и если убью при прошивке (STK600 можно найти только на eBay), вот поэтому на mega16 испытываю модули по отдельности (lcd и пр.).
|
|
|
|
|
Feb 5 2010, 12:09
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Решил попробовать использовать такой вариант кода (всё-таки float): Код char* get_freq(uint32_t Fr, uint8_t type) { static char Str[16]; static float tmp; tmp = Fr / 1000U; switch(type) { case (0): //KHz sprintf(Str, "%4.6fKHz", (double)tmp); return Str; break; /* case (1): //MHz sprintf(Str, "%4.6fMHz", (double)tmp); return Str; break; */ } return 0; } int main(void) { uint32_t i = 560000; lcd_init(); /*...*/ lcd_putdata(1, get_freq(i, 0)); /*...*/ } Проблема в sprintf(Str, "%4.6fKHz", (double)tmp), так как в итоге ничего не отображается (просто пустая строка). Почему не хочет показывать, ведь вроде функцию вызвал правильно?
|
|
|
|
|
Feb 5 2010, 13:31
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(GoodNews @ Feb 5 2010, 15:09)  Почему не хочет показывать, ведь вроде функцию вызвал правильно? Функция printf (и еже с ними) ну очень прожорлива до памяти. Чтобы как-то это обойти, обычно, поставляется несколько вариантов библиотек, в которых от самых "худых" функций (поддерживают только сhar и int) до самых навороченных (это Ваш вариант - поддерживают плавучку). В зависимости от используемой среды разработки нужно как-то указать: какой вариант использовать... Цитата(GoodNews @ Feb 5 2010, 15:09)  Решил попробовать использовать такой вариант кода (всё-таки float): Код char* get_freq(uint32_t Fr, uint8_t type) { static char Str[16]; static float tmp; tmp = Fr / 1000U; /*...*/ } Такое вычисление tmp - никуда не годится! Правильно записать tmp = Fr / 1000.0; Цитата(GoodNews @ Feb 5 2010, 15:09)  Код sprintf(Str, "%4.6fKHz", (double)tmp); Преобразование к double - абсолютно лишнее
|
|
|
|
|
Feb 5 2010, 14:02
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(Палыч @ Feb 5 2010, 15:27)  Функция printf (и еже с ними) ну очень прожорлива до памяти. Чтобы как-то это обойти, обычно, поставляется несколько вариантов библиотек, в которых от самых "худых" функций (поддерживают только сhar и int) до самых навороченных (это Ваш вариант - поддерживают плавучку). В зависимости от используемой среды разработки нужно как-то указать: какой вариант использовать...
Такое вычисление tmp - никуда не годится! Правильно записать tmp = Fr / 1000.0;  среда разработки - Vim, набор библиотек - avr-libc, компилятор - avr-gcc, библиотека stdio.h из комплекта avr-libc. Цитата(Палыч @ Feb 5 2010, 15:31)  Преобразование к double - абсолютно лишнее без него ругается, что tmp - float, а %4.6f - double!
Сообщение отредактировал GoodNews - Feb 5 2010, 14:03
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|