Перейти к содержанию

С нуля Программирование AVR Купил программатор и Контроллер Что дальше...


Рекомендуемые сообщения

19 минут назад, demiurg1978 сказал:

Планирование. ТЗ

Обеими руками поддерживаю!

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

Ссылка на комментарий
Поделиться на другие сайты

Цитата

Пока код выглядит так:

ШИМ не исправлен. Форматирование отсутствует. Опрос кнопок кривой. Период обновления ШИМ и кнопок даже приблизительно не фиксирован и зависит от погоды на Марсе.

Еще раз советую привязать глобальный счетчик времени к таймеру:

volatile uint8_t global_time = 0; //8-битный глобальный счетчик времени

ISR(TIMER1_COMPA_vect){
  global_time++;
}

и используйте его для формирования ШИМ в бесконечном цикле. Там его надо только сравнивать с порогами, не меняя.

Цитата

Если я перемешаю опрос кнопок и отсчёт периода, то период всё равно будет плавать тогда, когда будет выполняться приращение импульса при нажатой кнопке...

При добавлении кода в бесконечный цикл время каждого прохода будет меняться, но в среднем время каждого будет постоянным - просто за счет того что замедлиться может как импульс высокого, так и низкого уровня. А в вашем случае замедляется только время низкого уровня.

Кроме того, стоит добавить в бесконечный цикл "тупую" задержку (_delay_us), чтобы время прохода определялось в основном делеем, а не непредсказуемой комбинацией условий. В данном случае такая задержка допустима, поскольку бесконечный цикл выполняется не в реальном времени - его в любой момент могут прервать внешние события, сам он может выполняться разное время при разных входных условиях (нажата ли та или иная кнопка, или достигнуто совпадение счетчика с величиной ШИМа).

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Нет, я бы счетчик времени не держал бы в прерывании, ведь в программе он может изменится в любой самый неудобный момент. Лучше использовать таймер для того чтобы обозначить начало цикла. Как прерывание - так начало цикла, а код пусть отработает и ждет следующего. В любом случае чтобы не было пропусков и там и там необходимо чтобы код выполнился быстрее чем наступит следующий цикл, а в первом случае имеем ещё и неожиданное изменение значения переменной. Впринципе пусть счетчик будет в прерывании, только основной бесконечный цикл надо синхронизировать с таймером, чтобы код выполнялся гарантированно после инкремента global_time и в коде небыло нежданчиков.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, COKPOWEHEU сказал:

используйте его для формирования ШИМ в бесконечном цикле. Там его надо только сравнивать с порогами, не меняя

Но ведь в этом случае логичнее все это делать прямо в обработчике прерываний таймера... уж проще будет точно.

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Йооопт!!! Я вспоминаю, как сам мучался с опросом кнопок. Но и с ваших советов хочется головой об стол биться. Господа, обработчики прерываний должны быть максимально быстрыми и лаконичными. На хрена вы новичка учите забивать прерывания? Настраиваем один таймер на ШИМ, второй на 1 мс. В прерывании пусть крутится переменная-счетчик либо выставляется флаг. В основном цикле смотрим на значение переменная-счетчика либо на флаг.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну, это вы всё, на верное, правильно говорите, только непонятно.)

Но тем не менее оно работает. Може быть внутри оно неправильное, но снаружи - вполне.

Спасибо всем, кто вольно или не вольно помог сделать первый шаг. ))

 

 

 

 

 

 

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

54 минуты назад, ARV сказал:

Но ведь в этом случае логичнее все это делать прямо в обработчике прерываний таймера... уж проще будет точно.

Знаю, но это помешает лепить ненужные циклы. После глобального счетчика времени его было бы легко сделать локальным.

36 минут назад, pliss сказал:

Спасибо всем, кто вольно или не вольно помог сделать первый шаг. ))

То есть учиться вы не желаете? Достаточно наляпать говнокода

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, COKPOWEHEU сказал:

То есть учиться вы не желаете?

Желаю. И учусь.

Сначала хочу научиться организовывать многоканальный шим без аппаратного таймера.

3 часа назад, COKPOWEHEU сказал:

Достаточно наляпать говнокода

Это у меня пройдёт. У вас же прошло.)

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

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, pliss сказал:

хочу научиться организовывать многоканальный шим без аппаратного таймера

Если решать эту задачу на Си, то я отнес бы её к категории задач повышенной сложности, достойной виртуозов битов и машинных тактов.

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

Ссылка на комментарий
Поделиться на другие сайты

Шутите? Если не требуется особой точности, хватит десятка строк кода. Впрочем, особую точность без таймера (или любого другого прерывания, которое можно настроить на регулярное срабатывание - АЦП, SPI, UART) все равно не получить.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Только что, COKPOWEHEU сказал:

Шутите?

Нет. Я ведь не ввожу оговорки "если не требуется..."

ШИМ с плавающей частотой - я даже не могу подобрать точного термина для обозначения такой модуляции... А нормальный ШИМ потребует специфических усилий по обеспечению одинаковой длительности исполнения разных ветвей кода, что на Си без анализа ассемблерного листинга и "подгонки кода по месту" вообще нереализуемо. И код в итоге будет не просто не портируемым, а особо зависимым от массы свойств конкретного компилятора.

Если вы называете решение этой задачи простым - я снимаю шляпу перед вашим талантом.

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

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, ARV сказал:

Если решать эту задачу на Си, то я отнес бы её к категории задач повышенной сложности, достойной виртуозов битов и машинных тактов.

Это от условий задачи зависит. Если в условии есть требование о строгом поддержании частоты импульсов и строгой точности приращения их на любом шаге исполнения кода - это да.

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

 

 

 

 

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Только что, pliss сказал:

я никак не могу донести до коллег

А вы попробуйте формулировать менее абстрактные, короткие конкретные вопросы, исключающие свободное домысливание. Хотя в этом случае вас скорее всего направят читать литературу... :rolleyes:

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

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, ARV сказал:

на Си без <...> "подгонки кода по месту"

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

Единственное, что сложнее победить, при использовании целочисленных переменных - это абсолютную разницу в ширине импульса... Но можно.

Скрытый текст

#define F_CPU 8000000UL
#include  <avr/io.h>

int main()

{	
	DDRB = 0x00;//кнопки
	PORTB = 0xFF;//кнопки с резисторами
	DDRD = 0xFF;//выход шим
	PORTD = 0x00;//выход шим низкий
	int  port_state = PINB;//переменная состояния порта
	int t_on0 = 2;//время высокого уровня PORTD0 
	int t_on1 = 2;//время высокого уровня PORTD1
	int contact_chatter_counter = 0;//счётчик числа периодов для антидребезга 
	char enable = 1;//разрешение приращения высокого уровня
	int T_counter = 0;//счётчик периода	
	const int T_const = 260;//период	

	while(1)//бесконечный цикл
	
	{	//==========подсчёт периодов шим перед опросом кнопок=============		
		if(!(contact_chatter_counter & 0b00000111))//каждые 8 периодов
		
		{
			port_state = PINB;//запоминаем состояние PORTB
			contact_chatter_counter++;//изменяем счётчик подсчёта периодов
		}	
       //=====================период======================================		
		if(T_counter>=T_const)//определение начала периода шим
		
		{	
			contact_chatter_counter++;//подчёт количества периодов
			T_counter = 0;//сброс счётчика периода
			PORTD = 0xFF;//включаем все каналы
		}
		
		else//отсчёт одного периода

		{   //================кнопки канала PORTD0========================		
			if(!(port_state&(1<<PORTD0)))//если нажат "+"

			{
				if(enable)//если разрешено приращение, 

				{
					if(T_const>=(t_on0<<1))//если есть возможность расширения импульса

					{
						T_counter++;	
						t_on0 = (t_on0<<1);//расширяем импульс PORTD0
						enable = 0;//запрещаем приращение
					}
				}
			}                                           	

			if(!(port_state&(1<<PORTD1)))//если нажат "-" 

			{
				if(enable)//если разрешено приращение

				{
					if(1<=(t_on0>>1))//если есть возможность расширения импульса

					{
						T_counter--;	
						t_on0 = (t_on0>>1);//сужаем импульс PORTD0
						enable = 0;//запрещаем приращение
					}
				}
			}		
			//================выключение канала PORTD0=============================
			if(T_counter==t_on0)//если счётчик периода равен ширине импульса PORTD0

			{
				PORTD&=~(1<<PORTD0);//выключаем PORTD0		
			}
			//====================кнопки канала PORTD1==============================
			if(!(port_state&(1<<PORTD2)))//если нажат "+" 

			{
				if(enable)//если разрешено приращение

				{
					if(T_const>=(t_on1<<1))//если есть возможность расширения импульса
					
					{
						T_counter++;	
						t_on1 = (t_on1<<1);//расширяем импульс PORTD1
						enable = 0;//запрещаем приращение
					}
				}
			}	

			if(!(port_state&(1<<PORTD3)))//если нажат "-" 

			{
				if(enable)//если разрешено приращение

				{
					if(1<=(t_on1>>1))//если есть возможность расширения импульса				

					{
						T_counter--;	
						t_on1 = (t_on1>>1);//сужаем импульс PORTD1
						enable = 0;//запрещаем приращение
					}
				}
			}				
			//================выключение канала PORTD1====================

			if(T_counter==t_on1)//если счётчик периода равен ширине импульса PORTD1

			{
				PORTD&=~(1<<PORTD1);//выключаем PORTD1
			}									
		}

		T_counter++;//считаем период				
		if(port_state==0xFF)//если кнопки отпущены

		{
			enable = 1;//разрешаем изменение
		}
	}
}

 

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Жаль, что прочитав мою статью вы не стали следовать её рекомендациям... читабельность кода никакая, не смотря на старания по выбору имен переменных...

#define PWM1	0
#define PWM2	1
#define PWM_PORT	PORTB
  
uint8_t counter;
uint8_t pwm1=0;
uint8_t pwm2=0;
uint8_t port;

static void modify_byte(uint8_t *byte, int8_t delta){
  int16_t tmp = *byte;
  tmp += delta;
  if(tmp < 0) tm = 0;
  if(tmp > 255) tmp = 255;
  *byte = tmp;
}

int main(void){
  while(1){
    port = 0;
    if(pwm1 > counter) port |= 1 << PWM1;
    if(pwm2 > counter) port |= 1 << PWM2;
    counter++;
    PWM_PORT = port;

    switch(get_pressed_button()){
      case K_PWM1_UP: modify_byte(&pwm1, +1); break;
      case K_PWM1_DN: modify_byte(&pwm1, -1); break;
      case K_PWM2_UP: modify_byte(&pwm2, +1); break;
      case K_PWM2_DN: modify_byte(&pwm2, -1); break;
    }
  }
}

По идее должно работать вроде вашего, только работу с кнопками я не расписывал.

Сравните вашу функцию main с моим вариантом... согласны, что логика понятна без единого комментария? И не запутаешься, не так ли?

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

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, ARV сказал:

согласны, что логика понятна без единого комментария? И не запутаешься, не так ли?

Согласен. Я, когда вырасту и стану большим, такие же штуки буду писать.)

Если честно - я никак не "въеду" в объявление и дальнейшее использование функций.

Вот у вас -

3 часа назад, ARV сказал:

get_pressed_button()

Я так понимаю, что я её должен изобрести. Это вы мне оставили, и в результате нажатия на ту или иную кнопку вместо неё должно получиться число. А от того, какое число получиться зависит какой случиться case.

Ну вот на таком уровне у меня "функции". Были бы на другом - я бы в своём коде их бы давно прикрутил куда-нибудь...

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

15 часов назад, ARV сказал:

Если вы называете решение этой задачи простым - я снимаю шляпу перед вашим талантом.

ШИМу не так уж часто нужна стабильная частота - важнее средний коэффициент заполнения. На выходе с высоким шансом будет стоять фильтр или что-то инерционное. Сомневаюсь что у ТСа там будет что-то сложнее диода. А если решать строго поставленную задачу с учетом вообще всех крайностей решения никогда не будет. Для примера можете написать программу, вычисляющую корни квадратного уравнения.

6 часов назад, pliss сказал:

Я в протеусе уже не могу определить изменение частоты при любых манипуляциях с кнопками.

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

Код стал гораздо лучше. Появилось форматирование и стандартные конструкции. Он все еще слишком запутан, но это от неопытности. Работа с кнопками здорово накручена, можно сделать проще. Комментариев многовато - не надо повторять в комментарии тоже что написано в коде, часто на функцию хватает одного комментария что она делает и какие параметры принимает.

6 часов назад, pliss сказал:

int contact_chatter_counter = 0;//счётчик числа периодов для антидребезга

Не рекомендуется использовать слишком длинные имена переменных (а также функций, констант и прочего) без необходимости - вам же самому это постоянно набирать придется.

6 часов назад, pliss сказал:

t_on0 = (t_on0<<1);//расширяем импульс PORTD0

эту конструкцию я не понял. У вас изменение каждый раз идет в 2 раза вместо изменения на единицу или другую константу?

6 часов назад, pliss сказал:

if(T_counter>=T_const){

...

PORTD = 0xFF;//включаем все каналы

Лучше занулять не все подряд, а только интересующие каналы: PORTD |= (1<<PD0 | 1<<PD1);

#include "pinmacro.h" //я бы использовал свой набор макросов для удобного назначения портов (реализация у меня в подписи, но без понимания битовой магии вряд ли получится воспользоваться, в данном случае я ее использую чтобы показать как можно назначить выводы - максимальная абстракция)
#define BTN_INC0	D,0,0 //например, такая запись означает что кнопка увеличения нулевого канала висит на PD0 и коммутируется на землю (лог.0 - замкнуто)
#define BTN_DEC0	D,1,0
#define BTN_INC1	D,2,0
#define BTN_DEC1	D,3,0
#define PWM0		B,0,1 //а такая запись - что 0-й канал ШИМ висит на PB0 и активным уровнем считается высокий.
#define PWM1		B,1,1

uint8_t pwm_count = 0;
uint8_t pwm0, pwm1;
uint8_t btn_count = 0;

while(1){
  pwm_count++;
  if( pwm_count == 0 ){
    PORT_ON( PWM0 );
    PORT_ON( PWM1 );
    btn_count++;
    if( btn_count > 80 ){ //учитывая задержку 10 мкс (см. ниже), счет до 80 позволяет опрашивать кнопки раз в 0.2 сек.
//время задержки определяется в основном delay'ем что позволяет хоть как-то прикинуть остальные времена: счет ШИМа до 255 дает период срабатывания условия в 2,5 мс (10 мкс * 256), то есть если вложенный счетчик считает до 80, это условие будет срабатывать с периодом 0.2 с (2.5 мс * 80)
      btn_count = 0;
      if( PIN_ON( BTN_INC0 ) ) //в данном случае кнопки и переполнение проще прописать вручную
        if(pwm0 < 0xFF)pwm0++;
      if( PIN_ON( BTN_DEC0 ) )
        if(pwm0 > 0)pwm0--;
      if( PIN_ON( BTN_INC1 ) )
        if(pwm1 < 0xFF)pwm1++;
      if( PIN_ON( BTN_DEC1 ) )
        if(pwm1 > 0)pwm1--;
    }
  }
  if( pwm_count == PWM0 )PORT_OFF( PWM0 );
  if( pwm_count == PWM1 )PORT_OFF( PWM1 );
  _delay_us(10); //эта задержка должна определять время прохода каждого цикла. Для тактовой в 1 МГц это всего 10 тактов, что маловато, но для больших частот ошибка невелика
}

 

14 минуты назад, pliss сказал:

Если честно - я никак не "въеду" в объявление и дальнейшее использование функций.

Эта функция должна возвращать код нажатой кнопки. Одновременное нажатие не поддерживается. Коды объявлены константами или макроопределениями K_PWM1_UP и прочими. Например, так

#define K_PWM1_UP 30 //конкретное значение безразлично, лишь бы разное у разных кнопок

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, COKPOWEHEU сказал:

. Сомневаюсь что у ТСа там будет что-то сложнее диода.

Чтобы развеять сомнения достаточно прочитать начало темы.)

 

1 час назад, COKPOWEHEU сказал:

догадаться что будет тыкать гипотетический пользователь почти невозможно.

Я не гипотетический. Я объективная реальность. Ну, и опять же - у темы есть начало.)

По поводу форматирования - я "пошёл в гугл и набрал в яндексе" "оформление форматирование код си". Нашёл перевод существующего стандарта оформления. Исполнил все пункты кроме "№ 1".

1 час назад, COKPOWEHEU сказал:

эту конструкцию я не понял. У вас изменение каждый раз идет в 2 раза вместо изменения на единицу или другую константу?

Да. Прогрессия должна быть геометрической.

"Один" и "один + один" различаются в два раза. (100%)

"Девяносто девять" и "девяносто девять + один" различаются в 1,01(01) раза.(1%)

2 часа назад, COKPOWEHEU сказал:

Эта функция должна возвращать код нажатой кнопки. Одновременное нажатие не поддерживается. Коды объявлены константами или макроопределениями K_PWM1_UP и прочими.

Ну, вот если бы в моём коде намекнуть на место, где можно применить такой фокус, если такое есть,  но не сам фокус - это было бы здорово...

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, pliss сказал:

Я не гипотетический. Я объективная реальность.

В данном случае вы не пользователь а разработчик. Вы представляете как ваше устройство работает и как им надо пользоваться. А вдруг решите подарить устройство кому-то, или дать потрогать? Вот про действия того человека я и говорил - независимо от них, устройство не должно сломаться и должно выдать правильный результат, или хотя бы индицировать ошибку ввода.

4 часа назад, pliss сказал:

По поводу форматирования - я "пошёл в гугл и набрал в яндексе" "оформление форматирование код си"

Проблема в том что единого стандарта нет. Если локальные у отдельных компаний и есть предпочтительные у большинства программистов. Пока от вас не требуют поддерживать существующий код или корпоративный стандарт, можете выбирать тот стиль, который нравится лично вам. Разумеется, будет лучше (в первую очередь, лично вам будет удобнее) если он обеспечивает выделение блоков кода, легко читаем и требует минимума комментариев.

4 часа назад, pliss сказал:

Да. Прогрессия должна быть геометрической.

в таком случае не маловато ли девяти шагов? Впрочем, выходная частота и так не получится слишком большой - в моем примере с 10 мкс задержкой, она составила 390 Гц, этого и для диодов едва хватит.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, COKPOWEHEU сказал:

в таком случае не маловато ли девяти шагов?

Конечно мало, но это я "на скорую руку" переделал, когда прошивал контроллер. Точнее - сначала запрограммировал с арифметической прогрессией, потом переделал на геометрическую.

Но, не с характером приращения у меня сложности.)

2 часа назад, COKPOWEHEU сказал:

Проблема в том что единого стандарта нет.

Возможно. Я делал по High Integrity C++ Coding Standard

2 часа назад, COKPOWEHEU сказал:

можете выбирать тот стиль, который нравится лично вам.

И это говорите мне вы?!!!! )))))))

2 часа назад, COKPOWEHEU сказал:

В данном случае вы не пользователь а разработчик.

Возможно, но я не постой разработчик. Я разработчик, который лучше всех остальных разработчиков знает т.з. Я сам и есть - Т,З. Да, я - объективная реальность и т.з.

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Только что, pliss сказал:

Ужос... Лично мне очень помогла книга "Веревка достаточной длины, чтобы выстрелить себе в ногу" - не смотря на странное название она написана простым и понятным языком, и перевод её вроде бы не испортил.

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

Ссылка на комментарий
Поделиться на другие сайты

Не знаю, смеяться или плакать.) Мудрый дядька эту книжку написал, а может, просто следил за этой веткой форума.

Девятая страница:

58d274ca7607f_.png.3d21b9efa4f8d3fcd16791de35253b3c.png

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, pliss сказал:

И это говорите мне вы?!!!! )))))))

Важно чтобы стандарт был и чтобы он справлялся со своей задачей. Мой код вы видели, его форматирование отличается от вашего, и пришел я к нему не сразу. А уж будут ли фигурные скобки той же строке что условие (начало тела функции, блоков if, while) или на следующей, будет ли в начале сделующего блока пробел, 6 пробелов или табуляция не так уж важно.

7 часов назад, pliss сказал:

Я разработчик, который лучше всех остальных разработчиков знает т.з. Я сам и есть - Т,З.

Поэтому вам сложно представить что с вашим прибором будет делать дилетант. Вы представляете как работать с вашим прибором и техникой в частности, а пользователь не отличает ток от компаратора. Он может нажать все что угодно в любых комбинациях, уронить прибор в воду и высушить феном, нажимать одну и ту же кнопку и ожидать разной реакции.

6 часов назад, ARV сказал:

Ужос...

Лучше чем ничего

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, COKPOWEHEU сказал:

Мой код вы видели, его форматирование отличается от вашего, и пришел я к нему не сразу.

Видите ли в чём дело...

Ваш код или код коллеги ARV отличается от моего не тем, что он хорошо отформатирован, а тем что он хорош сам по себе. Форматирование здесь сильно ни причём.)

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Форматирование кода нужно не для гламурности, а для удобства чтения кода и экономии времени. Чтобы в будущем, скажем, через несколько месяцев, открывая собственный проект, не материться, а что это я тут накорябал?! Так же и с чужим проектом. Если есть стиль и порядок, разбираться с программой гораздо легче и быстрее. Есть официальные стили форматирования, но у каждого программиста постепенно вырабатывается свой.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...