Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 32 99

Мне понравился алгоритм, описанный Vlad_Petr. Будем делать так? Вопрос к picmaniacу, как к maniacу picов.
А может пока не задействовать прерывание по таймеру, слипы и пр. ввиду чертовской сложности программы? В принципе понятно, но как-то сразу все это в голове не укладывается. Может постепенно будем усложнять? Ликбез все-таки. Предлагаю сделать отдельную пп таймера, куда уходить для пауз между опросами кнопок и инкрементирования (сброса) регистров, индивидуальных для каждой кнопки и последующих сравнений с какой-то константой. Таймер, допустим на 20 мс, 5 опросов, т. е. сравнение с b'101'? Конечно, программа при этом разрастется. Бум или не бум? Вот в чем вопрос.
Короче, я в полном замешательстве. Чего делать то? А ведь еще граф надо как то рисовать. Научите, как эти графы рисуются. Что-то этих состояний, в которых может находиться автомат больно много получается. Фактически, после исполнения каждой команды - новое состояние. Все-таки не пойму, как этот граф нарисовать, не представляя работы программы. А ведь он должен рисоваться безотносительно к программе. Так? Т.е. я еще не знаю, как программа должна работать, а граф - нарисуй, да еще так, чтобы потом программа сама написалась?
Хочется уже как-то от обсуждения к делу перейти.

 

Zandy: А может пока не задействовать прерывание по таймеру
Извольте сразу в бой!....
Попробуйте предложенный мною стандартный алгоритм только для одной кнопки
и светодиода. Потом вернетесь к исходному заданию. Разумеется все дела в прерывании делаются. А основное время,- ну можно постоянно какой-нибудь ножкой свободной махать (инвертировать выходной бит).
По ресурсам получается: каждые 20ms отрабатывается п/п длительностью несколько десятков микросекунд. Задействовано около процента ресурсов. Хотя это от тактовой частоты и конкретной реализации программы зависит..

 

Vlad_Petr: Попробуйте предложенный мною стандартный алгоритм только для одной кнопки и светодиода.
Ну попробую, только пока еще никогда не задействовал таймер на прерывание.
Vlad_Petr, а вы потом сможете прокомментировать программу? Я ж для пиков делать буду, а вы вроде по другим типам МК специалист?
Эх, picmaniac запретил программы писать, пока граф не нарисую.

 

Ну вьеду по такому случаю....все-же Zandi за контроллер взялся...
"..Эх, picmaniac запретил программы писать, пока граф не нарисую..."
И правильно он сделал!

 

ZandyНиколай Брагин: А если нам не нужны многократные повторения команды - можно просто ставить флаг - нажато-отпущено. А это как?

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


while (1)
{
if ((!PINB.0) && (!pressed)) //если кнопка нажата, и флаг нажатия сброшен
{
delay_ms(20); //ждем 20 мс
if (!PINB.0) // и если кнопка все еще нажата
{
PORTB^=0b00000010; //инвертируем второй бит порта
pressed=1; //и ставим флаг нажатия
}
}
if (PINB.0) //если кнопка отпущена
{
delay_ms(20); //ждем 20 мс
if (PINB.0) pressed=0; //и сбрасываем флаг нажатия
}
};

С уважением, Николай.

 

Vlad_Petr: И правильно он сделал!
Не согласен. Каждому своё. Zandy, зачем Вам ликбез? С логикой всё в порядке, программу Вы пишите не методом тыка, а логически рассуждая и предвидите возможные проблемы без графов и блок-схем. Эта ситуация похожа на тот случай когда умеющего читать ученика сажают за букварь. Просто я считаю, что если человек не понимает зачем ему блок-схема или граф при уже написанной программе, то значит это ему просто не нужно. Лучше это время потратить на что-нибудь более полезное, например, разобрать организацию работы по прерываниям от таймера.

 

SAK вообще-то прав. Не стоит рисовать граф и алгоритм через силу. Точно так же совсем не обязательно кушать ложкой или вилкой. Ну привык я руками еду из тарелки хватать - чего вы на меня так коситесь?! И вообще, мне в расстёгнутых штанах ходить удобнее. А еще, например, люблю ... впрочем вы уже поняли.

Zandy : Но сбой-то в результате появления помехи на другой кнопке был!
А разве это сбой? Сбой - это ложный запуск от помехи, что недопустимо. А в данном случае контроллер обнаруживает, что была именно помеха, и возвращается к п.4. Ну зажжёт он два средних светодиода - так правильно сделает, я считаю. Это и будет сигналом о "нештатной ситуации". И если на одном входе периодически будет появляться помеха - то возможное помаргивание двух светодиодов при нажатии на одну кнопку и будет об этом свидетельствовать.
В худшем случае возникнет задержка реакции устройства на нажатие кнопки. Но задержка эта возникла не на пустом месте, а именно в результате появления помехи на входе! За 100 мс помеха почти наверняка пройдёт, а далее устройство обнаружит одну нажатую кнопку и отработает как полагается. В нашем случае, я считаю, задержка лучше, чем ложный пуск.

"Нажатие двух кнопок одновременно" - имеется в виду с точки зрения пользователя. Ну подошёл чел к девайсу, да и надавил на обе. Если он выдержал промежуток более 100 мс между нажатием на первую и вторую - устройство должно отработать нажатие на первую кнопку. Если промежуток был менее 100 мс - устройство должно зажечь 2 средних светодиода и ждать отпускания одной из кнопок, после чего вернуться к начальной проверке с паузой. При отпускании-то тоже возможен дребезг.
А вообще, как я уже сказал, этот вариант предложен навскидку, как один из возможных. И наверняка он не лучший.

При нажатии кнопки (пусть с дребезгом) рано или позно опрос фиксирует наличие нуля. После этого начинает выполняться сценарий, соответствующий нажатию этой кнопки. В чем здесь мое заблуждение? Вот тут я и хотел уточнить. Не просто "рано или поздно зафиксировать наличие нуля", а "зафиксировать наличие нуля только на одном входе повторно через 100 мс после первого обнаружения нуля только на этом же входе" - это и есть условие пуска.
(исправленному верить)
...дребезг может вызвать нежелательное явление, заключающееся в том, что сценарий пойдет по пути обработки двух нажатых кнопок. Нажатие двух кнопок одновременно - это нештатная ситуация, которая не должна происходить при правильном пользовании устройством. Но она вполне возможна, поэтому требуется "защита от дурака". Если мы даже на мгновение зафиксировали факт "двух нулей на входе" - это уже нештатная ситуация. Либо помеха, либо ошибка пользователя. В этом случае пуск не разрешается до момента устранения нештатной ситуации. Так что этот случай - как раз правильный и желательный.
Возможен и другой случай. Нажали одну кнопку и держим. Примерно через 90 мс нажимаем вторую и возникает дребезг её контактов. Если в момент повторной проверки контроллер обнаружит на втором входе единицу (результат дребезга) - то произойдёт запуск. Считать ли нам это действие устройства ошибочным? Это уже заказчик устройства решает. Я, например, считаю запуск в такой ситуации допустимым.

Zandy : Будем делать так? Вопрос к picmaniacу, как к maniacу picов Тут я ещё поразмыслю...

 

picmaniac: "зафиксировать наличие нуля только на одном выходе повторно через 100 мс после первого обнаружения нуля только на этом же выходе" - это и есть условие пуска.
Может быть на входе? Не описка?
Ну я понимаю, задача жестко конкретизирована. Надо проверять наличие 0 на входе два раза с паузой 100 мс. Если оба раза 0, идем далее. Это я понимаю, как желание заказчика. Ну хочет он, чтобы так было и все тут. Ну раз хочет, что тут делать. Так или нет?
Не понимаю другого, в чем сермяжная правда такой проверки. Почему в одном случае помеха вредна, в другом нет? Когда мы защищаемся от дребезга, а когда от помехи? Почему нажатие двух кнопок на дребезг (или на помеху) проверять не надо, а нажатие одной надо? Какая ситуация штатная, какая нештатная? И т. д. и т. п. Я уже тут много исписал всего и много вопросов конкретных задал. Не хочется зацикливаться. В то же время с этим дребезгом у меня уже в голове дребезг. Извините за тупость, но вы же сами разрешили задавать любые вопросы, даже самые глупые.

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

Эх, чувствую, зря я за эти МК взялся. Ничего у меня не получится. Говорят же: "не в свои сани не садись".

 

SAK: Vlad_Petr: И правильно он сделал!
Не согласен. Каждому своё. Zandy, зачем Вам ликбез? С логикой всё в порядке, программу Вы пишите не методом тыка, а логически рассуждая и предвидите возможные проблемы без графов

Если дальше этой задачки с кнопками не мыслить и считать это верхом искусства, - тогда здравой логики хватит.
В более сложной задаче человек часто ошибается. И нужен граф состояний. Иначе неучтенные состояния заставят переделывать всю программу. А научиться этому можно только на простых примерах, что picmaniac и пытается сделать.
ОХ СКОЛЬКО НАРОДУ В БОЛОТО СТАЩИТЬ НОРОВЯТ....

 

Zandy: Говорят же: "не в свои сани не садись".
Вот и пусть говорят, а ты делай!! Все получится. Но если кто скажет, что "будет трудно", не верь! Это неправда!
Будет очень трудно! Но несомненно справишся. Просто отдохни денек, пусть все утрясется.
И опять за работу...