CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

ARV писал(а):чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.
Cпасибо за подсказку - все работает.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

как можно определить тип переменной int или float?
Как определить количество символов в переменной?
Как это всё можно сделать без подключения библиотек? Может при помощи ассемблера?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

Sounds, какие исходные данные?
Ставим плюсы: )
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

Вот мои исходные данные:
int i= 17543
Floar c=45.456

Переменные могут меняться в зависимости от программы.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

прошу прощения, зачем Вам узнавать float или int, если у Вас и так они заданы в программе как float и int соответственно. отвечаю Вам в двух ветках, предполагаю что проблемы связаны, но понять не могу зачем Вам это. опять же повторюсь: опишите задачу, для чего Вам считать кол-во знаков, может тут подскажут решение попроще.
конкретно,в этой ветке выше я сам задавался вопросом насчет функции sprinf(), то что она ресурсы жрет неимоверно, так там же и описал возможное решение без нее, через жопу правда, но рабочее. а библиотека stdio.h с функцией sprintf() жрет много за счет своей универсальности.
Ставим плюсы: )
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Sounds писал(а):как можно определить тип переменной int или float?
sizeof (переменная или тип). Возвращает размер, в количестве байт.
Аватара пользователя
andrey_artemov
Встал на лапы
Сообщения: 136
Зарегистрирован: Сб авг 15, 2009 21:26:50
Откуда: Пенза
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение andrey_artemov »

Народ кто нибудь поставил CodeVision AVR 2.05.0
Что нового, стоит ли заменить ею версию по старее ?
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

dm211 писал(а):Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.

эта версия рулит.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение 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) Не выводит числа с плавающей точкой!

Как мне решить эти вопросы?

Спасибо за помощь!
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение 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, остаются ли нули справа, если остаются, их также не выводить. вроде несложно, должно получиться.
Ставим плюсы: )
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

ibiza11
Спасибо за разъяснения!
Я решил делать через функцию sprintf()!
Но как вывести число с плавающей точкой?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение 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. поищите в хелпе.
Ставим плюсы: )
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение 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;
 }


По идеи этот алгоритм экономит время преобразования в два раза, получается что за один цикл делается одно преобразование.
Есть более перспективные варианты?
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Sounds писал(а):У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Тут уже кто-то выкладывал модифицированную библиотеку ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде" :)
Аватара пользователя
odesasha
Прорезались зубы
Сообщения: 237
Зарегистрирован: Пт фев 12, 2010 14:02:22
Откуда: Одесса

Re: CodeVision AVR в вопросах и ответах

Сообщение odesasha »

dm211 писал(а):Я поставил и обратно на 2.03.9 вернулся, на новом библиотек не хватает, DS1307 например.

Надо просто переписать в соответствующие папки (lib и inc ) недостающие библиотеки и хидеры.
А 2.03 дает больший до 3-5 % Нех , чем 2.04 .4а на 1к-слове , а 2.05 дает еще на ~1 % меньший чем 2.04.4а. и работает на ура .
Аватара пользователя
odesasha
Прорезались зубы
Сообщения: 237
Зарегистрирован: Пт фев 12, 2010 14:02:22
Откуда: Одесса

Re: CodeVision AVR в вопросах и ответах

Сообщение odesasha »

ValBag писал(а):
Sounds писал(а):У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы. Как с этим можно бороться не меняя битность термометра?
Тут уже кто-то выкладывал модифицированную библиотеку ds18b20_.*, где функция измерения температуры разделена на преобразование и чтение отдельно. Остается в вашей программе вставить необходимую задержку между ними. Естественно не delay_ms, а по прерыванию от таймера. Тогда всё должно быть в "шоколаде" :)

Никогда не было проблем с этим :
Вложения
pack.zip
Либа и хидер для ds18x20
(1.26 КБ) 200 скачиваний
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

odesasha писал(а):Никогда не было проблем с этим :
Немного не то. Ниже с разделением.
Вложения
DS18B20_мод_биб_ка.rar
(1.62 КБ) 211 скачиваний
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

Есть два массива размером 90 каждый, данные из которого, будут только читаться и только в одной функции. Где лучше их определить глобально, локально, eeprom, flash. Если в eeprom и flash то пример как определить и как читать пожалуйста.
«И всё-таки она вертится!»
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение AI_Disable »

Если только чтение, то лучше во flash, конечно, чтоб не тратить ОЗУ(но скорость чтения будет меньше). Если скорость совсем не важна, то можно и в еепром.
Примеры работы с еепром можно найти в ДШ.
-----
Совсем забыл, с кодвижионом вообще ничего делать не надо, для работы с флэш и еепром. Компилятор сам всё умеет, например:
eeprom long int mass1[3] = {1,100500,404}; //создаём массив в eeprom и инициализируем его. Работать как с обычным массивом.
flash long int mass1[3] = {1,100500,404}; //тоже во flash
Ответить

Вернуться в «AVR»