0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
1

вопрос по статье "Преобразуем в строку"

16.10.2012, 14:41. Показов 12263. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Еще только осваиваю Си. Пока остановился на IAR AVR последней, доступной версии.
В проекте, над которым работаю требуется выводить на индикатор значения.
Поковырявшись понял, что пользоваться sprymtf ну очень расточительно. начал изучать вопрос и попал на эту чудесную статью.
Понял, что оптимум по всем показателям пример 5, но вот адаптировать его под IAR не получается, точнее не могу разобраться что к чему.
В частности в ступор ввела вот эта строчка:
Код
inline static divmod10_t divmodu10(uint32_t n)
Помогите этот пример адаптировать для IAR

И еще вопрос, в моем проекте есть величины 50.00 (это частота в герцах. 50 герц по русски с сотыми), несколько лет назад в первом прототипе я писал код на асме и реализовывал это по моему при помощи BCD. За си собственно говоря и взялся из за более простой реализации математики. Но вот сейчас задумался, как же изящно решить эту задачку.
В принципе все просто, на экране выставляется значение частоты с точностью в сотые доли, Далее по формуле значение преобразовывается в код частоты для DDS синтезатора и передается ему.
на асме я представлял значение в виде 5000 и просто включал точку при выводе на экран, но вот как подобный фокус на си проделать вкурить пока что не могу. Не вводить же числа с запятой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2012, 14:41
Ответы с готовыми решениями:

Вопрос о статье Халта...
вот статья http://iosyitistromyss.ru/avr-uchebnyj-kurs-vtoraya-programma.html,я чесно говоря что то...

Вопрос по статье о MOSFET + AVR
Статья: http://iosyitistromyss.ru/uprovtenie-mo ... ast-3.html Я запутался. На рис. “На более...

Вопрос по статье Матричная клавиатура
Есть вопрос по статье Матричная клавиатура. Просвятите новичка ). Пины на строках находятся в...

Вопрос по статье "Энкодер из BLDC"
В сообществе я не зарегистрирован (чукча не писатель, чукча читатель). Поэтому попробую задать...

Вопрос по статье о отладке через jtag ice
В статье расписаны фузы для разных программаторов, а вот если шить через АВРСтудию? Тогда какие и...

29
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
16.10.2012, 16:43 2
по поводу 5000 - в Си точно так же, только объявить переменную как int или uint16_t - чтобы 16-разрядная была.
То есть избегать дробных чисел, как только можно.
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
16.10.2012, 17:09 3
Цитата Сообщение от kytikot
по поводу 5000 - в Си точно так же, только объявить переменную как int или uint16_t - чтобы 16-разрядная была.
То есть избегать дробных чисел, как только можно.
Это то мне понятно, не понимаю, как на LCD экране точку в нужном месте поставить. ну целую часть можно получить делением, а вот как с младшей частью быть??
0
Th0r
16.10.2012, 17:34 4
Цитата Сообщение от MyskSmith
Цитата Сообщение от kytikot
по поводу 5000 - в Си точно так же, только объявить переменную как int или uint16_t - чтобы 16-разрядная была.
То есть избегать дробных чисел, как только можно.
Это то мне понятно, не понимаю, как на LCD экране точку в нужном месте поставить. ну целую часть можно получить делением, а вот как с младшей частью быть??
младшая часть - остаток от деления
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
16.10.2012, 18:21 5
Цитата Сообщение от MyskSmith
Цитата Сообщение от kytikot
по поводу 5000 - в Си точно так же, только объявить переменную как int или uint16_t - чтобы 16-разрядная была.
То есть избегать дробных чисел, как только можно.
Это то мне понятно, не понимаю, как на LCD экране точку в нужном месте поставить. ну целую часть можно получить делением, а вот как с младшей частью быть??
A = b / 100;
C = b % 100;
в А будет целая часть, в С дробная.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.10.2012, 18:54 6
Цитата Сообщение от itysiy
Цитата Сообщение от MyskSmith
Это то мне понятно, не понимаю, как на LCD экране точку в нужном месте поставить. ну целую часть можно получить делением, а вот как с младшей частью быть??
A = b / 100;
C = b % 100;
в А будет целая часть, в С дробная.
Так ТС хочет напечатать дробную часть частного или остаток от деления? Извините я под пивом.
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
16.10.2012, 19:11 7
Цитата Сообщение от tyzord66
Цитата Сообщение от itysiy
Цитата Сообщение от MyskSmith
Это то мне понятно, не понимаю, как на LCD экране точку в нужном месте поставить. ну целую часть можно получить делением, а вот как с младшей частью быть??
A = b / 100;
C = b % 100;
в А будет целая часть, в С дробная.
Так ТС хочет напечатать дробную часть частного или остаток от деления? Извините я под пивом.
ТС хочет и то и другое
50,25 например.
Но оперировать он хочет 5025 а на экран выводить как 50,25
По этому он хочет разобраться как это сделать и как сделать легкую процедуру преобразования числа в строку символов:-)
0
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
16.10.2012, 20:51 8
нафиг деление.
Принимаем, что две последние цифрі всегда означают дробную часть.
Переводим чисто в строку посредсвом itoa().
Далее - варианты.
1. Выводим сначала два первых символа, потом точку, потом два последних.
2. Копируем исходную строку в другую (на один символ длиннее) посимвольно. в нужном месте тупо копируем симовл точки. Другую строку целиком выводим наэкран.

примерно так:

char tmp[10], line[11];
int value;
.....
itoa(value, tmp, 10);
line[0] = tmp[0];
line[1] = tmp[1];
line[2] = ,;
line[3] = tmp[2];
line[4] = tmp[3];
line[5] = \0;
lcd_puts(line);
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
16.10.2012, 22:02 9
Цитата Сообщение от kytikot
нафиг деление.
Принимаем, что две последние цифрі всегда означают дробную часть.
Переводим чисто в строку посредсвом itoa().
Далее - варианты.
1. Выводим сначала два первых символа, потом точку, потом два последних.
2. Копируем исходную строку в другую (на один символ длиннее) посимвольно. в нужном месте тупо копируем симовл точки. Другую строку целиком выводим наэкран.

примерно так:

char tmp[10], line[11];
int value;
.....
itoa(value, tmp, 10);
line[0] = tmp[0];
line[1] = tmp[1];
line[2] = ,;
line[3] = tmp[2];
line[4] = tmp[3];
line[5] = \0;
lcd_puts(line);
1. Я хочу сделать преобразования числа в строку символов как написано в статье (5 вариант) только не догоняю пока как это в IAR описать правильно. (Мне еще в меге128 надо уместить формулу расчета частоты и формулу расчета фазы, формулу управления амплитудой выходного сигнала, плюс сервисы, плюс вольтметр, для контроля за выходом и не одним а двумя) Если это реализовывать ресурсоемкими и жирными функциями ни какой памяти не хватит.
2. А что плохого в делении?, я же не просто так использую 5000 вместо 50.00. Число 5000 сразу можно использовать для вычисления кода частоты. Вопрос в принципе чисто косметический, как бы изящно на LCD дисплее точку в нужном месте воткнуть. В первой реализации я использовал цифровой индикатор светодиодный и в нужный момент зажигал эту точку. С LCD же такой фокус просто так не прокатит, нужно разделить вначале число а далее вывести вначале то что перед точкой, потом точку а потом что после. С числом в формате 5000 работать гораздо проще ихмо.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
16.10.2012, 22:11 10
Цитата Сообщение от kytikot
нафиг деление.
Принимаем, что две последние цифрі всегда означают дробную часть.
Переводим чисто в строку посредсвом itoa().
Далее - варианты.
1. Выводим сначала два первых символа, потом точку, потом два последних.
2. Копируем исходную строку в другую (на один символ длиннее) посимвольно. в нужном месте тупо копируем симовл точки. Другую строку целиком выводим наэкран.

примерно так:

char tmp[10], line[11];
int value;
.....
itoa(value, tmp, 10);
line[0] = tmp[0];
line[1] = tmp[1];
line[2] = ,;
line[3] = tmp[2];
line[4] = tmp[3];
line[5] = \0;
lcd_puts(line);
Ага, и если диапазон поменялся, то все переделывать :)

Код
#include <stdyo.h>

void main() {
int val = 5032;
char s[10];
sprymtf(s, "%d,%d", val / 100, val % 100);
prymtf(s);
}
Проблемы могут быть если только вывод нужно делать очень быстро, а микроконтроллер очень медленный и без встроенной операции деления.
0
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
16.10.2012, 22:32 11
посмотрите сколько памяти жрет sprymtf и prymtf и поплачьте. на АРМ понятно, что не актуально..
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
16.10.2012, 22:34 12
Цитата Сообщение от dykytdroyd
Цитата Сообщение от kytikot
нафиг деление.
Принимаем, что две последние цифрі всегда означают дробную часть.
Переводим чисто в строку посредсвом itoa().
Далее - варианты.
1. Выводим сначала два первых символа, потом точку, потом два последних.
2. Копируем исходную строку в другую (на один символ длиннее) посимвольно. в нужном месте тупо копируем симовл точки. Другую строку целиком выводим наэкран.

примерно так:

char tmp[10], line[11];
int value;
.....
itoa(value, tmp, 10);
line[0] = tmp[0];
line[1] = tmp[1];
line[2] = ,;
line[3] = tmp[2];
line[4] = tmp[3];
line[5] = \0;
lcd_puts(line);
Ага, и если диапазон поменялся, то все переделывать :)

Код
#include <stdyo.h>

void main() {
int val = 5032;
char s[10];
sprymtf(s, "%d,%d", val / 100, val % 100);
prymtf(s);
}
Проблемы могут быть если только вывод нужно делать очень быстро, а микроконтроллер очень медленный и без встроенной операции деления.
О чем постоянно и толкую. sprymtf вряд ли поместится при моих задачах. Нужно сделать более компактный и быстрый код для преобразования числа в строку символов .
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
16.10.2012, 23:07 13
Цитата Сообщение от MyskSmith
О чем постоянно и толкую. sprymtf вряд ли поместится при моих задачах. Нужно сделать более компактный и быстрый код для преобразования числа в строку символов .
А сколько вообще доступно памяти? Какой конкретно чип?
Отладочную информацию не забывайте удалять.
На самых простых примерах с использование spritnf gcc выдает например ~15к кода для 16-бит мк, а
после удаления отладочной информации остается меньше 2к.

В atmega128 128к флеша же, неужели не влазит?
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
17.10.2012, 11:32 14
Цитата Сообщение от dykytdroyd
Цитата Сообщение от MyskSmith
О чем постоянно и толкую. sprymtf вряд ли поместится при моих задачах. Нужно сделать более компактный и быстрый код для преобразования числа в строку символов .
А сколько вообще доступно памяти? Какой конкретно чип?
Отладочную информацию не забывайте удалять.
На самых простых примерах с использование spritnf gcc выдает например ~15к кода для 16-бит мк, а
после удаления отладочной информации остается меньше 2к.

В atmega128 128к флеша же, неужели не влазит?
да влезть то влезет, но:
Но отдать 1 килобайт флеша, иметь раздутый стек и вычисления почти в несколько сотен тактов как то не улыбает.
Ведь автор статьи по моему подробно разжевал все достоинства и недостатки.
Очевидно, что деление сдвигами оптимально и по размеру кода и по скорости.
Все, что я хочу понять, как этот пример под IAR адаптировать. Для меня многие определения в этом примере честно говоря не понятны.
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
17.10.2012, 12:23 15
Цитата Сообщение от MyskSmith
Все, что я хочу понять, как этот пример под IAR адаптировать. Для меня многие определения в этом примере честно говоря не понятны.
там чуть выше описана структура divmod10_t

Код
struct divmod10_t
{
uint32_t quot;
uint8_t rem;
};
inline static divmod10_t divmodu10(uint32_t n)
и функция divmodu10 возвращает эту структуру. IAR наверно это не переваривает.
Можно переписать функцию так:

Код
inline static void divmodu10(uint32_t n, uint32_t *quot, uint8_t *rem)
{...
//return res; вместо него
*quot = res.quot;
*rem = res.rem;
}
и вызывать функцию так:

Код
divmodu10(n, &quot, &rem);
где rem и quot описаны как обычные переменные uint32_t и uint8_t соответственно.
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
17.10.2012, 21:51 16
Цитата Сообщение от Stiit.mi
Цитата Сообщение от MyskSmith
Все, что я хочу понять, как этот пример под IAR адаптировать. Для меня многие определения в этом примере честно говоря не понятны.
там чуть выше описана структура divmod10_t

Код
struct divmod10_t
{
uint32_t quot;
uint8_t rem;
};
inline static divmod10_t divmodu10(uint32_t n)
и функция divmodu10 возвращает эту структуру. IAR наверно это не переваривает.
Можно переписать функцию так:

Код
inline static void divmodu10(uint32_t n, uint32_t *quot, uint8_t *rem)
{...
//return res; вместо него
*quot = res.quot;
*rem = res.rem;
}
и вызывать функцию так:

Код
divmodu10(n, &quot, &rem);
где rem и quot описаны как обычные переменные uint32_t и uint8_t соответственно.

Начал пробовать и сразу неудача IAR обругал: "Error[Pe020]: identifier "uint32_t" is undefined"
Я вроде как такого типа данных тоже не припомню. не пинайте -новичок.
0
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 4
17.10.2012, 22:35 17
unsykned long весто uint32_t, unsykned char - uint8_t
так напиши
0
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 72
17.10.2012, 23:30 18
Цитата Сообщение от SHS
unsykned long весто uint32_t, unsykned char - uint8_t
так напиши
Написал так
Код
inline static void divmodu10(unsykned long int n, unsykned long int *quot, unsykned char *rem)
{
divmod10_t res;

}
Опять ругань Error[Pe020]: identifier "divmod10_t" is undefined

и еще мне не очень понятно
//return res; вместо него
Вместо чего ?
0
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
17.10.2012, 23:45 19
Чтоб на uint32_t и uint8_t компилятор не ругался, достаточно включить заголовок:
#include <stdint.h>
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
17.10.2012, 23:57 20
Ладно, как говорится, маю час та натхнення ))

типы вида uintXX_t находятся в файле inttype.h
очень рекомендую использовать их - при переносе функции между 8 и 32-битными системами голова меньше болит

Опять ругань Error[Pe020]: identifier "divmod10_t" is undefined
ну да, чуть выше функции в примере описывался тип divmod10_t - это структура с двумя полями. Либо это объявление скопировать тоже, либо переработать текст функции - выкинуть оттуда использование структуры и объявить две временных переменных

[QUOTE][QUOTE="Цитата:[/QUOTE]
//return res; вместо него
Вместо чего ?
ну я закомментировал строчку с return, ведь функция стала void, и написал, что вместо этого return втулить две других строчки

вообще можно было бы из указанного кода просто почерпнуть идею и написать ее по-своему. Очень помогает тренировать алгоритмическое мышление. А без этого - в программировании никуда. Либо использовать библиотечный sprymtf ))
0
17.10.2012, 23:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2012, 23:57
Помогаю со студенческими работами здесь

Преобразуем int в string
Скажите, пожалуйста, почему здесь ошибка #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include...

Преобразуем локальный чат в интернет форум
Есть чат в локальной сети. Возможно ли транслировать его, естественно автоматически, на домен...

Преобразуем номер телефона, взяв код города в скобки, а пробелы и тире - удалить
Помогите плиз string q = &quot;812 -12-34- 66&quot;; Как подбирать все знаки пробелы и 812 взять в...

Простой вопрос в одну строку
что делает эта строка: for (int j=0; j&lt;i; j++) И как задать промежуток, чтобы поиск осуществлялся...

Вопрос по JTable - как выделить и показать строку?
Подскажите пожалуйста, как на JTable, находящейся в JScrollPane, выделить и показать нужную строку....

Тупой вопрос про перевод числа в строку
Собственно вот натолкнулся на грабли есть u32 val = 0x 00 FF FF FF Нужно преобразовать в hex....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru