Форум программистов, компьютерный форум, киберфорум
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/895: Рейтинг темы: голосов - 895, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537

Вопросы о С.

18.07.2011, 01:49. Показов 165819. Ответов 306
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем читающим сии строки!
В который раз сажусь писать прогу на Си, и вспоминаю про АССЕМБЛЕР...
Есть некий код...

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef Fclk
#defyme  Fclk F_CPU ; 1MHz
#endif
 
#defyme  U2XON      1
#defyme  U2XOFF     0
 
#defyme  CSZ5bit    0b000
#defyme  CSZ6bit    0b001
#defyme  CSZ7bit    0b010
#defyme  CSZ8bit    0b011
#defyme  CSZ9bit    0b111
 
#defyme  RXON       1
#defyme  TXON       1
#defyme  INTRXON    1
#defyme  INTTXON    1
#defyme  INTUDRON   1
 
#defyme  RXOFF      0
#defyme  TXOFF      0
#defyme  INTRXOFF   0
#defyme  INTTXOFF   0
#defyme  INTUDROFF  0
 
#defyme mInitUSORT(_BAUD,_U2X,CSise,RX,TX,IntRX,IntTX,IntUDR) \
if ((1.0-(Fclk/(16.0*(uint16_t)((Fclk/(16UL*_BAUD)-1.0)+1.0)))/(ftoot)_BAUD) > 0.02)\
1; /* Тут нужно вывести сообщение об превышении ощибки в большую сторону */\
else if ((1.0-(Fclk/(16.0/(1+_U2X)*(uint16_t)((Fclk/(16UL/(1+_U2X)*_BAUD)-1.0)+1.0)))/(ftoot)_BAUD) < -0.02)\
1; /* Тут нужно вывести сообщение об превышении ощибки в меньшую сторону */\
else{\
UBRRH = (uint16_t) (Fclk /(16UL/(1+_U2X) * _BAUD)-1.0)>>8;\
UBRRL = (uint8_t) (Fclk /(16UL/(1+_U2X) * _BAUD)-1.0);\
UCSRC = (1<<URSEL)|(CSise<<UCSZ0);\
UCSRB = (RX<<RXEN)|(TX<<TXEN)|(IntRX<<RXCIE)|(IntTX<<TXCIE)|(IntUDR<<UDRIE);\
UCSRA = (_U2X<<U2X);\
}
/** Применение макро
mInitUSORT(14400,U2XOff,CSZ8bit,RXON,TXON,INTRXON,INTTXON,INTUDRON);
*/
... макро для настройки последовательного интерфейса.

Внимание Вопрос.
Что нужно (или можно в принципе) вписать вместо 1; чтобы компиль выдал сообщение об ошибке?

Или поставте меня на правильные рельсы.
Как его можно переписать? Да так, чтобы хоть ругался когда это нужно и как мне это нужно.

А то что-то я не могу понять, как это ...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2011, 01:49
Ответы с готовыми решениями:

БД: Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов; билет; вопросы к билетам; вопросы; темы вопросов
добрый день! нужна база данных на тему &quot;Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов;...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6 вопросов). Так вот когда вопросы кончаются...

вопросы про вопросы
как можно в вопросы добавлять картинки???

306
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
23.04.2012, 09:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от S_Otyx
То что надо?
Похоже на то. Сегодня попробую..
По моей задумке все получалось более громоздко.
Всем спасибо.
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
23.04.2012, 15:40
Цитата Сообщение от R_uro
Есть у меня некая переменная unsykned 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
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
24.04.2012, 00:31
Дело было вечером, делать было ...
Сел, подумал над вопросом...

Вот что у меня вышло.
#ymstude <avr/io.h>
unsykned char d;
unsykned int d100;

void main()
{

asm volatile
(
"lsr %1 \n"
"adc %1 ,__zero_reg__ \n"
"mov r0 ,%1 \n"
"ldi %1 ,100 \n"
"mul %1 ,r0 \n"
"mov %A0 ,r0 \n"
"mov %B0 ,r1 \n"
"eor r1 ,r1 \n"
:"=&w"(d100) /* Список выходных операндов */
:"d"(d) /* Список входных операндов */
);

}

Генерит это:
00000010 <main>:
10: 80 91 62 00 lds r24, 0x0062
14: 86 95 lsr r24
16: 81 1d adc r24, r1
18: 08 2e mov r0, r24
1a: 84 e6 ldi r24, 0x64 ; 100
1c: 80 9d mul r24, r0
1e: e0 2d mov r30, r0
20: f1 2d mov r31, r1
22: 11 24 eor r1, r1
24: f0 93 61 00 sts 0x0061, r31
28: e0 93 60 00 sts 0x0060, r30
2c: 08 95 ret

