Изучаем язык Си (Learn C language)

Русскоязычный форум SECU-3 по общим вопросам. General discussion in Russian language. English sub-forum.

Moderator: STC

teuer
DIP8 - Involved
Posts: 27
Joined: Tue Jul 26, 2011 9:01 am

Re: Изучаем язык Си (Learn C language)

Post by teuer »

Makefile прицепить не удается, пришлось упаковать.
Totalcommander это должен открыть.
Attachments
Makefile.gz
(1.11 KiB) Downloaded 941 times
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: Изучаем язык Си (Learn C language)

Post by STC »

Мой GCC говорит
cc1: error: unrecognized command line option "-flto"
gcc version 4.3.5 (GCC)


Наверное моя версия старая. Где ты взял более новую версию?
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
teuer
DIP8 - Involved
Posts: 27
Joined: Tue Jul 26, 2011 9:01 am

Re: Изучаем язык Си (Learn C language)

Post by teuer »

Сначала я использовал аналогичную опцию
CFLAGS += --combine -fwhole-program

Но в версии 4.6. она перестала работать, ее именно в этой версии заменили на -flto
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

не могу понять строчку ...
ROUND(x) ((int16_t) ( (x) + 0.5 - ( (x) < 0 ) ))

вызываеться она так ROUND((t)*4) где t температура в градусах сельсия , 4 константа получения из десикретности....

я думаю что работает так , например 30 градусов , умножаем на 4 =120 , передаем в ROUND он считает , 120+0.5 = 120.5 , число 120 - больше 0 , так как стоит int16_t то округляем в меньшую сторону -- итог 120 ...
теперь !!!!! 0 градусов !!!! 0*4 = 0 , передаем в ROUND 0 , 0+0.5 =0.5 число не меньше 0 , так как itn16_t округляем получаем итог 0!!!!!
теперь самое непонятное!!!!
-30!!!! -30 * 4 = -120 , передаем , -120+0.5= -119.5 , 120 меньше 0 , значить -119.5 - -120 = +0.5 , так как int16_t откругляем получаем СНОВА 0 !!!!!!! блин .. как так? ....
извиняюсь что тупой такой )
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ender11
LQFP112 - Up with the play
Posts: 197
Joined: Sat Dec 11, 2010 4:05 pm

Re: Изучаем язык Си (Learn C language)

Post by ender11 »

хочу заметить, что для atmega16 gcc 3.4.6 ничем не хуже, чем более новые версии, а компилирует лучше.
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

кажеться в понял!!!!!!!!!!!!! это форумулу .... она 0.5 прибаваляет когда число больше нуля и ОТнимает когда число меньше нуля!!! да ? я прав? обученю подлежу ? :)
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: Изучаем язык Си (Learn C language)

Post by STC »

Stranger21
0.5 прибавляется для округления к ближайшему целому.
Выражение ( (x) < 0 ) дает результат 0 или 1 в зависимости от того x >= 0 или x < 0
(int16_t) - отсекает дробдую часть

Примеры:
t = -30 градусов;
-30 * 4 = -120; -120 + 0.5 - 1 = -120.5; ((int16_t) (-120.5)) = -120
t = 30 градусов;
30 * 4 = 120; 120 + 0.5 - 0 = 120.5; ((int16_t) (120.5)) = 120
t = 10.2 градусов;
10.2 * 4 = 40.8; 40.8 + 0.5 - 0 = 41.3; ((int16_t) (41.3)) = 41
t = -10.2 градусов;
-10.2 * 4 = -40.8; -40.8 + 0.5 - 1 = -41.3; ((int16_t) (-41.3)) = -41
t = 0 градусов;
0 * 4 = 0; 0 + 0.5 - 0 = 0.5; ((int16_t) (0.5)) = 0 (0 и в Африке 0!)

Достаточно?
И пожалуйста, еще раз прошу, оформляй аккуратно свои рассуждения и формулы, иначе я их читать не буду (глаза дороже)!
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

спасибо , к концу рабочего дня я сам дошел до этого , пол дня думал над формулой ((( ну зачем так сокращать ( кошмар . не успел отписать просто что понял сам ....

последний вопрос --- отрицательное число это положительной число с обратной строны - это число? тоесть например -2 если только 4 бита переменная будет выглядеть как FF -2 = FE правильно? ну 16 бит соответсвенно
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: Изучаем язык Си (Learn C language)

Post by STC »

Это хорошо что понял. Теперь тебе будет проще, когда ты почувствуешь...
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Изучаем язык Си (Learn C language)

Post by Stranger21 »

я опять с глупыми вопросами
1 как определяются порты ? вот например стартер
PORTD|= _BV(PD7);
DDRD |= _BV(DDD7);
что это значит? что то не совсем понял :) ну понял что нужно делать также если хочу какой то порт использовать )

я хочу в общем подключить РХХ свой . мне нужно две ножки , потом будет драйвер , 0 1 на ножках и их комбинация будут вращать моторчик в обе стороны
для этого мне нужен таймер чтобы задавать время
я так понял что есть виртуальные таймеры например один из них
s_timer_update(idle_period_time_counter);
не совсем понял как он работает . но мне его должно хватить . один тик его равен 10мс . правильно ли я думаю что
если поставлю в него 1 то через 10 мс он станет равным 0 и s_timer_is_action станет равным 0
блин .. наверное сейчас опять напишу много слов (
я собираюсь вызывать процедуру обработки движения РХХ в том же месте где сейчас РХХ по УОЗ.
у меня вопрос - как часто туда программа попадает? . то есть если я задам 1 тик таймера , я его с какой точностью увижу?
получается эти таймеры считают себе там где то не мешая работе программы и видеть результат можно только по факту
я еще пока не знаю как мне двигать мой РХХ нужно сколько ему времени нужно и так далее . опытным путем буду вычислять .
пригодились бы переменные от менеджера в программу .

да еще вопрос вот как сделать инициализацию этого рхх , то есть там же где производиться инициализация портов нужно его выдвигуть ...
блин ... много написал ... (((
чтото пока все не складывается в голове ...
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
Post Reply