Easyelectronics.ru

Электроника для всех
Текущее время: 28 фев 2021, 05:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11, 12, 13  След.
Автор Сообщение
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 24 апр 2012, 08:47 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2492
Откуда: Харьков
S_Alex писал(а):

То что надо?

Похоже на то. Сегодня попробую..
По моей задумке все получалось более громоздко.
Всем спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 24 апр 2012, 15:27 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
R_ura писал(а):
Есть у меня некая переменная unsigned int d, скажем.
В нее вносятся значения, кратные 100. ( 800, 900, 1000, 1200, 1300 и т.д.)
В процессе работы программы мне нужно внесенное значение разделить на 2, н опри этом получить значение, опять же кратное 100.
Но вот 1300/2 будет 650, 1500/2 = 750 и т.д.. Мне же нужно этот результат ( скажем 650 или 750) дополнить до кратных 100 (в большую сторону) 700 или 800..
Может есть какой простой способ это сделать в Си? Потому как мне представляется решение только такое - преобразовать число в строку, проверить элемент строки, где может получиться пятерка и если там не ноль, а пять, то добавить 50 к числу в переменной..


Если число заканчивается на 50, то оно не делится на 4. Если заканчивается на 00, то оно делится на 4.
Соответственно проверяем два последних бита на 00, если не нули, то добавляем 50.

Например:
800 = 0b1100100000
800/2 = 800>>1 = 0b110010000
Два последних бита 00, так и оставляем

700 = 0b1010111100
700/2 = 700>>1 = 0b101011110
Два последних бита не 00, значит +50

Ну это при условии, что изначально числа кратные 100


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 25 апр 2012, 00:18 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 650
Откуда: Херсон
Дело было вечером, делать было ...
Сел, подумал над вопросом...

Вот что у меня вышло.
Show


Генерит это:
Show


Если где накосячил, поправте пожалуйста.

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 май 2012, 17:38 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 16 июн 2011, 21:48
Сообщения: 162
Есть ли необходимость массив как volatile объявлять в GCC? (volatile short x[10];) Или компилятор массивы не трогает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 22 май 2012, 00:49 
Старожил

Зарегистрирован: 28 дек 2010, 03:18
Сообщения: 741
Откуда: Оренбург
Если это, например, массив флагов, меняющихся в прерывании, то лишним не будет.

_________________
arogov.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 23 май 2012, 12:50 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 16 июн 2011, 21:48
Сообщения: 162
Ну на всяк случай сделал


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 16 июн 2012, 21:40 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 16 июн 2011, 21:48
Сообщения: 162
Можно ли внутри циклов return использовать? (для AVR-ок, компилятор GCC) Или стек может сорвать (ну если он там используется каким-то боком)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 16 июн 2012, 21:46 
Старожил
Аватара пользователя

Зарегистрирован: 01 фев 2010, 18:05
Сообщения: 422
Bottle писал(а):
Можно ли внутри циклов return использовать? (для AVR-ок, компилятор GCC) Или стек может сорвать (ну если он там используется каким-то боком)?

http://cboard.cprogramming.com/c-progra ... -loop.html
пишут что можно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 16 июн 2012, 22:47 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Bottle писал(а):
Можно ли внутри циклов return использовать? (для AVR-ок, компилятор GCC) Или стек может сорвать (ну если он там используется каким-то боком)?

В С штатно (по return) можно выходить спокойно.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 16 июн 2012, 22:59 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 16 июн 2011, 21:48
Сообщения: 162
PRC, bui спасибо, на душе стало спокойнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 16:22 
Старожил
Аватара пользователя

Зарегистрирован: 15 мар 2010, 00:39
Сообщения: 249
Откуда: Украина, Львов
Возник один не критичный вопросик, который не дает мне спокойно спать. Пишу в avr-gcc.
Короче, есть у нас показания из АЦП Атмеги в 8 битном режиме, то есть значения од 0 до 255. Допустим подключаю я к каналам АЦП акселерометр (работает от 3,3 Вольт, а мега од 5В.), значение минимальной точки акселя, в зависимости од показаний АЦП, составляет 80, а максимум 120 из 255 доступных.
Вопрос: Как "сказать" меге что минимальное значение (80) из акселя, это 0, а максимальное (120), это 100?
То есть мне нужно загнать определенное значение АЦП в рамки од 0 до 100, как это зделать?

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 16:50 
Старожил

Зарегистрирован: 24 окт 2011, 17:29
Сообщения: 2338
Откуда: Украина
x=(ADC-80)*2.5
понятно, что один шаг акселя будет 2,5 единицы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 16:51 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Пересчитать?

Value = (ADC-80)*100/(120-80);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 17:15 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Хм, а я бы опорное напряжение поменял бы.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 17:28 
Старожил
Аватара пользователя

Зарегистрирован: 15 мар 2010, 00:39
Сообщения: 249
Откуда: Украина, Львов
Steel.ne писал(а):
Пересчитать?

Value = (ADC-80)*100/(120-80);

Да, спасибо, ваш вариант оказался более приемлимым.
В предыдущем варианте, тоже все хорошо, но размер кода резко возрос из 8,4% до 24% обема памяти кристала.

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 17:32 
Старожил

Зарегистрирован: 24 окт 2011, 17:29
Сообщения: 2338
Откуда: Украина
хм. да абсолютно одинаковое. просто 100/(120-80) я в уме прикинул, благо цифры удобные. а про целочисленную арифметику забывать не стоит никогда. ;) хто-ж в здравом уме и трезвой памяти будет плавучку без крайней необходимости писать? =0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 17:37 
Старожил
Аватара пользователя

Зарегистрирован: 15 мар 2010, 00:39
Сообщения: 249
Откуда: Украина, Львов
led_fan писал(а):
хм. да абсолютно одинаковое. просто 100/(120-80) я в уме прикинул, благо цифры удобные. а про целочисленную арифметику забывать не стоит никогда. ;) хто-ж в здравом уме и трезвой памяти будет плавучку без крайней необходимости писать? =0

Хз почему обемы кода возрастают так критично, только при одном умножении. Про математику не забил, просто не знал как эту формулу реализовать программно, я только учусь=))

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 17:50 
Старожил

Зарегистрирован: 24 окт 2011, 17:29
Сообщения: 2338
Откуда: Украина
там не просто умножение, а подтягивается библа работы с флоатом, из-за "2,5". со всеми вытекающими.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 июл 2012, 17:51 
Старожил
Аватара пользователя

Зарегистрирован: 15 мар 2010, 00:39
Сообщения: 249
Откуда: Украина, Львов
led_fan писал(а):
там не просто умножение, а подтягивается библа работы с флоатом, из-за "2,5". со всеми вытекающими.

Ааа, теперь все ясно. Спасибо большое за подсказку!

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 01:30 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6835
Откуда: Из тех... Из бывших...
На основании многочисленных холливаров решил познакомиться с С поближе. Начал со статей Хальта на ЕЕ:http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-4.html
Работаю со студией 4.18 и WinAVR20100110. Примеры из "курса", помещенные в C:\PRJ_C\Pinboard_1 в студии билдятся и дебагятся без ошибок. Но я решил пойти дальше и разобраться с топиком уважаемого Kitekat viewtopic.php?p=106060#p106060 . Скопировал в папку C:\PRJ_C\LC-meter-mega8, сделал Make-файл, но при выполнении команды "Build" выдается 14 ошибок, текст типа
Цитата:
../LC-meter-mega8.c:109: error: 'DISABLE_LR' undeclared (first use in this function)
. Подскажите, пожалуйста, как правильно собирать из готовых .h и .c файлов и что конкретно я делаю неправильно.


Вложения:
Комментарий к файлу: Папка с проектом
LC-meter-mega8.7z [11.39 Кб]
Скачиваний: 168
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 01:36 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2011, 14:22
Сообщения: 335
ну так пишет, что 'DISABLE_LR' не определена, потому и ругань....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 02:08 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6835
Откуда: Из тех... Из бывших...
Хорошо, а где и как ее нужно определить? Kiteket выкладывал проект вместе с прошивкой, видимо что-то не приаттачил?
И по этому куску вопросы:
Код:
//#include <avr/iom8.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <compat/deprecated.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <float.h>

#include   "LC-meter-mega8.h"

#include   "lc-lcd.c"

1.<compat/deprecated.h>- это из стандартной либы или отсутствующий кусок, в котором должны были декларироваться функции, на отсутствие которых ругается компилятор? Разобрался
2.Почему #include <avr/interrupt.h> встречается 2 раза?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 02:23 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4945
Откуда: Донецк-Мариуполь
Честно говоря, очень редко я использую отдельно makefile. Для этого надо хорошо в том разбираться, поэтому всегда оставляю его делать автоматически.
А в Студии вообще - только кнопка Build или Build All - и все.

И нету у меня в проекте такой переменной или макроса.
Наверняка как раз в твоем мэйкфайле она присутствует.

P.S. compat/deprecated - это заговочный файл функций, которые сейчас уже устарели, и оставлены для совместимости. Я пользуюсь функциями sbi/cbi для установки битов вместо новомодных _BV.

P.P.S. #include <avr.interrupts.h> два раза - по ошибке.
P.P.P.S. float.h - вообще надо выбросить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 02:36 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6835
Откуда: Из тех... Из бывших...
kitekat писал(а):
...
И нету у меня в проекте такой переменной или макроса.
Наверняка как раз в твоем мэйкфайле она присутствует.

...
P.P.P.S. float.h - вообще надо выбросить.

Ок, убил папку, скачал твой архив, создал заново. Тот же результат. А переменная (или макрос) есть:
Код:
   ...while(1)
   {
      if ( Mode == MODE_MEASURE_CAP && ChangedMode )
      {
         DISABLE_LR;
         ENABLE_CAP;
         lcd_clear();
         lcd_gotoxy(0,0);
         lcd_puts(StringCAP);
         ChangedMode = 0;
      }
      else if ( ChangedMode )
      {
         DISABLE_CAP;
         ENABLE_LR;
         lcd_clear();
         lcd_gotoxy(0,0);
         if ( Mode == MODE_MEASURE_IND )
            lcd_puts(StringIND);
         else if ( Mode == MODE_MEASURE_RES )
            lcd_puts(StringRES);

         ChangedMode = 0;
      }...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 02:45 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4945
Откуда: Донецк-Мариуполь
Да, вкралась ошибка, наверное...
Это старый файл, я его уже давно переделал.

Попробуй вот этот. Только его нужно переименовать - убрать "-2".


P.S. Только вот соответствует рабочая прошивка этому файлу - не помню, чесслово...


Вложения:
LC-meter-mega8-2.c [12.42 Кб]
Скачиваний: 654
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11, 12, 13  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB