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

Больше
7 года 1 мес. назад #16 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
DDRD = 0xFF;
PORTD = 0xFF;
	
unsigned char cntr = 0;							//счётчик периода
unsigned char on0 = 50;							//ширина импульса канала 1
unsigned char on1 = 75;							//ширина импульса канала 2

unsigned char prtd_stt = 0;
//const int T=255;
		 
	while(1)
	{	
		cntr ++;
										
		if(cntr >= on0){
			prtd_stt &= ~(1<<PORTD0);			// подготавливаем данные для порта
		}
		else{
			prtd_stt |= (1<<PORTD0);			// подготавливаем данные для порта
		}
		
		if(cntr >= on1){
			prtd_stt &= ~(1<<PORTD1);			// подготавливаем данные для порта
		}
		else{
			prtd_stt |= (1<<PORTD1);			// подготавливаем данные для порта
		}
		
		PORTD = prtd_stt;						// выводим  эти данные в порт
Пока - так.
Думаю, можно ли ещё упростить...

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

Больше
7 года 1 мес. назад #17 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Для опроса кнопок, пока вот такая заготовка у меня получается:
		prtB_stt = ~PINB;										// опрашиваем кнопки, для обработки кнопок лучше всего оператор switch
		
		switch(prtB_stt)
		{
			case 1 : on0 = on0 + Stp;			// тут обработка кнопок по аналогии
			break;
			case 2 : on0 = on0 - Stp;
			break;
//			case 3 : on0 = on0 + Stp;
//			break;				
		}
Ну, это как черновик...
С одной стороны, как-то очень просто, с другой - вроде бы логично...

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

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

Думаю, можно ли ещё упростить...

Можно. У вас если вводится переменная для подготовки в ней нового значения порта, то достаточно ее обнулить, а затем только устанавливать нужные биты - количество действий сократится в 2 раза (обнуляющие команды пропадут).

Ну, это как черновик...
С одной стороны, как-то очень просто, с другой - вроде бы логично...

Нет, нет и нет. Ни как черновик, ни как логично, ни как просто - это не правильно.

Вы же собирались действовать по принципу нисходящего программирования, где же это? Почему снова стараетесь сразу писать код, надеясь "в этот раз угадать"?

Ну и просто "правила хорошего тона" следует заставлять себя соблюдать, от этого хуже не будет точно: магические числа исключить, давать переменным осмысленные имена и т.п. Как-то быстро улетучивается у вас этот вектор действий...

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

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

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

ARV пишет:

Думаю, можно ли ещё упростить...

Можно. У вас если вводится переменная для подготовки в ней нового значения порта, то достаточно ее обнулить, а затем только устанавливать нужные биты - количество действий сократится в 2 раза (обнуляющие команды пропадут).
<...>

while(1){								
	//локальная portD_state
	unsigned char prtD_stt = ((1 << PORTD0) | (1 << PORTD1));
	
	if(cntr >= on0){
		prtD_stt &= ~(1 << PORTD0);					// подготавливаем данные
	}

	if(cntr >= on1){
		prtD_stt &= ~(1 << PORTD1);					// подготавливаем данные
	}

	PORTD = prtD_stt;								//выводим данные
	
	cntr ++;

Почти так?..
Осталось всё переиначить, чтобы при инициализации значение было не 0b00000011, а 0b11111100...
Но, с другой стороны - если она не "вся" == 0, то разницы большой нет?

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

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

ARV пишет: <...>магические числа исключить, давать переменным осмысленные имена и т.п.<...>

Магические числа - это чтобы успеть не забыть мыслЮ.)
Или быстро проверить и забыть...

Переменные - осмысленные.
Консонантная запись - запись слова без гласных.
Например:
prtD_stt == portD_state
cntr == counter.
Очень удобно.

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

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

Почти так?

Ну, в принципе, так. Я просто удивлен, что у вас как-то наоборот всё устроено... В моем понимании "импульс" - это появление лог.единицы, соответственно проверка должна быть на то, когда эту единицу устанавливать. А у вас наоборот, в результате проверки единица сбрасывается. И инициализация наоборотная тоже... Микроконтроллеру, впрочем, все равно, но вот мне как-то странновато...

Или быстро проверить и забыть...

Угу. Только вот забыть как-то не получается :)

Переменные - осмысленные

Согласен, логика присутствует.

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

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

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

ARV пишет:

<...> Я просто удивлен, что у вас как-то наоборот всё устроено... В моем понимании "импульс" - это появление лог.единицы,<...>

Просто, у меня нет ещё рефлекса на "логическую единицу". Я её даже не думаю. А если думаю, то мне специально нужно удерживать в голове, что это единица и не просто единица, а именно - "логическая единица", так же как и "логический ноль". Это ведь не цифра "1".) Это может быть и "логический крестик", а в место логического нуля - "отсутствие крестика".))
И начало периода для меня, это - высокий уровень напряжения. И когда время высокого напряжения становится равным заданному - я устанавливаю низкий уровень.

Пока - как-то так...)

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

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

ARV пишет:

<...>Вы же собирались действовать по принципу нисходящего программирования, где же это? Почему снова стараетесь сразу писать код, надеясь "в этот раз угадать"?<...>

Как раз хотел вернуться к статье "Нисходящее программирование".

Возможно, я не прав, но я понял её смысл так:

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

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

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

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

Вот в чем смысл нисходящего программирования: в постепенном погружении в глубины сложности, в постепенном разделении на понятное и непонятное и решение непонятного так же точно постепенно.

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

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

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

ARV пишет: <...> Я бы добавил еще, что процесс дробления итеративный, потому что не всегда получается с первой попытки разделить все на удачные элементы, и поэтому порой приходится делать откат,<...>

Ну, вот я и хочу сделать итерацию.
Я на первой итерации разделил задачу на две части.

1. Получение последовательности импульсов.
2. Управление этой последовательностью.

Что, собственно и является ШИМ. Широтно-импульсной модуляцией.
Первый пункт, в первом приближении стал понятен. Это бесконечный цикл, в котором, в соответствии с заданной величиной меняется состояние порта выхода микроконтроллера.

Теперь мне нужно разобраться как управлять шириной импульса. То есть, осуществлять эту-самую модуляцию.
Попробую "без программирования". Словами.

Ширина импульса при его формировании в бесконечном цикле связана с "заданной величиной".
Значит - мне нужно иметь возможность менять эту величину. Менять эту величину микроконтроллер будет в зависимости от состояния своего порта, настроенного как вход. Пусть это будет PORTB.
Менять состояние PORTB будут кнопки.
Микроконтроллер должен каким-то образом знать состояние этого порта.
Значит - опрос кнопок. Он же - цикл.

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

Много написал. Это значит - нужна ещё итерация для упорядочивания подзадач...
Критические ошибки есть?

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

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

Критические ошибки есть?

Я бы в стиле нисходящего программирования слово "PORTB" не употреблял бы. Задача формулируется от общего к частному. Общее - управление кнопками. Цикл там будет или нет - вы пока еще не знаете. Попытка на этапе постановки задачи оперировать конкретикой резко суживает диапазон вариаций решений, и вы можете обречь себя на заведомо сложный и нерациональный путь. Кто вам сказал, что работа с кнопками - цикл? Нет иных вариантов?

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

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

я не ленивый, я энергосберегающий...
Последнее редактирование: 7 года 1 мес. назад от ARV.

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

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

ШИМ, точнее - последовательность импульсов сформирована.
Хочу её изменить (изменить скважность).
Изменять скважность буду кнопками.
Скважность зависит от выполнения определённого условия (сравнение с величиной).
Задача - кнопкой (кнопками) менять эту величину...

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

Больше
7 года 1 мес. назад #28 от ARV
ARV ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Отлично, разбираемся теперь с алгоритмом реакции на кнопки, определив для начала, кто нам эти кнопки будет выдавать.

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

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

Больше
7 года 1 мес. назад #29 от plis
plis ответил в теме Re: Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Н
Опять рискую скатиться к написанию кода программы, но пусть появится какая-нибудь переменная, в которой будет запоминаться состояние кнопок.
Её можно периодически сравнивать с предыдущим состоянием, и делать соответствующие выводы...

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

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

Переменная - возможно, сейчас не обсуждаем. Для основной задачи ВСЯ РАБОТА С КНОПКАМИ должна быть упрятана в функцию, с результатом которой мы и будем работать. Сейчас следует предъявить требования к функции и к её результату. Требования должны быть такими, чтобы с ними было наиболее удобно работать.

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

я не ленивый, я энергосберегающий...
Последнее редактирование: 7 года 1 мес. назад от ARV.

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

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