Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн авг 31, 2020 12:38:00

А так не подойдет:

I = atoi(Mass);

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

Пн авг 31, 2020 12:40:29

Кошмарная проблема! Отнять от значения '0', чтобы из кода цифры получить число, это ведь так сложно...

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

Пн авг 31, 2020 14:10:19

у[х]=а; загружает в массив ровно то, что прилетело в УАРТ
у[х]=а-'0'; перед загрузкой вычтет порядковый номер символа "0", а т.к. цифры идут по порядку - то останется только значение принятого числа... т.е. произойдет преобразование "0"->0, "1"->1, "2"->2... и.т.д.
писал уже... разовью мысль
чтоб принять число нужно:
1) выделить под него переменную соответственного размера (вместо массива)
2) обнулить её до начала приёма посылки у=0;
3) складывать в неё полученные числа: у+=а-'0';
4) не забывать "сдвигать" разряды умножением на 10: у*=10;
(сдвигать лучше сразу перед внесением новой цифры, пусть начальный 0 лишний раз умножится, зато на финише получаем ровно нужное число без лишних условий).

Добавлено after 2 minutes 29 seconds:
П.С. это я продолжил начатую тему... но и тут она в тему .....:)

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

Пн авг 31, 2020 15:03:33

П.С. это я продолжил начатую тему... но и тут она в тему .....:)

Что то не доходит. Смотрите у меня числу знаку '0' соответствует 48. Мне что бы получить из '0'- 0. с умножением что то не зашло. Можно подробнее. То что отдельную временную переменную под это преобразование это мне понятно. Не понятно с умножением

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

Пн авг 31, 2020 15:48:55

mixon46 писал(а): Мне что бы получить из '0'- 0
чтобы получить 0, вам надо из '0' вычесть '0'.

int x = y - '0'; // если y='9', то x будет 9

и не забивайте голову кодами символов - берите символ и им манипулируйте

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

Пн авг 31, 2020 17:51:20

это преобразование очень простое и возможно оно блвагодаря тому, что символы цифр в кодировке идут по порядку
почитайте несколько постов назад я это объяснял

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

Вт сен 01, 2020 15:03:23

это преобразование очень простое и возможно оно блвагодаря тому, что символы цифр в кодировке идут по порядку
почитайте несколько постов назад я это объяснял

Да теперь это понятно. Теперь дошел смысл. Спасибо

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

Пт окт 09, 2020 13:51:49

небольшой лайвхак для пользователей КВАВР (а может и не только, на других не проверял):
раньше я дербанил числа на разряды так:
Код:
while (out>0){
    putchar(out%10+'0');
    out/=10;};
(отдельно делил и отдельно находил остаток)
но, сегодня меня окончательно догнала мысль, о том, что деление и остаток от деления - близнецы братья, а так-же подозрение о том, что квавр нерационально использует ресурсы...
Открываю ассемблеровский листинг программы и вижу, что функция деления (одна и та-же) вызывается дважды, но в качестве результата забирается информация из разных регистров... решил, почему, раз информация всёравно лежит, не забрать её вручную?
т.к. остаток от деления лежит в регистровой паре R26,27, написал функцию:
Код:
unsigned int ostatok (void){#asm("MOVW R30,R26")}
и применил её в коде...
Код:
while (out>0){
    out/=10;
    putchar(ostatok()+'0');}
скорость преобразования ожидаемо выросла в 2 раза.
_____
Уважаемые коты, прошу комментариев: можно ли, и правильно ли так делать? не вылезут, ли какие нибудь подводные грабли?

Добавлено after 21 minute 8 seconds:
сделать в обратной последовательности (сначала остаток, потом вытащить результат деления) не получится, т.к. штатная функция получения остатка затирает результат деления :(

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

Пт окт 09, 2020 14:08:08

Нет гарантии, что нужными регистрами будут всегда именно эти R26 и R30.

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

Пт окт 09, 2020 15:17:15

т.к. деление, это функция и для её выполнения организуется требуемое ей свободное адресное пространство, то я не вижу причин для изменения назначенных регистров... кроме того эта функция одна на всю программу (все деления и остатки вызывают именно её) этот факт ещё больше ограничивает возможность компилятора чтото изменить в функции.
Добавлено after 33 minutes 25 seconds:
П.С. регистры с остатком R26, R27, а регистры R30, R31 это ретурн.

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

Чт окт 15, 2020 20:53:28

из недостатков - квавр не понимает какого типа переменная возвращается и выдает предупреждение.
пока отключил предупреждерия для этой функции:
Код:
#pragma warn-
unsigned int ostatok (void){#asm("MOVW R30,R26")}
#pragma warn+
не знаю правильно ли так делать или есть способ лучше?

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

Чт окт 15, 2020 21:34:50

правильнее и лучше применять стандартную функцию libc: div

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

Пн окт 19, 2020 07:50:26

правильнее и лучше применять стандартную функцию libc: div


Так ее нет в CVAVR :(

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

Пн окт 19, 2020 08:01:35

Лишний повод не использовать нестандартную фигню.

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

Ср янв 06, 2021 16:09:29

Приветствую. Подскажите есть такая запись
return mode > 0.5f;

Возвращает значение mode если больше чем 0.5f?

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

Ср янв 06, 2021 16:33:24

Не значение mode, а true/false

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

Чт янв 07, 2021 09:41:13

Понял. Это как условие. Если больше то true если меньше то false

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

Чт янв 07, 2021 14:03:49

Равно куда то затерялось. Вот они характерные ошибки начинающих.)

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

Вс янв 10, 2021 21:56:02

Вот такой прикол, проект под 2560 и я не могу использовать конструкции типа PINH.2 то есть выше порта G выдает ошибку компиляции.
Никто не сталкивался?

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

Вс янв 10, 2021 22:07:26

Попробуйте по стандартному: (PINH & 1<<2).
Ответить