Страница 106 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 15:12:52
ValBag
ARV писал(а):чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.
Cпасибо за подсказку - все работает.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 17:31:43
Sounds
как можно определить тип переменной int или float?
Как определить количество символов в переменной?
Как это всё можно сделать без подключения библиотек? Может при помощи ассемблера?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:27:27
ibiza11
Sounds, какие исходные данные?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:41:03
Sounds
Вот мои исходные данные:
int i= 17543
Floar c=45.456
Переменные могут меняться в зависимости от программы.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:54:48
ibiza11
прошу прощения, зачем Вам узнавать float или int, если у Вас и так они заданы в программе как float и int соответственно. отвечаю Вам в двух ветках, предполагаю что проблемы связаны, но понять не могу зачем Вам это. опять же повторюсь: опишите задачу, для чего Вам считать кол-во знаков, может тут подскажут решение попроще.
конкретно,в этой ветке выше я сам задавался вопросом насчет функции sprinf(), то что она ресурсы жрет неимоверно, так там же и описал возможное решение без нее, через жопу правда, но рабочее. а библиотека stdio.h с функцией sprintf() жрет много за счет своей универсальности.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 19:03:13
ValBag
Sounds писал(а):как можно определить тип переменной int или float?
sizeof (переменная или тип). Возвращает размер, в количестве байт.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 21:22:48
andrey_artemov
Народ кто нибудь поставил CodeVision AVR 2.05.0
Что нового, стоит ли заменить ею версию по старее ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 23:00:51
dm211
Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 00:32:37
Сериг
dm211 писал(а):Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
эта версия рулит.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 02:13:21
Sounds
To ibiza11,
Есть за дача, выводить на экран температуру и влажность,
Для вывода числа я использую конструкцию следующего типа:
Код: Выделить всё
int x=3; // количество символов
int i= 456 // показания с датчика
if (i<0){
i=~i+1;
display_putsf( "-",0,7,0 );
}
do
{
display_putchar(i%10+0x30,x,7,0 );
i=i/10;
}
while(--x);
но в этой конструкции есть пару косяков!
1) Всегда нужно вписывать количество символов! Если у тебя в параметрах стоит что: int x=5, а int i= 456, то программа выводит 00456. Если int x=5, а int i= 87, то результат 00087
2) Не выводит числа с плавающей точкой!
Как мне решить эти вопросы?
Спасибо за помощь!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 12:34:55
ibiza11
обычно для вывода на экран пишут функцию вывода строки. а строку получают с помощью функции sprintf() с соответствующими аргументами.
что за функция
display_putsf в Вашем коде?
несколько примеров получения строки:
Код: Выделить всё
int x=83;
int y=-111;
float z=12.3;
unsigned char sign1='F';
sprintf(str_tmp,"0000000000");
sprintf(str_tmp,"privet %с",sign1);
sprintf(str_tmp,"x=%-i\ny=%-d\nz=%-.3e\n",x,y,z);
//далее строку str_tmp (или указатель на нее) передаем функции вывода на экран, которая обрабатывает уже просто строку, а не числа
//таким образом можно создать любую строку с любым форматным выводом, это проще, чем заморачиваться с кол-вом символов, как у Вас
PS Если не хотите заморачиваться с sprintf(), то в свою функцию вывода на экран добавьте условие: если старший разряд равен 0, то его не выводить. при этом вывод должен начинаться со старших разрядов числа. Числа float можно предварительно умножить например на 1000, а в функции вывода на экран предусмотреть вставку запятой после третьего разряда. Аналогично с поведением со старшими разрядами, можно проследить, что при умножении на 1000, остаются ли нули справа, если остаются, их также не выводить. вроде несложно, должно получиться.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 13:05:52
Sounds
ibiza11
Спасибо за разъяснения!
Я решил делать через функцию sprintf()!
Но как вывести число с плавающей точкой?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 13:41:26
ibiza11
IAR AVR Help писал(а):Код: Выделить всё
int sprintf(char *s, const char *format, ...);
The function generates formatted text, under the control of the format format and any additional arguments, and stores each generated character in successive locations of the array object whose first element has the address s. The function concludes by storing a null character in the next location of the array. It returns the number of characters generated -- not including the null character.
Print Conversion Specifiers
Following any precision, you must write a one-character print conversion specifier, possibly preceded by a one- or two-character qualifier. Each combination determines the type required of the next argument (if any) and how the library functions alter the argument value before converting it to a text sequence. The integer and floating-point conversions also determine what base to use for the text representation. If a conversion specifier requires a precision p and you do not provide one in the format, then the conversion specifier chooses a default value for the precision. The following table lists all defined combinations and their properties.
Conversion Argument Converted Default Pre-
Specifier Type Value Base cision
%a double x (double)x 10 6 added with C99
%La long double x (long double)x 10 6 added with C99
%A double x (double)x 10 6 added with C99
%LA long double x (long double)x 10 6 added with C99
%c int x (unsigned char)x
%lc wint_t x wchar_t a[2] = {x}
%d int x (int)x 10 1
%hd int x (short)x 10 1
%ld long x (long)x 10 1
%hhd int x (signed char)x 10 1 added with C99
%jd intmax_t x (intmax_t)x 10 1 added with C99
%lld long long x (long long)x 10 1 added with C99
%td ptrdiff_t x (ptrdiff_t)x 10 1 added with C99
%zd size_t x (ptrdiff_t)x 10 1 added with C99
%e double x (double)x 10 6
%Le long double x (long double)x 10 6
%E double x (double)x 10 6
%LE long double x (long double)x 10 6
%f double x (double)x 10 6
%Lf long double x (long double)x 10 6
%F double x (double)x 10 6 added with C99
%LF long double x (long double)x 10 6 added with C99
%g double x (double)x 10 6
%Lg long double x (long double)x 10 6
%G double x (double)x 10 6
%LG long double x (long double)x 10 6
%i int x (int)x 10 1
%hi int x (short)x 10 1
%li long x (long)x 10 1
%hhi int x (signed char)x 10 1 added with C99
%ji intmax_t x (intmax_t)x 10 1 added with C99
%lli long long x (long long)x 10 1 added with C99
%ti ptrdiff_t x (ptrdiff_t)x 10 1 added with C99
%zi size_t x (ptrdiff_t)x 10 1 added with C99
%n int *x
%hn short *x
%ln long *x
%hhn int *x added with C99
%jn intmax_t *x added with C99
%lln long long *x added with C99
%tn ptrdiff_t *x added with C99
%zn size_t *x added with C99
%o int x (unsigned int)x 8 1
%ho int x (unsigned short)x 8 1
%lo long x (unsigned long)x 8 1
%hho int x (unsigned char)x 8 1 added with C99
%jo intmax_t x (uintmax_t)x 8 1 added with C99
%llo long long x (unsigned long long)x 8 1 added with C99
%to ptrdiff_t x (size_t)x 8 1 added with C99
%zo size_t x (size_t)x 8 1 added with C99
%p void *x (void *)x
%s char x[] x[0]... large
%ls wchar_t x[] x[0]... large
%u int x (unsigned int)x 10 1
%hu int x (unsigned short)x 10 1
%lu long x (unsigned long)x 10 1
%hhu int x (unsigned char)x 8 1 added with C99
%ju intmax_t x (uintmax_t)x 8 1 added with C99
%llu long long x (unsigned long long)x 8 1 added with C99
%tu ptrdiff_t x (size_t)x 8 1 added with C99
%zu size_t x (size_t)x 8 1 added with C99
%x int x (unsigned int)x 16 1
%hx int x (unsigned short)x 16 1
%lx long x (unsigned long)x 16 1
%hhx int x (unsigned char)x 8 1 added with C99
%jx intmax_t x (uintmax_t)x 8 1 added with C99
%llx long long x (unsigned long long)x 8 1 added with C99
%tx ptrdiff_t x (size_t)x 8 1 added with C99
%zx size_t x (size_t)x 8 1 added with C99
%X int x (unsigned int)x 16 1
%hX int x (unsigned short)x 16 1
%lX long x (unsigned long)x 16 1
%hhX int x (unsigned char)x 8 1 added with C99
%jX intmax_t x (uintmax_t)x 8 1 added with C99
%llX long long x (unsigned long long)x 8 1 added with C99
%tX ptrdiff_t x (size_t)x 8 1 added with C99
%zX size_t x (size_t)x 8 1 added with C99
%% none '%'
только это из IAR, не знаю как правильно в CodeVision. поищите в хелпе.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 17:32:06
Sounds
ibiza11,
Спасибо огромное за помощь! Всё получилось!
To All,
У меня новая неясность.
У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы.
Особенно это видно на часах в раздели секунды, секунды скачат через одну, а то и через две.
Мне кажется что это связанно с временем преобразования!
У меня разрядность термометра стоит на 12 бит, их как я и говорил 2, время преобразования одного равняется 750 мс, а двух 1500 мс.
Как с этим можно бороться не меняя битность термометра?
Может попробовать так:
Код: Выделить всё
if(i==1){
temperature_one=ds18b20_temperature( &RomCode[0][0] );
i=2;
}
if(i==2){
temperature_two=ds18b20_temperature( &RomCode[1][0] );
i=1;
}
По идеи этот алгоритм экономит время преобразования в два раза, получается что за один цикл делается одно преобразование.
Есть более перспективные варианты?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 11, 2011 11:50:44
ValBag
Sounds писал(а):У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Тут уже кто-то выкладывал модифицированную библиотеку
ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не
delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде"

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 11, 2011 15:13:24
odesasha
dm211 писал(а):Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
Надо просто переписать в соответствующие папки (lib и inc ) недостающие библиотеки и хидеры.
А 2.03 дает больший до 3-5 % Нех , чем 2.04 .4а на 1к-слове , а 2.05 дает еще на ~1 % меньший чем 2.04.4а. и работает на ура .
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 11, 2011 19:09:18
odesasha
ValBag писал(а):Sounds писал(а):У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Тут уже кто-то выкладывал модифицированную библиотеку
ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не
delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде"

Никогда не было проблем с этим :
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 11, 2011 20:25:50
ValBag
odesasha писал(а):Никогда не было проблем с этим :
Немного не то. Ниже с разделением.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 14, 2011 14:30:04
Apparatchik
Есть два массива размером 90 каждый, данные из которого, будут только читаться и только в одной функции. Где лучше их определить глобально, локально, eeprom, flash. Если в eeprom и flash то пример как определить и как читать пожалуйста.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 14, 2011 15:39:07
AI_Disable
Если только чтение, то лучше во flash, конечно, чтоб не тратить ОЗУ(но скорость чтения будет меньше). Если скорость совсем не важна, то можно и в еепром.
Примеры работы с еепром можно найти в ДШ.
-----
Совсем забыл, с кодвижионом вообще ничего делать не надо, для работы с флэш и еепром. Компилятор сам всё умеет, например:
eeprom long int mass1[3] = {1,100500,404}; //создаём массив в eeprom и инициализируем его. Работать как с обычным массивом.
flash long int mass1[3] = {1,100500,404}; //тоже во flash