Cпасибо за подсказку - все работает.ARV писал(а):чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.
CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
как можно определить тип переменной int или float?
Как определить количество символов в переменной?
Как это всё можно сделать без подключения библиотек? Может при помощи ассемблера?
Как определить количество символов в переменной?
Как это всё можно сделать без подключения библиотек? Может при помощи ассемблера?
Re: CodeVision AVR в вопросах и ответах
Вот мои исходные данные:
int i= 17543
Floar c=45.456
Переменные могут меняться в зависимости от программы.
int i= 17543
Floar c=45.456
Переменные могут меняться в зависимости от программы.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
прошу прощения, зачем Вам узнавать float или int, если у Вас и так они заданы в программе как float и int соответственно. отвечаю Вам в двух ветках, предполагаю что проблемы связаны, но понять не могу зачем Вам это. опять же повторюсь: опишите задачу, для чего Вам считать кол-во знаков, может тут подскажут решение попроще.
конкретно,в этой ветке выше я сам задавался вопросом насчет функции sprinf(), то что она ресурсы жрет неимоверно, так там же и описал возможное решение без нее, через жопу правда, но рабочее. а библиотека stdio.h с функцией sprintf() жрет много за счет своей универсальности.
конкретно,в этой ветке выше я сам задавался вопросом насчет функции sprinf(), то что она ресурсы жрет неимоверно, так там же и описал возможное решение без нее, через жопу правда, но рабочее. а библиотека stdio.h с функцией sprintf() жрет много за счет своей универсальности.
Ставим плюсы: )
Re: CodeVision AVR в вопросах и ответах
sizeof (переменная или тип). Возвращает размер, в количестве байт.Sounds писал(а):как можно определить тип переменной int или float?
- andrey_artemov
- Встал на лапы
- Сообщения: 136
- Зарегистрирован: Сб авг 15, 2009 21:26:50
- Откуда: Пенза
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Народ кто нибудь поставил CodeVision AVR 2.05.0
Что нового, стоит ли заменить ею версию по старее ?
Что нового, стоит ли заменить ею версию по старее ?
Re: CodeVision AVR в вопросах и ответах
Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
dm211 писал(а):Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
эта версия рулит.
Re: CodeVision AVR в вопросах и ответах
To ibiza11,
Есть за дача, выводить на экран температуру и влажность,
Для вывода числа я использую конструкцию следующего типа:
но в этой конструкции есть пару косяков!
1) Всегда нужно вписывать количество символов! Если у тебя в параметрах стоит что: int x=5, а int i= 456, то программа выводит 00456. Если int x=5, а int i= 87, то результат 00087
2) Не выводит числа с плавающей точкой!
Как мне решить эти вопросы?
Спасибо за помощь!
Есть за дача, выводить на экран температуру и влажность,
Для вывода числа я использую конструкцию следующего типа:
Код: Выделить всё
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) Не выводит числа с плавающей точкой!
Как мне решить эти вопросы?
Спасибо за помощь!
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
обычно для вывода на экран пишут функцию вывода строки. а строку получают с помощью функции sprintf() с соответствующими аргументами.
что за функция display_putsf в Вашем коде?
несколько примеров получения строки:
PS Если не хотите заморачиваться с sprintf(), то в свою функцию вывода на экран добавьте условие: если старший разряд равен 0, то его не выводить. при этом вывод должен начинаться со старших разрядов числа. Числа float можно предварительно умножить например на 1000, а в функции вывода на экран предусмотреть вставку запятой после третьего разряда. Аналогично с поведением со старшими разрядами, можно проследить, что при умножении на 1000, остаются ли нули справа, если остаются, их также не выводить. вроде несложно, должно получиться.
что за функция 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 в вопросах и ответах
ibiza11
Спасибо за разъяснения!
Я решил делать через функцию sprintf()!
Но как вывести число с плавающей точкой?
Спасибо за разъяснения!
Я решил делать через функцию sprintf()!
Но как вывести число с плавающей точкой?
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
только это из IAR, не знаю как правильно в CodeVision. поищите в хелпе.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 '%'
Ставим плюсы: )
Re: CodeVision AVR в вопросах и ответах
ibiza11,
Спасибо огромное за помощь! Всё получилось!
To All,
У меня новая неясность.
У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы.
Особенно это видно на часах в раздели секунды, секунды скачат через одну, а то и через две.
Мне кажется что это связанно с временем преобразования!
У меня разрядность термометра стоит на 12 бит, их как я и говорил 2, время преобразования одного равняется 750 мс, а двух 1500 мс.
Как с этим можно бороться не меняя битность термометра?
Может попробовать так:
По идеи этот алгоритм экономит время преобразования в два раза, получается что за один цикл делается одно преобразование.
Есть более перспективные варианты?
Спасибо огромное за помощь! Всё получилось!
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 в вопросах и ответах
Тут уже кто-то выкладывал модифицированную библиотеку ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде"Sounds писал(а):У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Re: CodeVision AVR в вопросах и ответах
dm211 писал(а):Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
Надо просто переписать в соответствующие папки (lib и inc ) недостающие библиотеки и хидеры.
А 2.03 дает больший до 3-5 % Нех , чем 2.04 .4а на 1к-слове , а 2.05 дает еще на ~1 % меньший чем 2.04.4а. и работает на ура .
Re: CodeVision AVR в вопросах и ответах
ValBag писал(а):Тут уже кто-то выкладывал модифицированную библиотеку ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде"Sounds писал(а):У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Никогда не было проблем с этим :
- Вложения
-
- pack.zip
- Либа и хидер для ds18x20
- (1.26 КБ) 200 скачиваний
Re: CodeVision AVR в вопросах и ответах
Немного не то. Ниже с разделением.odesasha писал(а):Никогда не было проблем с этим :
- Вложения
-
- DS18B20_мод_биб_ка.rar
- (1.62 КБ) 211 скачиваний
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
Есть два массива размером 90 каждый, данные из которого, будут только читаться и только в одной функции. Где лучше их определить глобально, локально, eeprom, flash. Если в eeprom и flash то пример как определить и как читать пожалуйста.
«И всё-таки она вертится!»
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Если только чтение, то лучше во flash, конечно, чтоб не тратить ОЗУ(но скорость чтения будет меньше). Если скорость совсем не важна, то можно и в еепром.
Примеры работы с еепром можно найти в ДШ.
-----
Совсем забыл, с кодвижионом вообще ничего делать не надо, для работы с флэш и еепром. Компилятор сам всё умеет, например:
eeprom long int mass1[3] = {1,100500,404}; //создаём массив в eeprom и инициализируем его. Работать как с обычным массивом.
flash long int mass1[3] = {1,100500,404}; //тоже во flash
Примеры работы с еепром можно найти в ДШ.
-----
Совсем забыл, с кодвижионом вообще ничего делать не надо, для работы с флэш и еепром. Компилятор сам всё умеет, например:
eeprom long int mass1[3] = {1,100500,404}; //создаём массив в eeprom и инициализируем его. Работать как с обычным массивом.
flash long int mass1[3] = {1,100500,404}; //тоже во flash