Микроконтроллеры | Ликбез по программированию PIC |
|
---|---|---|
Zandy: Я вот до сих пор не понимаю, как обрабатывать 4 канала, кроме как не по очереди в принудительном порядке. Ну а между обработками со светодиодами валандаться. Каким образом сюда прерывания приплести? Вот если бы мы могли разрешать прерывания отдельно по каждому из входов, тогда бы все было предельно просто. Не по очереди, а по мере поступления прерываний |
|
|
Идея мне представляется примерно так. Источников прерывания у нас возможно пять. Это таймер тайм-аута и четыре входа. Вектор прерываний у PIC16 один, поэтому необходимо в обработчике анализировать флаги запросов и выявлять источник. Порядок анализа флагов запроса и будет определять приоритеты прерываний. Насчёт действий при выходе по тайм-ауту я ещё подумаю. PS: пока набирал текст, АНТОХА уже запостил. |
|
|
picmaniac: Респект АНТОХЕ за ссылку. |
|
|
picmaniac: Состояние RB4 изменилось И на RB4 лог.1? Да - действия для этого случая я уже описал выше, вчера. Состояние RB4 изменилось И на RB4 лог.0? Да - опять же смотрим вчерашний разбор. Здесь можно упростить. Не анализировать уровень, а просто считать чётное к-во импульсов. Например, 16 импульсов - это 8 периодов... |
|
|
Splav56: Единственный вопрос может возникнуть при многоканальной работе в случае синфазности сигналов. |
|
|
Почему же нельзя? Распишите свою идею подробнее, обсудим... Диалог автора и разработчика на стр.484-485 прочитали? Лучше, конечно, граф сначала составить. Хотя бы вчерне. Хотя бы даже не граф, а поясняющий рисунок. Но если совсем невтерпёж - можно и программу писать. |
|
|
Zandy: А все-таки, почему нельзя принудительно, по очереди опрашивать все каналы без всяких прерываний? ИМХО похоже единственный вариант,вот и дошли до задачки, где для имеющихся (заданных) ПИКовых ресурсов, если строго по заданию, уже не все просто... |
|
|
picmaniac: Почему же нельзя? Распишите свою идею подробнее, обсудим... Период 25Гц - 40мс. 8периодов - 320мс. Наша самая быстрая мигалка - 2Гц. Значит зажигать и гасить светодиод нам надо через каждые 250мс. Не вяжутся как-то эти времена между собой. Программа, занятая подсчетом длительности не сможет обрабатывать мигание светодиода. По-моему такой вариант не годится. Напрашивается такой вариант. В каждом цикле программы измерять только один период и записывать его в соответствующие регистры 1R1 - 1R8. В первом цикле записываем в 1R1. В следующем цикле программы, когда будет произведено измерение периода по остальным трем каналам и мы вернемся опять к первому, измеренный результат запишем уже в 1R2. И так до тех пор, пока не запишем 1R8. На 9-ом цикле длительность будет записана опять в 1R1 и т. д. Сразу после измерения периода и записи ее в регистр осуществляем математическое усреднение по всем 8-и регистрам первого канала и записываем результат в регистр PERIOD1. Таким образом усреднение будет вестись по текущему и семи предыдущим отсчетам. Сразу после этого - оценка периода (сравнение с константами длительности). Результаты оценки (4 возможных варианта) записываем в регистр REZ1 (4 бита). Таким образом идет обработка по всем четырем каналам. Остановимся теперь на программе измерения периода. Допустим, будем использовать аппаратный таймер. В начале измерения его обнуляем. Затем организуем цикл опроса вывода порта. Записываем его состояние в промежуточный регистр. На следующем цикле опроса порта сравниваем текущее значение с записанным. Т. о. "ловим" либо передний, либо задний фронт импульса. Когда он "пойман" еще раз обнуляем таймер и ждем в цикле опроса, когда придет следующий фронт. По этому событию считываем состояние таймера и записываем в один из регистров 1R1 - 1R8, как было рассмотрено выше. Теперь тонкость. Зачем мы обнулили таймер перед началом опроса? А это для того, чтобы в случае, если ожидаемый импульс так и не придет, спокойненько выйти из цикла опроса кнопки по переполнению таймера. Таймер должен быть расчитан на измерение максимально возможной длительности. Теперь посмотрим и заметим, что время присутствия программного вектора в области команд опроса и обработки одного канала не будет все время постоянным, оно будет зависеть от различных вариантов поведения входного сигнала. Приблизительно это время будет составлять около 45мс. А нам необходимо, чтобы это время было постоянным. Зачем - будет понятно потом. Для того, чтобы это сделать, задействуем, например, еще один таймер. В начале опроса мы его инициализируем, а в конце всех действий с каналом войдем в цикл опроса этого таймера и когда он насчитает нам ровно 62мс, перейдем к работе со следующим каналом. Теперь вернемся к обработке канала. После того, как мы получили результаты оценки (REZ1), выведем эти результаты на соответствующие светодиоды. Варианты: горит, погашен, "подсоединен" к мигалке 2Гц или 0,5Гц. Конечно я здесь не затронул многие "тонкости" программы, но и так уже много понаписал. |
|
|
Если я правильно понял, предлагается опрашивать входы поочерёдно. По 62 мс на опрос каждого входа. Из этих 62 мс примерно 45 мс ждём изменения уровня на входе. А как насчёт остальных (4*62)-45 ~= 200 мс? За это время изменение уровня на входе как отслеживается? И как оно отслеживается в промежутке от 45 до 62 мс? И в какое время заниматься математикой, и как во время этого вход отслеживать? |
|
|
"Правки" уже нет, но хотелось бы дописать. Непонятным остается поведение системы в следующем случае. Например, скорость встала на границе двух диапазонов измерения (с/д горит и с/д мигает с частотой 0.5Гц). В этом случае при каждой обработке канала за счет непостоянства (гуляния) скорости, мы будем ставить светодиод или в состояние "горит постоянно" или "мигает 0.5Гц". В результате мигание с/д будет непредсказуемым и отличным от наших двух вариантов, что может быть неправильно воспринято и истолковано оператором. Я уже говорил об этом раньше, но комментариев по этому поводу не было. Я бы сделал здесь какую-то зону нечувствительности при анализе периода, ну типа гистерезиса. Как это сделать, и надо ли это делать - надо думать. Прошу высказаться. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2025 |