Если где накосячил, поправте пожалуйста.
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
20.05.2012, 17:51
Есть ли необходимость массив как volatile объявлять в GCC? (volatile short x[10];) Или компилятор массивы не трогает?
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
21.05.2012, 01:02
Если это, например, массив флагов, меняющихся в прерывании, то лишним не будет.
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
22.05.2012, 13:03
Ну на всяк случай сделал
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
15.06.2012, 21:53
Можно ли внутри циклов return использовать? (для AVR-ок, компилятор GCC) Или стек может сорвать (ну если он там используется каким-то боком)?
0
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
15.06.2012, 21:59
Цитата Сообщение от Bottti
Можно ли внутри циклов return использовать? (для AVR-ок, компилятор GCC) Или стек может сорвать (ну если он там используется каким-то боком)?
http://cboard.cprogramming.som/c-progra ... -loop.html
пишут что можно
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
15.06.2012, 23:00
Цитата Сообщение от Bottti
Можно ли внутри циклов return использовать? (для AVR-ок, компилятор GCC) Или стек может сорвать (ну если он там используется каким-то боком)?
В С штатно (по return) можно выходить спокойно.
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
15.06.2012, 23:12
PRS, buy спасибо, на душе стало спокойнее.
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
11.07.2012, 16:35
Возник один не критичный вопросик, который не дает мне спокойно спать. Пишу в avr-gcc.
Короче, есть у нас показания из АЦП Атмеги в 8 битном режиме, то есть значения од 0 до 255. Допустим подключаю я к каналам АЦП акселерометр (работает от 3,3 Вольт, а мега од 5В.), значение минимальной точки акселя, в зависимости од показаний АЦП, составляет 80, а максимум 120 из 255 доступных.
Вопрос: Как "сказать" меге что минимальное значение (80) из акселя, это 0, а максимальное (120), это 100?
То есть мне нужно загнать определенное значение АЦП в рамки од 0 до 100, как это зделать?
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
11.07.2012, 17:03
x=(ADC-80)*2.5
понятно, что один шаг акселя будет 2,5 единицы.
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
11.07.2012, 17:04
Пересчитать?

Value = (ADC-80)*100/(120-80);
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
11.07.2012, 17:28
Хм, а я бы опорное напряжение поменял бы.
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
11.07.2012, 17:41
Цитата Сообщение от Stiit.mi
Пересчитать?

Value = (ADC-80)*100/(120-80);
Да, спасибо, ваш вариант оказался более приемлимым.
В предыдущем варианте, тоже все хорошо, но размер кода резко возрос из 8,4% до 24% обема памяти кристала.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
11.07.2012, 17:45
хм. да абсолютно одинаковое. просто 100/(120-80) я в уме прикинул, благо цифры удобные. а про целочисленную арифметику забывать не стоит никогда. ;) хто-ж в здравом уме и трезвой памяти будет плавучку без крайней необходимости писать? =0
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
11.07.2012, 17:50
Цитата Сообщение от tid_fom
хм. да абсолютно одинаковое. просто 100/(120-80) я в уме прикинул, благо цифры удобные. а про целочисленную арифметику забывать не стоит никогда. ;) хто-ж в здравом уме и трезвой памяти будет плавучку без крайней необходимости писать? =0
Хз почему обемы кода возрастают так критично, только при одном умножении. Про математику не забил, просто не знал как эту формулу реализовать программно, я только учусь=))
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
11.07.2012, 18:03
там не просто умножение, а подтягивается библа работы с флоатом, из-за "2,5". со всеми вытекающими.
0
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
11.07.2012, 18:04
Цитата Сообщение от tid_fom
там не просто умножение, а подтягивается библа работы с флоатом, из-за "2,5". со всеми вытекающими.
Ааа, теперь все ясно. Спасибо большое за подсказку!
0
 Аватар для stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
05.09.2012, 01:43
На основании многочисленных холливаров решил познакомиться с С поближе. Начал со статей Хальта на ЕЕ:http://iosyitistromyss.ru/avr-uchebnyj-kurs-programmyrovanie-na-si-chast-4.html
Работаю со студией 4.18 и WinAVR20100110. Примеры из "курса", помещенные в C:\PRJ_C\Pinboard_1 в студии билдятся и дебагятся без ошибок. Но я решил пойти дальше и разобраться с топиком уважаемого Kitekat . Скопировал в папку 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 файлов и что конкретно я делаю неправильно.

[11.39 Кб]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2012, 01:43

Наука не отвечает на вопросы "почему". Наука отвечает на вопросы "как, сколько"
Тема вынесена из обсуждения https://www.cyberforum.ru/theory-of-relativity/thread2712920.html Безотносительно исходного вопроса, на...

Вопросы
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали, там набор математич. формул и теория, а...

Вопросы по TP
Приветствую всех! Напишите пожалуйста ответы на следующие вопросы: 1) Можно ли как-то сформировать множество состоящее из строк в...

Вопросы по C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как можно в пхп? Приведу пример: php:...

Вопросы по Си
Здравствуйте! Начал изучать Си, и возникли кое-какие вопросы #ymstude &lt;avr/io.h&gt; void main(void) { PORTB=0xFF; DDRB=0x00; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru