Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Нисходящее программирование"
(1 чел.) (1) гость
  • Страница:
  • 1
  • 2
  • 3
  • 4

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

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
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;						// выводим  эти данные в порт

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

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
Для опроса кнопок, пока вот такая заготовка у меня получается:
		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;				
		}

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

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

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
Думаю, можно ли ещё упростить...
Можно. У вас если вводится переменная для подготовки в ней нового значения порта, то достаточно ее обнулить, а затем только устанавливать нужные биты - количество действий сократится в 2 раза (обнуляющие команды пропадут).
Ну, это как черновик...
С одной стороны, как-то очень просто, с другой - вроде бы логично...
Нет, нет и нет. Ни как черновик, ни как логично, ни как просто - это не правильно.

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

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

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
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, то разницы большой нет?

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
ARV написал:
<...>магические числа исключить, давать переменным осмысленные имена и т.п.<...>

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

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

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

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

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

Переменные - осмысленные
Согласен, логика присутствует.
я не ленивый, я энергосберегающий...

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
[quote="ARV" post=1651]
<...> Я просто удивлен, что у вас как-то наоборот всё устроено... В моем понимании "импульс" - это появление лог.единицы,<...>

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

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

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
[quote="ARV" post=1648]
<...>Вы же собирались действовать по принципу нисходящего программирования, где же это? Почему снова стараетесь сразу писать код, надеясь "в этот раз угадать"?<...>

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

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

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

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

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
Идею нисходящего программирования вы поняли абсолютно верно. Я бы добавил еще, что процесс дробления итеративный, потому что не всегда получается с первой попытки разделить все на удачные элементы, и поэтому порой приходится делать откат, т.е. снова возвращаться к моменту, когда разделение еще не сделано и делать его снова, но иначе.

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

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

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
ARV написал:
<...> Я бы добавил еще, что процесс дробления итеративный, потому что не всегда получается с первой попытки разделить все на удачные элементы, и поэтому порой приходится делать откат,<...>

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

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

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

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

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

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

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

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

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

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

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

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
Хорошо.

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

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

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
Отлично, разбираемся теперь с алгоритмом реакции на кнопки, определив для начала, кто нам эти кнопки будет выдавать.
я не ленивый, я энергосберегающий...

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

  • plis
  • Вне сайта
  • Захожу иногда
  • Постов: 47
  • Репутация: 0
Опять рискую скатиться к написанию кода программы, но пусть появится какая-нибудь переменная, в которой будет запоминаться состояние кнопок.
Её можно периодически сравнивать с предыдущим состоянием, и делать соответствующие выводы...

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

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
Раз уж я как бы сторонник принципа, которому вы хотите следовать, снова напомню основной его постулат: что знаем - делаем, что не знаем - выделяем в функцию, с которой разбираемся позже.

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

Очень сложно указывать вам направление деятельности и не скатиться к навязыванию собственного решения. Вы уж постарайтесь самостоятельно все делать, а я буду по мере сил "мягко" критиковать.
я не ленивый, я энергосберегающий...
Последнее редактирование: 7 мес., 3 нед. назад от ARV.
  • Страница:
  • 1
  • 2
  • 3
  • 4
Время создания страницы: 0.16 секунд