Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Нисходящее программирование"

Больше
6 года 11 мес. назад #46 от ARV
ARV ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Число, существующее в памяти - это переменная, существующее в некоторый момент - это значение переменной, а просто число - это абстракция, существующая всегда независимо ни от чего.
Не углубляйтесь в дебри.

я не ленивый, я энергосберегающий...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #47 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н

ARV пишет: <...>Для операции определения положения бита в байте по его номеру в avr-gcc даже специальный макрос предусмотрен, _BV(x) - от слов Bit Value.

#define _BV(x)   (1 << (x))
<...>

Если вам нравится работать с "инверсными" битами, то ранее указанная вами запись будет выглядеть так:
#define BTN_1_UP    ~_BV(0)
#define BTN_1_DWN   ~_BV(1) и т.д.
Нет лишних, загромождающих поле зрения единичек, и сразу понятно, о каком именно бите идет речь. Да и в случае чего изменить проще, если номера пинов захочется поменять.

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад - 6 года 11 мес. назад #48 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Пока нет сил объяснить как это получилось...
Соберусь с мыслями - попробую обосновать.)
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]


Нет, лучше так:
void change_width_pwm(register unsigned char *_pwm, const int a)

{		
	int pwm = *_pwm;
	switch(a)
	
	{
		case STEP_UP :				
		if(pwm < WIDTH_PWM_MAX){*_pwm = *_pwm + a;}
		else{*_pwm = WIDTH_PWM_MIN;}
		break;
		case STEP_DWN :
		if(pwm > WIDTH_PWM_MIN){*_pwm = *_pwm + a;}
		else{*_pwm = WIDTH_PWM_MAX;}
		break;
	}	 
}
Последнее редактирование: 6 года 11 мес. назад от plis.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #49 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Не, не совсем так, свежим взглядом посмотрел - всё в кучу свалено...
Для одних и тех же состояний - разные дефайны навыдумывал.
Эх...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #50 от ARV
ARV ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Мда...

я не ленивый, я энергосберегающий...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #51 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Это понятно.)))
У меня всё это время ушло, на осознание указателя и с чем его едят.
И то - до конца не осознал.
Подождите ещё не много - всё-таки сам хочу дойти.)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #52 от ARV
ARV ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Да дело ясное, что дело тёмное. Просто изначально у вас было намерение следовать рекомендациям нисходящего программирования, т.е. постепенно шаг за шагом... А в итоге скатились снова к "все и сразу". А все и сразу очень сложно, особенно для начинающего.

я не ленивый, я энергосберегающий...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #53 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Именно так.
Когда пытаюсь сформулировать мысль, в голове сразу возникают куски кода, и пошло-поехало - if на if налезает и while'ом погоняет...)
Сейчас с работой завал.
Маловато времени...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад - 6 года 11 мес. назад #54 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н

ARV пишет: Мда...


Такой удручающий результат - это от того, что мысли - "скакуны".)
Если не использовать "прискакавший" в голову массив, то функция для разных кейсов упрощается до неприличной
#define F_CPU 8000000UL
#define BTN_UP_0 (0b11111110)		//нажата кнопка "+" нулевого канала
#define BTN_DWN_0 (0b11111101)		//нажата кнопка "-" нулевого канала	    
#define BTN_UP_1 (0b11111011)		//нажата кнопка "+" первого канала
#define BTN_DWN_1 (0b11110111)		//нажата кнопка "-" первого канала
#define ENABLE (PINB == 0b11111111)	//все кнопки отпущены
#define UP (10)
#define DWN (-10)

void change_width_pwm(unsigned char *b, const int a)

{				
		*b +=a;
}
Для случаев
  register unsigned char Button_state = 0;
register unsigned char counter_Button = 0;		//счётчик состояния кнопок	
            unsigned char width_Pwm_0 = 0;		//ширинa pwm_0
            unsigned char width_Pwm_1 = 0;		//ширинa pwm_1
   register unsigned char counter_Pwm = 0;		//счётчик ширины pwm	  
      unsigned char enable_change_Pwm = 1;

switch(Button_state){
			case BTN_UP_0 : change_width_pwm(&width_Pwm_0, UP);
			break;
			case BTN_DWN_0 : change_width_pwm(&width_Pwm_0, DWN);
			break;
			case BTN_UP_1 : change_width_pwm(&width_Pwm_1, UP);		
			break;					
			case BTN_DWN_1 : change_width_pwm(&width_Pwm_1, DWN);
			break;
}

Так лучше, если конечно я объясню это используя принципы нисходящего программирования?..
Дефолт ещё не использован, но - думаю. Крепко.)

P.S. Одно не могу понять - почему это работает.)))
Точнее - почему оно "по кругу гоняет" ширину импульса...
Не, понял - тоже самое "переполнение" width_Pwm!!!
Последнее редактирование: 6 года 11 мес. назад от plis.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #55 от ARV
ARV ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Работает - это хорошо.
По кругу - это см. в функцию change_width_pwm - там следует контролировать границы изменения.

Подход, когда работающий код объясняется какими-то принципами, уже не имеет смысла. Принцип играет роль, когда он помогает достичь результата, а если результат достигнут "беспринципными" методами, то, как говорится, победителей не судят :)

я не ленивый, я энергосберегающий...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 11 мес. назад #56 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н

ARV пишет: Работает - это хорошо.
По кругу - это см. в функцию change_width_pwm - там следует контролировать границы изменения.
<...>


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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 10 мес. назад #57 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Вот такой монстр получился:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]

Добавил третий канал шим и прикрутил индикацию на семисегментных индикаторах.))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 10 мес. назад #58 от ARV
ARV ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
А Настя это кто?

я не ленивый, я энергосберегающий...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 года 10 мес. назад #59 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
))))))
Или имя компьютера, или имя пользователя.
А на самом деле - имя моей дочери.
Ноутбук её.
А Atmel файл сам подписывает.
А я не меняю.
))))))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Работает на Kunena форум