- Форум
- Наши простые устройства
- Программирование
- Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Нисходящее программирование"
Разработка программной ШИМ для управления двумя ДПТ на основе статьи "Нисходящее программирование"
- 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; // выводим эти данные в порт
Думаю, можно ли ещё упростить...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- 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;
}
С одной стороны, как-то очень просто, с другой - вроде бы логично...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ARV
- Не в сети
- Администратор
Можно. У вас если вводится переменная для подготовки в ней нового значения порта, то достаточно ее обнулить, а затем только устанавливать нужные биты - количество действий сократится в 2 раза (обнуляющие команды пропадут).Думаю, можно ли ещё упростить...
Нет, нет и нет. Ни как черновик, ни как логично, ни как просто - это не правильно.Ну, это как черновик...
С одной стороны, как-то очень просто, с другой - вроде бы логично...
Вы же собирались действовать по принципу нисходящего программирования, где же это? Почему снова стараетесь сразу писать код, надеясь "в этот раз угадать"?
Ну и просто "правила хорошего тона" следует заставлять себя соблюдать, от этого хуже не будет точно: магические числа исключить, давать переменным осмысленные имена и т.п. Как-то быстро улетучивается у вас этот вектор действий...
я не ленивый, я энергосберегающий...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- 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, то разницы большой нет?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- plis
- Автор темы
- Не в сети
- Захожу иногда
- Сообщений: 47
- Спасибо получено: 0
Магические числа - это чтобы успеть не забыть мыслЮ.)ARV пишет: <...>магические числа исключить, давать переменным осмысленные имена и т.п.<...>
Или быстро проверить и забыть...
Переменные - осмысленные.
Консонантная запись - запись слова без гласных.
Например:
prtD_stt == portD_state
cntr == counter.
Очень удобно.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ARV
- Не в сети
- Администратор
Ну, в принципе, так. Я просто удивлен, что у вас как-то наоборот всё устроено... В моем понимании "импульс" - это появление лог.единицы, соответственно проверка должна быть на то, когда эту единицу устанавливать. А у вас наоборот, в результате проверки единица сбрасывается. И инициализация наоборотная тоже... Микроконтроллеру, впрочем, все равно, но вот мне как-то странновато...Почти так?
Угу. Только вот забыть как-то не получаетсяИли быстро проверить и забыть...
Согласен, логика присутствует.Переменные - осмысленные
я не ленивый, я энергосберегающий...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- plis
- Автор темы
- Не в сети
- Захожу иногда
- Сообщений: 47
- Спасибо получено: 0
ARV пишет:
Просто, у меня нет ещё рефлекса на "логическую единицу". Я её даже не думаю. А если думаю, то мне специально нужно удерживать в голове, что это единица и не просто единица, а именно - "логическая единица", так же как и "логический ноль". Это ведь не цифра "1".) Это может быть и "логический крестик", а в место логического нуля - "отсутствие крестика".))<...> Я просто удивлен, что у вас как-то наоборот всё устроено... В моем понимании "импульс" - это появление лог.единицы,<...>
И начало периода для меня, это - высокий уровень напряжения. И когда время высокого напряжения становится равным заданному - я устанавливаю низкий уровень.
Пока - как-то так...)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- plis
- Автор темы
- Не в сети
- Захожу иногда
- Сообщений: 47
- Спасибо получено: 0
ARV пишет:
Как раз хотел вернуться к статье "Нисходящее программирование".<...>Вы же собирались действовать по принципу нисходящего программирования, где же это? Почему снова стараетесь сразу писать код, надеясь "в этот раз угадать"?<...>
Возможно, я не прав, но я понял её смысл так:
Описываем задачу в самом общем виде.
Начинаем разделять её на частные задачи, уточняя их порядок и взаимосвязь между ними.
Частные задачи разделяем на ещё "более частные".
Продолжаем этот процесс до тех пор, пока элементарная задача не станет эквивалентной какому либо ключевому слову или оператору языка программирования.
В моём случае - Си...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ARV
- Не в сети
- Администратор
Добиться равенства последнего "атома" алгоритма одному оператору Си - не самоцель. Главное, добиться такого деления, когда дальнейшее деление уже не имеет смысла из-за полного понимания на интуитивном уровне, как дальше следует делать. Смысл дробления в том, что вы сначала не понимаете как сделать всё, но кое-какие частности понимаете, потому и делаете самое общее описание алгоритма, заменяя пока что непонятные вещи функциями. То есть вы не знаете, как следует работать с кнопками, но требования к этой работе у вас уже есть: вам надо, чтобы эта неизвестная функция выдавала вам условный номер нажатой кнопки. Вы можете пожелать, чтобы функция возвращала код команды, которую остальная часть алгоритма должна выполнить: в отличие от кода нажатой кнопки команда - это в том числе и комбинация нескольких нажатых кнопок, и разделение длительности нажатия на короткие-долгие и т.п. Т.е. даже не зная КАК, вы формируете требование ЧТО, ну и делаете заглушку этой функции, предполагая, что она и будет делать то, что вы хотите. После этого вы сосредотачиваетесь на алгоритме обработки этих кодов или команд, оттачиваете его до "совершенства" (если он уже понятен - нет необходимости его "дробить", а если не понятен - поступаете с его "темными" местами точно так же). Ну а потом, когда в крупном все получилось, начинаем разбираться с теми заглушками функций, рассматривая каждую, как отдельную и независимую мини-задачу, и применяя к ней те же подходы, что и к основному алгоритму.
Вот в чем смысл нисходящего программирования: в постепенном погружении в глубины сложности, в постепенном разделении на понятное и непонятное и решение непонятного так же точно постепенно.
я не ленивый, я энергосберегающий...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- plis
- Автор темы
- Не в сети
- Захожу иногда
- Сообщений: 47
- Спасибо получено: 0
Ну, вот я и хочу сделать итерацию.ARV пишет: <...> Я бы добавил еще, что процесс дробления итеративный, потому что не всегда получается с первой попытки разделить все на удачные элементы, и поэтому порой приходится делать откат,<...>
Я на первой итерации разделил задачу на две части.
1. Получение последовательности импульсов.
2. Управление этой последовательностью.
Что, собственно и является ШИМ. Широтно-импульсной модуляцией.
Первый пункт, в первом приближении стал понятен. Это бесконечный цикл, в котором, в соответствии с заданной величиной меняется состояние порта выхода микроконтроллера.
Теперь мне нужно разобраться как управлять шириной импульса. То есть, осуществлять эту-самую модуляцию.
Попробую "без программирования". Словами.
Ширина импульса при его формировании в бесконечном цикле связана с "заданной величиной".
Значит - мне нужно иметь возможность менять эту величину. Менять эту величину микроконтроллер будет в зависимости от состояния своего порта, настроенного как вход. Пусть это будет PORTB.
Менять состояние PORTB будут кнопки.
Микроконтроллер должен каким-то образом знать состояние этого порта.
Значит - опрос кнопок. Он же - цикл.
Один цикл в программе уже есть - основной, в котором формируется ШИМ.
Значит - опрос кнопок можно встроить в основной цикл, чтобы не останавливать формирование импульсов...
Много написал. Это значит - нужна ещё итерация для упорядочивания подзадач...
Критические ошибки есть?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ARV
- Не в сети
- Администратор
Я бы в стиле нисходящего программирования слово "PORTB" не употреблял бы. Задача формулируется от общего к частному. Общее - управление кнопками. Цикл там будет или нет - вы пока еще не знаете. Попытка на этапе постановки задачи оперировать конкретикой резко суживает диапазон вариаций решений, и вы можете обречь себя на заведомо сложный и нерациональный путь. Кто вам сказал, что работа с кнопками - цикл? Нет иных вариантов?Критические ошибки есть?
См. выше - сосредоточьтесь на общем, не вникая в частности. Вам надо кнопками управлять скважностью двух каналов? Делайте это управление! А источником "кнопок" у вас будет функция, назовите, как хотите... И разбирайтесь с тем, как регулировать ШИМ. Сделайте эту часть. Ведь в моей статье про "Морзе-маячок" с первых строк именно так рекомендуется поступать!
Почему я продолжаю настаивать на таком подходе? Да потому что сам стиль написания программ по этому принципу делает вас свободным в способах реализации частностей! Вот скажите, если у вас есть функция, которая вернет вам какие-то "команды" для изменения скважности, имеет ли критически важный смысл то, откуда эти "команды" возьмутся? То есть будут ли это кнопки, СМС-сообщения, пакеты из интернета или переданные по радиоканалу речевые сообщения? Основной алгоритм никак не поменяется при любом варианте! То, что меняется внутренность функции, никак не отражается на остальном!
А если сразу вы влепите туда не функцию, а какие-то операторы работы с портами, никаких вариантов больше не останется - задача из общего сразу превратится в единственную частность, и перспективы развития будут обнулены.
я не ленивый, я энергосберегающий...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- plis
- Автор темы
- Не в сети
- Захожу иногда
- Сообщений: 47
- Спасибо получено: 0
ШИМ, точнее - последовательность импульсов сформирована.
Хочу её изменить (изменить скважность).
Изменять скважность буду кнопками.
Скважность зависит от выполнения определённого условия (сравнение с величиной).
Задача - кнопкой (кнопками) менять эту величину...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ARV
- Не в сети
- Администратор
я не ленивый, я энергосберегающий...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- plis
- Автор темы
- Не в сети
- Захожу иногда
- Сообщений: 47
- Спасибо получено: 0
Её можно периодически сравнивать с предыдущим состоянием, и делать соответствующие выводы...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ARV
- Не в сети
- Администратор
Переменная - возможно, сейчас не обсуждаем. Для основной задачи ВСЯ РАБОТА С КНОПКАМИ должна быть упрятана в функцию, с результатом которой мы и будем работать. Сейчас следует предъявить требования к функции и к её результату. Требования должны быть такими, чтобы с ними было наиболее удобно работать.
Очень сложно указывать вам направление деятельности и не скатиться к навязыванию собственного решения. Вы уж постарайтесь самостоятельно все делать, а я буду по мере сил "мягко" критиковать.
я не ленивый, я энергосберегающий...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.