Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 15:12:52
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
ARV писал(а):
чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 17:31:43
Прорезались зубы
Зарегистрирован: Вт май 27, 2008 23:23:24 Сообщений: 238
Рейтинг сообщения:0
как можно определить тип переменной int или float? Как определить количество символов в переменной? Как это всё можно сделать без подключения библиотек? Может при помощи ассемблера?
прошу прощения, зачем Вам узнавать float или int, если у Вас и так они заданы в программе как float и int соответственно. отвечаю Вам в двух ветках, предполагаю что проблемы связаны, но понять не могу зачем Вам это. опять же повторюсь: опишите задачу, для чего Вам считать кол-во знаков, может тут подскажут решение попроще. конкретно,в этой ветке выше я сам задавался вопросом насчет функции sprinf(), то что она ресурсы жрет неимоверно, так там же и описал возможное решение без нее, через жопу правда, но рабочее. а библиотека stdio.h с функцией sprintf() жрет много за счет своей универсальности.
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 02:13:21
Прорезались зубы
Зарегистрирован: Вт май 27, 2008 23:23:24 Сообщений: 238
Рейтинг сообщения:0
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) Не выводит числа с плавающей точкой!
обычно для вывода на экран пишут функцию вывода строки. а строку получают с помощью функции 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, остаются ли нули справа, если остаются, их также не выводить. вроде несложно, должно получиться.
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
Прорезались зубы
Зарегистрирован: Вт май 27, 2008 23:23:24 Сообщений: 238
Рейтинг сообщения:0
ibiza11, Спасибо огромное за помощь! Всё получилось!
To All, У меня новая неясность. У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Особенно это видно на часах в раздели секунды, секунды скачат через одну, а то и через две. Мне кажется что это связанно с временем преобразования! У меня разрядность термометра стоит на 12 бит, их как я и говорил 2, время преобразования одного равняется 750 мс, а двух 1500 мс. Как с этим можно бороться не меняя битность термометра?
По идеи этот алгоритм экономит время преобразования в два раза, получается что за один цикл делается одно преобразование. Есть более перспективные варианты?
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 11, 2011 11:50:44
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
Sounds писал(а):
У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Тут уже кто-то выкладывал модифицированную библиотеку ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде"
Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
Надо просто переписать в соответствующие папки (lib и inc ) недостающие библиотеки и хидеры. А 2.03 дает больший до 3-5 % Нех , чем 2.04 .4а на 1к-слове , а 2.05 дает еще на ~1 % меньший чем 2.04.4а. и работает на ура .
У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Тут уже кто-то выкладывал модифицированную библиотеку ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде"
Никогда не было проблем с этим :
Вложения:
Комментарий к файлу: Либа и хидер для ds18x20 pack.zip [1.26 KiB]
Скачиваний: 192
Есть два массива размером 90 каждый, данные из которого, будут только читаться и только в одной функции. Где лучше их определить глобально, локально, eeprom, flash. Если в eeprom и flash то пример как определить и как читать пожалуйста.
Если только чтение, то лучше во flash, конечно, чтоб не тратить ОЗУ(но скорость чтения будет меньше). Если скорость совсем не важна, то можно и в еепром. Примеры работы с еепром можно найти в ДШ. ----- Совсем забыл, с кодвижионом вообще ничего делать не надо, для работы с флэш и еепром. Компилятор сам всё умеет, например: eeprom long int mass1[3] = {1,100500,404}; //создаём массив в eeprom и инициализируем его. Работать как с обычным массивом. flash long int mass1[3] = {1,100500,404}; //тоже во flash
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения