Страница 2 из 3

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 12:52:33
pcb
:tea:
http://easyelectronics.ru/rabota-s-port ... na-si.html

typedef struct Bits_t
{
uint8_t Bit0 :1;
uint8_t Bit1 :1;
uint8_t Bit2 :1;
uint8_t Bit3 :1;
uint8_t Bit4 :1;
uint8_t Bit5 :1;
uint8_t Bit6 :1;
uint8_t Bit7 :1;
}Bits;

#define PortaBits (*((volatile Bits*)&PORTA))
#define LedPin PortaBits.Bit5

int main()
{
DDRA = 1 << 5;
while(1)
{
LedPin = 1;//зажечь
_delay_ms(100);
LedPin = 0;//выключить
_delay_ms(100);
}
}

:tea:

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 13:30:27
ARV
pcb писал(а):http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html
автор хотел продемонстрировать глубину своих знаний С/С++ ? у него получилось в полной мере.

полезная для начинающих информация кончилась, наверное, на третьем абзаце...

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 13:38:57
ARV
pcb писал(а):

Код: Выделить всё

typedef struct Bits_t
{
	uint8_t Bit0 :1;
	uint8_t Bit1 :1;
	uint8_t Bit2 :1;
	uint8_t Bit3 :1;
	uint8_t Bit4 :1;
	uint8_t Bit5 :1;
	uint8_t Bit6 :1;
	uint8_t Bit7 :1;
}Bits;
 
#define PortaBits (*((volatile Bits*)&PORTA))
#define LedPin PortaBits.Bit5
 
int main()
{
	DDRA = 1 << 5;
	while(1)
	{
		LedPin = 1;//зажечь 
		_delay_ms(100);
		LedPin = 0;//выключить
_delay_ms(100);
	}
}
и что это должно демонстрировать? как с моей точки зрения - плохой стиль программирования.

имхо, при помощи дефайнов определить макрос, который визуально не отличается от обычной переменной - это один из способов "найти веревку достаточной длины, чтобы выстрелить себе в ногу".

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 15:05:24
Cyber-master
Я в свое время (лет 12 назад) начинал по страуструпу, керригану и т.п. учебникам изучать С++. Просто как хобби. Еще под досом начинал (с паскаля переходил). Потом, уже под виндами, купил книжку по Win SDK, по ней погнал проги под винду... А когда дошло до контроллеров, первым я взял тиньку 2313, прочитал вдумчиво весь даташит, раза 3, и сел писать. Первая прога, действительно, в блокноте была. С++ в контроллерах такой же точно, а когда компилятор ругнется - погуглить надо)))

Ну и если мне будет позволено подключиться к, гм, срачу извините, спору, я не понимаю, чем неправославно, например, такое:

Код: Выделить всё

#define STATUS_LED PINB.1

...

STATUS_LED = 1;
Это если просто ногой подергать.
[/code]

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 15:21:39
HHIMERA
Дык... ARV уже сказал же... можно спутать с переменной... неинформативно...
Да и макросы... ИМХО... должны быть однозначными... типа...
LED_GREEN_On();
или
LED_RED_Off();

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 15:21:51
ARV
я не зря в предыдущем посте написал про веревку и ногу :)))

мое отношение к стилю программирования сильно изменилось после прочтения книги А.И.Голуба "Веревка достаточной длины, чтобы выстрелить себе в ногу" - рекомендую :)))

в вашем примере макрос хотя бы набран заглавными буквами, что при определенном стиле заставит подозревать, что это не просто переменная... и тем не менее PINB.1 - это в контексте языка Си ошибочная запись. и, на сколько я могу судить, даже для С++ эта запись недопустима. ни у Страуструпа, ни у Кернигана&Ричи вы не найдете ничего подобного, и любой уважающий себя компилятор ЯЗЫКА СИ должен на такую запись реагировать выдачей сообщения об ошибке.

только и всего.

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 15:57:45
c2n
Cyber-master писал(а):я не понимаю, чем неправославно, например, такое:

Код: Выделить всё

#define STATUS_LED PINB.1

...

STATUS_LED = 1;
Это если просто ногой подергать.
Такая конструкция студией не прожевывается.
Именно И соответственно некоторые проекты приходится переписывать заново, разгребая и без того корявый говнокод

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 16:14:30
Cyber-master
Прошу прощения, спутал.. Конечно же, PORTB.1
В CVAVR нормально компилится

Я так понял, вам не нравится ".1" ? Вроде как в стиль языка не попадает?
тогда, может быть:

Код: Выделить всё

#define STATUS_LED 0x80;

PORTB |= (STATUS_LED); // включить 

...

PORTB &= ~(STATUS_LED); //выключить

(пример взят из работы с SREG, управление прерываниями).

Как выбрать веревку не сильно длинную, но и не сильно запутанную?

И еще, на секундочку! С точки зрения классического С++ это может быть и не очень... Но вспомним о том, что мы программируем МК!
И тогда все максимально просто и логично:
В начале кода лежит список define'оф, которые связывают аппаратную и программную части. А ниже по коду уже без привязки к аппаратной чатси.
Разве нет?

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 17:02:34
Siarzhuk
Ну блистать так блистать. ;-)
Cyber-master писал(а):

Код: Выделить всё

#define STATUS_LED 0x80;

PORTB |= (STATUS_LED); // включить 

...

PORTB &= ~(STATUS_LED); //выключить

Скобки лишние. Даже если тело дефайна сложно-составное - даже в этом случае Святые Отцы усердно лупят нас по головам своими посохами дабы тела и параметры в дефайнах скобками окружаемы были во избежание мутно-чтений кода ими злоупотребляща и последующих сквернословий в адрес мараки-автора. Да и точка с запятой финальная в дефайне зело злобно порой кусает аки гадюка седалища наши - попробуй ка за-OR-ить да хотя-бы вот так: STATUS_LED | STATUS_LED. Что, братия, выкусим? ;-) Так отож...

А для наглядности да консистентности ко писаниям даташитным черти заморские так и вообще сдвигом маски определяють:

Код: Выделить всё

#define STATUS_LED (1 << 7) // 7-ой пинъ, ога ...

PORTB |= STATUS_LED; // включить 

...

PORTB &= ~STATUS_LED; //выключить

А вообще, ИМХО, к коду требования как к хорошей книжке - чтобы читать можно было да глазом не спотыкаться о ошибки, чтобы строчки не по бычьим струям ровнялись и чтобы не раскрывалось в каждом абзаце про "конструкционный элемент силикатно-песчаной смеси формы правильного параллелепипеда цветом близким к белому" а писалось по-простому, по-пролетарски "КИРПИЧ". Собираемся строить дом -> определяемся с терминологией -> строим дом не отвлекаясь на хим.состав стройматериалов. Так что дефайны в разумном количестве сильно упрощают жизнь, поддержку и усовершенствование наших продуктов. :-)

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 17:47:04
Cyber-master
Про точку с запятой в дефайне согласен, маху дал-с... проглядел, одним словом.

А насчет сдвигом маски работать - тут полностью поддерживаю, но ведь вопрос удобства он такой же... я вот например отлично вижу что 0х80 это седьмой пин, да и любой программист наверное хотя бы до 0х80 умеет считать в уме, если не совсем быдлокодер.

У меня вопрос то собственно чуть шире. Здесь же на формух читал темы, где люди пытаются структурировать обращение к пинам, такх структур/макросов/ООП/бабушкиных огородов городят что к концу страницы напрочь мозг взрывается. И называют это "удобным", хех. ИМХО понятнее битовой маски вряд ли чего придумаешь. Тем более что насколько я понимаю, аппаратно (ну то бишь на выходе у ккомпилятора) что-то похожее и бывает... Да и в асме так же дела выглядят.
Красивость кода, конечно же, дело зело нужное, но свое-то время нужно беречь! К чему столько лишних сущностей?

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 18:06:04
Noblako
bob1 писал(а):Шпак Ю.А. - Программирование на языке С для AVR и PIC микроконтроллеров
Самая гавенная книга! Беглый справочник, в котором автор захотел в четырехстах страницах описать PIC и AVR архитектуры, все среды программирования, и основы языка Си - получилась невнятная каша!

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 21:52:14
vasylll
Я не спец, я только пытаюсь с очередного захода ...
Вот попадалась не похожих темах ... советы с чего ...
Некоторые высказывались, что с Кернигана&Ричи нельзя начинать.
Что это уже для более подготовленных. И что в качестве первой книги даже вредно.
Другие высказываются, что это библия №1.
Проясните если не так.

Re: Посоветуйте литературу для изучения Си

Добавлено: Пт авг 08, 2014 22:11:38
ARV
Если у вас вообще нет никакого опыта в программировании, то я бы советовал для начала почитать что-то по алгоритмизации (правда сам я хороших книг об этом не встречал).
Если же есть хоть какой-то опыт и термины "подпрограмма", " память", "порт", " бит-байт", "хекс" у вас ступора не вызывают, я могу посоветовать пройти моим путём: взять любую книгу, в которой есть справочник по функциям Си, и читать про эти функции, попутно волей-неволей вы будете привыкать к синтаксису, а встречающиеся в описаниях незнакомые вещи в той же книге находить и усваивать...

Можете попробовать почитать мои статьи про WinAVR, там я и про Си чуток рассказывал, и про функции, и ещё много про что... До Кернигана мне как до Пекина раком, но самое важное старался не упустить. Во всяком случае старался писать в расчёте именно на непрофессионала.

Статьи можете найти на моём сайте http://www.simple-devices.ru первой строкой среди популярного

Re: Посоветуйте литературу для изучения Си

Добавлено: Сб авг 09, 2014 00:36:08
pcb
ARV писал(а):Если у вас вообще нет никакого опыта в программировании, то я бы советовал для начала почитать что-то по алгоритмизации (правда сам я хороших книг об этом не встречал).
Хакерские трюки на с++(не уверен в названии), имхо, стоящая книженция
еще есть книга "С++ практикум" в двух книгах.
Но самая офигенная книга - взять какую либо задачу и решить её на интересующем языке :)Когда не знаешь что лучше или хуже вопросов не возникает
ARV писал(а): как с моей точки зрения - плохой стиль программирования.
Возможно. Мне тоже удобнее и более читаемо, как LEDPORT &=1<<REDLED, больше управляемости и наглядности.
Однако REDLED = 1 пишется быстрее.
Это всё дело привычки и поддержки.

Код: Выделить всё

#define PORT_HALL 	PORTD
#define pPIN_HALL	PIND
	#define PIN_HALL	2
#define PORT_LED	PORTB
	#define PIN_LED		3
#define PORT_IGNIT	PORTB
	#define PIN_IGNIT	4
и где то в коде

Код: Выделить всё

	PORT_IGNIT&=(~(1<<PIN_IGNIT));		//çàðÿæàåì êàòóøêó
Хотя

Код: Выделить всё

	IGNIT = ENIGNIT;		//çàðÿæàåì êàòóøêó
более человечно :tea:

Re: Посоветуйте литературу для изучения Си

Добавлено: Вс авг 10, 2014 21:04:43
Cyber-master
Извините за ИМХО, если нет никакого опыта в программировании, то на мой взгляд, не с С надо начинать - сложОн он для этого. Чего уж не на асме алгоритмы-то изучать...
Я вот в девяностолохматых еще годах начинал с бейсика на БК-0010, потом пересел на турбо, потом на паскаль, и потом только на С. Начинать надо с языка попроще, а потом уже, действительно, просто "словарь" функций следующего языка перечитываешь и готово.

Re: Посоветуйте литературу для изучения Си

Добавлено: Пн авг 11, 2014 12:37:10
ploop
pcb писал(а):Хакерские трюки на с++(не уверен в названии), имхо, стоящая книженция
Если в названии C++ то уже не катит. Ну разные это языки, разные подходы к программированию. И "трюки", как мне кажется, заточены будут на особенности языка. C++ надо использовать только тогда, когда назрела потребность в ООП, иначе бессмысленно.

Re: Посоветуйте литературу для изучения Си

Добавлено: Пн авг 11, 2014 13:33:01
pcb
Как оказалось, она называется "Алгоритмические трюки для программистов" :)
Изображение
вот так выглядит

Re: Посоветуйте литературу для изучения Си

Добавлено: Пн авг 11, 2014 15:08:41
Света

Re: Посоветуйте литературу для изучения Си

Добавлено: Вт авг 12, 2014 09:03:55
Cyber-master
Света, Спасибо!

Re: Посоветуйте литературу для изучения Си

Добавлено: Вт авг 12, 2014 09:14:25
kalobyte
Viper115 писал(а):Желательно, чтобы изложение было доступно для гуманитария
у меня на сцайте есть некоторый материал, но не для гуманитариев, т.к. это ошибочный термин
нету никаких гуманитариев
есть 95%, которые мыслят логическим левым полушарием и им дается легко матан и программирование и есть илита, которая мыслит альтернативно
для таких 95% книг - макулатура и приходится использовать альтернативные методы и подачу материала

такие дела :tea: