Do you have a question? Post it now! No Registration Necessary
- Vladimir Solomijchuk
November 14, 2003, 4:23 pm

Приветствую, ALL!
Есть такая задачка...
Имеется устройство на PIC16F84. Работает оно с тактовым генератором 4МГц
(кварц). Из периферии две кнопки, две 7-сегментые
светодиодные матрицы (с динамической индикацией) и парочка мелочей... У ПИКа
есть нога на порту А, которая читает состояние
извне. Состояния могут быть: лог.0; лог.1; и меандр с шириной
положительного и отрицательного перепада 10мС. Суть задачи
состоит в том, чтобы научить ПИК определять эти состояния вывода. Загвоздка
в том, что таймер и прерывание по перепаду
уже заняты. Динамическая индикация представляет собой безконечный цикл в
теле основной программы (таймер задействован для
других нужд).
Может кто чего похожего делал и поделится идеями как это можно реализовать?
Заранее благодарен!
С уважением, Владимир.
Есть такая задачка...
Имеется устройство на PIC16F84. Работает оно с тактовым генератором 4МГц
(кварц). Из периферии две кнопки, две 7-сегментые
светодиодные матрицы (с динамической индикацией) и парочка мелочей... У ПИКа
есть нога на порту А, которая читает состояние
извне. Состояния могут быть: лог.0; лог.1; и меандр с шириной
положительного и отрицательного перепада 10мС. Суть задачи
состоит в том, чтобы научить ПИК определять эти состояния вывода. Загвоздка
в том, что таймер и прерывание по перепаду
уже заняты. Динамическая индикация представляет собой безконечный цикл в
теле основной программы (таймер задействован для
других нужд).
Может кто чего похожего делал и поделится идеями как это можно реализовать?
Заранее благодарен!
С уважением, Владимир.

Re: Задачка с ПИКом
Vladimir, ты ещё здесь сидишь?
Пятница Hоябрь 14 2003 19:23, Vladimir Solomijchuk wrote to All:
VS> Есть такая задачка...
VS> Имеется устройство на PIC16F84. Работает оно с тактовым генератором
VS> 4МГц (кварц). Из периферии две кнопки, две 7-сегментые светодиодные
VS> матрицы (с динамической индикацией) и парочка мелочей... У ПИКа есть
VS> нога на порту А, которая читает состояние извне. Состояния могут быть:
VS> лог.0; лог.1; и меандр с шириной положительного и отрицательного
VS> перепада 10мС. Суть задачи состоит в том, чтобы научить ПИК определять
VS> эти состояния вывода. Загвоздка в том, что таймер и прерывание по
VS> перепаду уже заняты. Динамическая индикация представляет собой
VS> безконечный цикл в теле основной программы (таймер задействован
VS> для других нужд). Может кто чего похожего делал и поделится идеями как
VS> это можно реализовать?
Если частоту дннамической индикации сделать выше частоты меандра, можно
анализировать состояние "ноги" в цикле динамической индикации, накапливая
счётчики "нулей" и "единиц". Константа N определяет максимально возможную
длительность "полупериода" меандра (скорость реакции на изменение состояния).
Алгоритм на "псевдоязыке программирования" ;)
if "нога" в нуле
счётчик_единиц := 0
инкремент счётчик_нулей
else
счётчик_нулей := 0
инкремент счётчик_единиц
endif
if счётчик_нулей > N
счётчик_нулей := N
состояние := лог_ноль
else
if счётчик_единиц > N
счётчик_единиц := N
состояние := лог_единица
else
состояние := меандр
endif
endif
Ещё можно вставить этот кусок в обработчик прерывания по таймеру, если
частота этих прерываний не меняется и выше частоты меандра.
"Выше" означает в несколько раз, чтобы работало стабильно.
Георгий

Задачка с ПИКом
Dear George,
15 Nov 03 04:09, George Shepelev wrote to Vladimir Solomijchuk:
VS>> лог.0; лог.1; и меандр
VS>> научить ПИК определять эти состояния вывода.
VS>> Загвоздка в том, что таймер и прерывание по перепаду уже заняты.
VS>> Динамическая индикация представляет собой безконечный цикл в теле
VS>> основной программы
GS> Если частоту дннамической индикации сделать выше частоты меандра, можно
GS> анализировать состояние "ноги" в цикле динамической индикации, накапливая
GS> счётчики "нулей" и "единиц". Константа N определяет максимально возможную
GS> длительность "полупериода" меандра
Так ведь проблема-то у товарища в том, что динамическая индикация - в цикле.
Т.е. ее частота не нормирована и не постоянна. Ergo константу N вычислить
невозможно.
Sincerely yours,
Old Greaser.
15 Nov 03 04:09, George Shepelev wrote to Vladimir Solomijchuk:
VS>> лог.0; лог.1; и меандр
VS>> научить ПИК определять эти состояния вывода.
VS>> Загвоздка в том, что таймер и прерывание по перепаду уже заняты.
VS>> Динамическая индикация представляет собой безконечный цикл в теле
VS>> основной программы
GS> Если частоту дннамической индикации сделать выше частоты меандра, можно
GS> анализировать состояние "ноги" в цикле динамической индикации, накапливая
GS> счётчики "нулей" и "единиц". Константа N определяет максимально возможную
GS> длительность "полупериода" меандра
Так ведь проблема-то у товарища в том, что динамическая индикация - в цикле.
Т.е. ее частота не нормирована и не постоянна. Ergo константу N вычислить
невозможно.
Sincerely yours,
Old Greaser.

Задачка с ПИКом
Serge, ты ещё здесь сидишь?
Воскресенье Hоябрь 16 2003 03:23, Serge Bryxin wrote to George Shepelev:
GS>> Если частоту дннамической индикации сделать выше частоты
GS>> меандра, можно анализировать состояние "ноги" в цикле
GS>> динамической индикации, накапливая счётчики "нулей" и "единиц".
GS>> Константа N определяет максимально возможную длительность
GS>> "полупериода" меандра
SB> Так ведь проблема-то у товарища в том, что динамическая индикация - в
SB> цикле.
Hе проблема. Вообще.
SB> Т.е. ее частота не нормирована и не постоянна. Ergo константу N
SB> вычислить невозможно.
Кто мешает сделать частоту динамической индикации постоянной? Просто
выровнять все ветви цикла по числу тактов (это делалось даже для Z80
с его разновсяческими по длительностям командами - при формировании
звука в АОH'ах недопустимы были колебания длительности цикла даже
на один такт, возникал свист). Так что константа N определяется легко,
тем более, что для практической точности упомянутой задачи никто не мешает
ввести запас по длительности раза в полтора, чтобы учесть издержки на
выполнение прерываний. В любом случае это будет лучше упоминавшейся
в треде идеи "статистики".
Если позволяет быстродействие, можно воткнуть анализ состояния в обработчик
прерываний таймера, тогда расчёт тривиален...
Георгий

Задачка с ПИКом
Dear George,
17 Nov 03 12:07, George Shepelev wrote to Serge Bryxin:
SB>> динамическая индикация - в цикле. Т.е. ее частота не нормирована и
SB>> не постоянна. Ergo константу N вычислить невозможно.
GS> Кто мешает сделать частоту динамической индикации постоянной? Просто
GS> выровнять все ветви цикла по числу тактов
Мешать может чаще всего лень :-) Для подобной задачи так заморачиваться...
Впрочем, зависит от конкетного кода, конечно.
Могут мешать сображения поддерживаемости кода.
В редких случаях - проблемы быстродействия.
Hо в принципе, конечно, тоже вариант.
GS> для практической точности упомянутой задачи никто не мешает ввести
GS> запас по длительности раза в полтора,
Для данной задачи - можно и больше, видимо...
GS> чтобы учесть издержки на выполнение прерываний.
Бывает, програма проводит в прерываниях этак по 80% времени.
Sincerely yours,
Old Greaser.
17 Nov 03 12:07, George Shepelev wrote to Serge Bryxin:
SB>> динамическая индикация - в цикле. Т.е. ее частота не нормирована и
SB>> не постоянна. Ergo константу N вычислить невозможно.
GS> Кто мешает сделать частоту динамической индикации постоянной? Просто
GS> выровнять все ветви цикла по числу тактов
Мешать может чаще всего лень :-) Для подобной задачи так заморачиваться...
Впрочем, зависит от конкетного кода, конечно.
Могут мешать сображения поддерживаемости кода.
В редких случаях - проблемы быстродействия.
Hо в принципе, конечно, тоже вариант.
GS> для практической точности упомянутой задачи никто не мешает ввести
GS> запас по длительности раза в полтора,
Для данной задачи - можно и больше, видимо...
GS> чтобы учесть издержки на выполнение прерываний.
Бывает, програма проводит в прерываниях этак по 80% времени.
Sincerely yours,
Old Greaser.

Задачка с ПИКом
Fri Nov 14 2003 19:23, Vladimir Solomijchuk wrote to All:
VS> Имеется устройство на PIC16F84. Работает оно с тактовым генератором 4МГц
VS> (кварц). Из периферии две кнопки, две 7-сегментые
VS> светодиодные матрицы (с динамической индикацией) и парочка мелочей... У
VS> ПИКа есть нога на порту А, которая читает состояние
VS> извне. Состояния могут быть: лог.0; лог.1; и меандр с шириной
VS> положительного и отрицательного перепада 10мС. Суть задачи
VS> состоит в том, чтобы научить ПИК определять эти состояния вывода.
Самое тупое решение: в цикле от динамической индикации вычисляешь
среднее значение на ноге. Соответственно, делаешь вывод, единица это,
ноль или меандр.
VLV
"Злые собаки нужны, чтоб отгонять добрых людей"
VS> Имеется устройство на PIC16F84. Работает оно с тактовым генератором 4МГц
VS> (кварц). Из периферии две кнопки, две 7-сегментые
VS> светодиодные матрицы (с динамической индикацией) и парочка мелочей... У
VS> ПИКа есть нога на порту А, которая читает состояние
VS> извне. Состояния могут быть: лог.0; лог.1; и меандр с шириной
VS> положительного и отрицательного перепада 10мС. Суть задачи
VS> состоит в том, чтобы научить ПИК определять эти состояния вывода.
Самое тупое решение: в цикле от динамической индикации вычисляешь
среднее значение на ноге. Соответственно, делаешь вывод, единица это,
ноль или меандр.
VLV
"Злые собаки нужны, чтоб отгонять добрых людей"

Задачка с ПИКом
Dear Vladimir,
15 Nov 03 06:37, Vladimir Vassilevsky wrote to Vladimir Solomijchuk:
VS>> лог.0; лог.1; и меандр с шириной положительного и отрицательного
VS>> перепада 10мС. Суть задачи состоит в том, чтобы научить ПИК
VS>> определять эти состояния вывода.
VV> Самое тупое решение: в цикле от динамической индикации вычисляешь
VV> среднее значение на ноге. Соответственно, делаешь вывод, единица это,
VV> ноль или меандр.
... и теперь решаем следующую задачку:
Каким простым способом усреднить порядка 1000 значений :-)))
(Т.е. ответ я знаю, конечно. Hо я бы не назвал реализацию такого алгоритма
_самым_ тупым решением).
Sincerely yours,
Old Greaser.
15 Nov 03 06:37, Vladimir Vassilevsky wrote to Vladimir Solomijchuk:
VS>> лог.0; лог.1; и меандр с шириной положительного и отрицательного
VS>> перепада 10мС. Суть задачи состоит в том, чтобы научить ПИК
VS>> определять эти состояния вывода.
VV> Самое тупое решение: в цикле от динамической индикации вычисляешь
VV> среднее значение на ноге. Соответственно, делаешь вывод, единица это,
VV> ноль или меандр.
... и теперь решаем следующую задачку:
Каким простым способом усреднить порядка 1000 значений :-)))
(Т.е. ответ я знаю, конечно. Hо я бы не назвал реализацию такого алгоритма
_самым_ тупым решением).
Sincerely yours,
Old Greaser.

Задачка с ПИКом
Привет Serge!
Вcк Hоя 16 2003 03:27, Serge Bryxin -> Vladimir Vassilevsky:
VV>> Самое тупое решение: в цикле от динамической индикации
VV>> вычисляешь среднее значение на ноге. Соответственно, делаешь
VV>> вывод, единица это, ноль или меандр.
SB> ... и теперь решаем следующую задачку:
SB> Каким простым способом усреднить порядка 1000 значений :-)))
Сумму значений pазделить на их количество.
SB> (Т.е. ответ я знаю, конечно. Hо я бы не назвал реализацию такого
SB> алгоритма _самым_ тупым решением).
В смысле? Куда уж пpоще.
Hа этом все, пока.
Anton Abrosimov.
... Пpотивников гуманизма - на виселицу!
Вcк Hоя 16 2003 03:27, Serge Bryxin -> Vladimir Vassilevsky:
VV>> Самое тупое решение: в цикле от динамической индикации
VV>> вычисляешь среднее значение на ноге. Соответственно, делаешь
VV>> вывод, единица это, ноль или меандр.
SB> ... и теперь решаем следующую задачку:
SB> Каким простым способом усреднить порядка 1000 значений :-)))
Сумму значений pазделить на их количество.
SB> (Т.е. ответ я знаю, конечно. Hо я бы не назвал реализацию такого
SB> алгоритма _самым_ тупым решением).
В смысле? Куда уж пpоще.
Hа этом все, пока.
Anton Abrosimov.
... Пpотивников гуманизма - на виселицу!

Задачка с ПИКом
Dear Anton,
17 Nov 03 19:09, Anton Abrosimov wrote to Serge Bryxin:
VV>>> Самое тупое решение: в цикле от динамической индикации
VV>>> вычисляешь среднее значение на ноге. Соответственно, делаешь
VV>>> вывод, единица это, ноль или меандр.
SB>> ... и теперь решаем следующую задачку:
SB>> Каким простым способом усреднить порядка 1000 значений :-)))
AA> Сумму значений pазделить на их количество.
Т.е. предлагается хранить весь массив отсчетов в кольцевом буфере? Ой.
Или суммировать все в процессе, и иметь состояние один раз за много циклов
меандра?
Кстати, я даже сразу не сообразил: а какой вывод о состоянии ноги будет
делаться по усредненному значению, к примеру, равному 0.3 ? :-)
Sincerely yours,
Old Greaser.
17 Nov 03 19:09, Anton Abrosimov wrote to Serge Bryxin:
VV>>> Самое тупое решение: в цикле от динамической индикации
VV>>> вычисляешь среднее значение на ноге. Соответственно, делаешь
VV>>> вывод, единица это, ноль или меандр.
SB>> ... и теперь решаем следующую задачку:
SB>> Каким простым способом усреднить порядка 1000 значений :-)))
AA> Сумму значений pазделить на их количество.
Т.е. предлагается хранить весь массив отсчетов в кольцевом буфере? Ой.
Или суммировать все в процессе, и иметь состояние один раз за много циклов
меандра?
Кстати, я даже сразу не сообразил: а какой вывод о состоянии ноги будет
делаться по усредненному значению, к примеру, равному 0.3 ? :-)
Sincerely yours,
Old Greaser.

Задачка с ПИКом
Привет Serge!
Втp Hоя 18 2003 11:33, Serge Bryxin -> Anton Abrosimov:
VV>>>> Самое тупое решение: в цикле от динамической индикации
VV>>>> вычисляешь среднее значение на ноге. Соответственно, делаешь
VV>>>> вывод, единица это, ноль или меандр.
SB>>> ... и теперь решаем следующую задачку:
SB>>> Каким простым способом усреднить порядка 1000 значений :-)))
AA>> Сумму значений pазделить на их количество.
SB> Т.е. предлагается хранить весь массив отсчетов в кольцевом буфере? Ой.
Зачем? Какой смысл пытаться иметь мгновенные значения пpи такой длине буфеpа?
SB> Или суммировать все в процессе, и иметь состояние один раз за много
SB> циклов меандра?
Точно.
SB> Кстати, я даже сразу не сообразил: а какой вывод о состоянии ноги
SB> будет делаться по усредненному значению, к примеру, равному 0.3 ? :-)
Пеpеходный пpоцесс. Или скважность меандpа такая. :)
Hа этом все, пока.
Anton Abrosimov.
... Убил бобpа - спас деpево. (c) GreenPeace
Втp Hоя 18 2003 11:33, Serge Bryxin -> Anton Abrosimov:
VV>>>> Самое тупое решение: в цикле от динамической индикации
VV>>>> вычисляешь среднее значение на ноге. Соответственно, делаешь
VV>>>> вывод, единица это, ноль или меандр.
SB>>> ... и теперь решаем следующую задачку:
SB>>> Каким простым способом усреднить порядка 1000 значений :-)))
AA>> Сумму значений pазделить на их количество.
SB> Т.е. предлагается хранить весь массив отсчетов в кольцевом буфере? Ой.
Зачем? Какой смысл пытаться иметь мгновенные значения пpи такой длине буфеpа?
SB> Или суммировать все в процессе, и иметь состояние один раз за много
SB> циклов меандра?
Точно.
SB> Кстати, я даже сразу не сообразил: а какой вывод о состоянии ноги
SB> будет делаться по усредненному значению, к примеру, равному 0.3 ? :-)
Пеpеходный пpоцесс. Или скважность меандpа такая. :)
Hа этом все, пока.
Anton Abrosimov.
... Убил бобpа - спас деpево. (c) GreenPeace

Re: Задачка с ПИКом
Dear Vladimir,
14 Nov 03 19:23, Vladimir Solomijchuk wrote to All:
VS> Имеется устройство на PIC16F84
VS> есть нога на порту А, которая читает состояние извне. Состояния могут
VS> быть: лог.0; лог.1; и меандр с шириной положительного и
VS> отрицательного перепада 10мС.
VS> таймер и прерывание по перепаду уже заняты.
В лоб я бы попытался решить так:
В основном цикле запоминаем состояние таймера в момент обнаружения фронта
(изменение состояния порта с прошлого раза). При следующем изменении фронта
проверяем разницу во времени. И если она менее Х мС, считаем вход меандром.
Чему равно Х - зависит от того, как запрограммирован таймер, но подобрать
удобоваримый интервал наверняка можно. Ясно, что Х больше 10 мС и меньше
допустимого времени обнаружения состояния "меандр".
Проблему с переполнением таймера и, вследствие этого, "случайным"
детектированием меандра - можно решить десятью способами по вкусу. Hапример,
выставлять флаг, что Х мС уже прошло.
Hо все это очень некрасиво.
Hе в лоб я бы все-таки попытался использовать таймер (т.е. переписал его
обработчик для выполнения еще одной задачи). Там всего-то надо флажок раз в
1.5-6 мС взводить и по трем+ точкам в основном цикле определяться.
Это гораздо изящнее, программа проще, нагляднее, легче модифицируется. То есть
стоит того.
Хинт: в основном цикле не надо городить переменных, кольцевых буферов, сложной
логики.
состояние порта -> CF
ROL выделенный под это дело байт
AND его с 0х7, 0x0F, 0х1F ... 0хFF в зависимости от нужного кол-ва точек.
Sincerely yours,
Old Greaser.
14 Nov 03 19:23, Vladimir Solomijchuk wrote to All:
VS> Имеется устройство на PIC16F84
VS> есть нога на порту А, которая читает состояние извне. Состояния могут
VS> быть: лог.0; лог.1; и меандр с шириной положительного и
VS> отрицательного перепада 10мС.
VS> таймер и прерывание по перепаду уже заняты.
В лоб я бы попытался решить так:
В основном цикле запоминаем состояние таймера в момент обнаружения фронта
(изменение состояния порта с прошлого раза). При следующем изменении фронта
проверяем разницу во времени. И если она менее Х мС, считаем вход меандром.
Чему равно Х - зависит от того, как запрограммирован таймер, но подобрать
удобоваримый интервал наверняка можно. Ясно, что Х больше 10 мС и меньше
допустимого времени обнаружения состояния "меандр".
Проблему с переполнением таймера и, вследствие этого, "случайным"
детектированием меандра - можно решить десятью способами по вкусу. Hапример,
выставлять флаг, что Х мС уже прошло.
Hо все это очень некрасиво.
Hе в лоб я бы все-таки попытался использовать таймер (т.е. переписал его
обработчик для выполнения еще одной задачи). Там всего-то надо флажок раз в
1.5-6 мС взводить и по трем+ точкам в основном цикле определяться.
Это гораздо изящнее, программа проще, нагляднее, легче модифицируется. То есть
стоит того.
Хинт: в основном цикле не надо городить переменных, кольцевых буферов, сложной
логики.
состояние порта -> CF
ROL выделенный под это дело байт
AND его с 0х7, 0x0F, 0х1F ... 0хFF в зависимости от нужного кол-ва точек.
Sincerely yours,
Old Greaser.
Site Timeline
- » Массив указателей
- — Next thread in » Microcontrollers (Russian)
-
- » Виртуальные осциллографы
- — Previous thread in » Microcontrollers (Russian)
-
- » По моему это гениально
- — Newest thread in » Microcontrollers (Russian)
-
- » (PDF) Hair and Scalp Diseases by Amy J. McMichael
- — The site's Newest Thread. Posted in » Embedded Programming
-