CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
А так не подойдет:
I = atoi(Mass);
I = atoi(Mass);
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Кошмарная проблема! Отнять от значения '0', чтобы из кода цифры получить число, это ведь так сложно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3884874#p3884874"]у[х]=а; загружает в массив ровно то, что прилетело в УАРТ
у[х]=а-'0'; перед загрузкой вычтет порядковый номер символа "0", а т.к. цифры идут по порядку - то останется только значение принятого числа... т.е. произойдет преобразование "0"->0, "1"->1, "2"->2... и.т.д.[/uquote] писал уже... разовью мысль
чтоб принять число нужно:
1) выделить под него переменную соответственного размера (вместо массива)
2) обнулить её до начала приёма посылки у=0;
3) складывать в неё полученные числа: у+=а-'0';
4) не забывать "сдвигать" разряды умножением на 10: у*=10;
(сдвигать лучше сразу перед внесением новой цифры, пусть начальный 0 лишний раз умножится, зато на финише получаем ровно нужное число без лишних условий).
Добавлено after 2 minutes 29 seconds:
П.С. это я продолжил начатую тему... но и тут она в тему .....
у[х]=а-'0'; перед загрузкой вычтет порядковый номер символа "0", а т.к. цифры идут по порядку - то останется только значение принятого числа... т.е. произойдет преобразование "0"->0, "1"->1, "2"->2... и.т.д.[/uquote] писал уже... разовью мысль
чтоб принять число нужно:
1) выделить под него переменную соответственного размера (вместо массива)
2) обнулить её до начала приёма посылки у=0;
3) складывать в неё полученные числа: у+=а-'0';
4) не забывать "сдвигать" разряды умножением на 10: у*=10;
(сдвигать лучше сразу перед внесением новой цифры, пусть начальный 0 лишний раз умножится, зато на финише получаем ровно нужное число без лишних условий).
Добавлено after 2 minutes 29 seconds:
П.С. это я продолжил начатую тему... но и тут она в тему .....
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3886086#p3886086"]П.С. это я продолжил начатую тему... но и тут она в тему .....
[/uquote]
Что то не доходит. Смотрите у меня числу знаку '0' соответствует 48. Мне что бы получить из '0'- 0. с умножением что то не зашло. Можно подробнее. То что отдельную временную переменную под это преобразование это мне понятно. Не понятно с умножением
Что то не доходит. Смотрите у меня числу знаку '0' соответствует 48. Мне что бы получить из '0'- 0. с умножением что то не зашло. Можно подробнее. То что отдельную временную переменную под это преобразование это мне понятно. Не понятно с умножением
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
чтобы получить 0, вам надо из '0' вычесть '0'.mixon46 писал(а): Мне что бы получить из '0'- 0
int x = y - '0'; // если y='9', то x будет 9
и не забивайте голову кодами символов - берите символ и им манипулируйте
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
это преобразование очень простое и возможно оно блвагодаря тому, что символы цифр в кодировке идут по порядку
почитайте несколько постов назад я это объяснял
почитайте несколько постов назад я это объяснял
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3886191#p3886191"]это преобразование очень простое и возможно оно блвагодаря тому, что символы цифр в кодировке идут по порядку
почитайте несколько постов назад я это объяснял[/uquote]
Да теперь это понятно. Теперь дошел смысл. Спасибо
почитайте несколько постов назад я это объяснял[/uquote]
Да теперь это понятно. Теперь дошел смысл. Спасибо
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
небольшой лайвхак для пользователей КВАВР (а может и не только, на других не проверял):
раньше я дербанил числа на разряды так: (отдельно делил и отдельно находил остаток)
но, сегодня меня окончательно догнала мысль, о том, что деление и остаток от деления - близнецы братья, а так-же подозрение о том, что квавр нерационально использует ресурсы...
Открываю ассемблеровский листинг программы и вижу, что функция деления (одна и та-же) вызывается дважды, но в качестве результата забирается информация из разных регистров... решил, почему, раз информация всёравно лежит, не забрать её вручную?
т.к. остаток от деления лежит в регистровой паре R26,27, написал функцию: и применил её в коде... скорость преобразования ожидаемо выросла в 2 раза.
___________________
Уважаемые коты, прошу комментариев: можно ли, и правильно ли так делать? не вылезут, ли какие нибудь подводные грабли?
Добавлено after 21 minute 8 seconds:
сделать в обратной последовательности (сначала остаток, потом вытащить результат деления) не получится, т.к. штатная функция получения остатка затирает результат деления
раньше я дербанил числа на разряды так:
Код: Выделить всё
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');}___________________
Уважаемые коты, прошу комментариев: можно ли, и правильно ли так делать? не вылезут, ли какие нибудь подводные грабли?
Добавлено after 21 minute 8 seconds:
сделать в обратной последовательности (сначала остаток, потом вытащить результат деления) не получится, т.к. штатная функция получения остатка затирает результат деления
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Нет гарантии, что нужными регистрами будут всегда именно эти R26 и R30.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
т.к. деление, это функция и для её выполнения организуется требуемое ей свободное адресное пространство, то я не вижу причин для изменения назначенных регистров... кроме того эта функция одна на всю программу (все деления и остатки вызывают именно её) этот факт ещё больше ограничивает возможность компилятора чтото изменить в функции.
Добавлено after 33 minutes 25 seconds:
П.С. регистры с остатком R26, R27, а регистры R30, R31 это ретурн.
Добавлено after 33 minutes 25 seconds:
П.С. регистры с остатком R26, R27, а регистры R30, R31 это ретурн.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
из недостатков - квавр не понимает какого типа переменная возвращается и выдает предупреждение.
пока отключил предупреждерия для этой функции:не знаю правильно ли так делать или есть способ лучше?
пока отключил предупреждерия для этой функции:
Код: Выделить всё
#pragma warn-
unsigned int ostatok (void){#asm("MOVW R30,R26")}
#pragma warn+Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
правильнее и лучше применять стандартную функцию libc: div
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
[uquote="ARV",url="/forum/viewtopic.php?p=3907425#p3907425"]правильнее и лучше применять стандартную функцию libc: div[/uquote]
Так ее нет в CVAVR
Так ее нет в CVAVR
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Лишний повод не использовать нестандартную фигню.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
Приветствую. Подскажите есть такая запись
return mode > 0.5f;
Возвращает значение mode если больше чем 0.5f?
return mode > 0.5f;
Возвращает значение mode если больше чем 0.5f?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Не значение mode, а true/false
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
Понял. Это как условие. Если больше то true если меньше то false
Re: CodeVision AVR в вопросах и ответах
Равно куда то затерялось. Вот они характерные ошибки начинающих.)
Re: CodeVision AVR в вопросах и ответах
Вот такой прикол, проект под 2560 и я не могу использовать конструкции типа PINH.2 то есть выше порта G выдает ошибку компиляции.
Никто не сталкивался?
Никто не сталкивался?
Re: CodeVision AVR в вопросах и ответах
Попробуйте по стандартному: (PINH & 1<<2).