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

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

1 71 99

ОК,большое спасибо.Я тоже думал примерно таким образом,через проверку С,только не мог до конца сообразить.(Наверное проблемы с логикой ).
Буду пробовать

 

Уааауууу!!!Круто!!! Получилось с первого раза.
picaniac ,большое спасибо ещё раз.Сэкономлено много нервных клеток и времени.
Буду продолжать наращивать обьёмы

 

Ну и отлично!

Вот и результат моего вчерашнего труда: http://www.pic16.nm.ru/likbez1/freq01_1.zip
Это пока только набросок. t = 250 мкс. Смотреть только совместно с графом.

Предложение такое: создать в ОЗУ буфер, например, из 64 регистров - по 16 на каждый вход. Я пока использовал по 8 из них, но это количество легко изменить. Пока буду говорить о восьми регистрах для каждого входа.

В обработчике прерываний по переполнению TMR0 при выявлении фронта на входе происходит запись числа, соответствующего интервалу времени от предыдущего фронта на этом входе до текущего, из регистра PERIOD в буфер - циклически: 1, 2, 3 .. 7, 8, 1, 2 .. и т.д. по каждому фронту. Применена косвенная адресация. После каждой такой операции регистр PERIOD обнуляется. Кроме того, при выявлении фронта на входе устанавливается соответствующий этому входу флаг разрешения счёта. Номер текущего регистра буфера хранится в регистре COUNTER.

Инкремент регистра PERIOD происходит в прерываниях при условии, что установлен соответствующий флаг разрешения счёта. После инкремента проверяется условие тайм-аута по входу: если число в регистре PERIOD превысило 250 (0xFA), то флаг разрешения счёта сбрасывается, в регистр PERIOD заносится число 255 (0xFF), а регистр COUNTER обнуляется.
Работа с входами ведётся поочерёдно. В каждом прерывании независимо от всего остального инкрементируется 16-разрядный счётчик CNTRWORD (Counter Word). Он, думаю, для организации мигания потребуется.

Суть идеи такая: передать из обработчика прерываний через буфер в основную программу по 8 значений периодов для каждого входа. Причём в основной программе в любой момент все 8 значений для каждого входа доступны для чтения и отражают реальное положение дел. Признак тайм-аута может передаваться в основную программу через регистры PERIOD и COUNTER. А можно и соответствующие флаги предусмотреть.

В основной программе остаётся усреднить результат из буфера (при условии, что нет тайм-аута). Затем сравнить его с заданными значениями и выдать результаты на индикаторы и на выход. Эту часть программы я пока не обдумывал.

 

Ну граф вроде нормальный

 

Вопросик к тем кто знает
Если я описываю юзерские регистры с адреса 0х20,то они будут прошиты с этого же адреса и в том же порядке в каком и были описаны?Или нет.

 

Да, если в программе указано cblock 0x20, то ассемблер сопоставит указанным далее именам регистры ОЗУ, начиная с адреса 020h, и далее по очереди (021h, 022h...). В этом можно убедиться собственными глазами - с помощью симулятора MPLAB например. Занести в программном коде в регистр пользователя определённую константу и посмотреть - в регистр по какому адресу она будет записана при симуляции.
"Прошиты" - не совсем корректное слово.

 

picmaniac, прошу прощения. Я тут несколько отвлекся от основного задания, пока "затишье" было, на http://pro-radio.ru/ideas/3139-1/ Сейчас доделую и "блудный сын" вернется.
Тут попутно вопросик возник. Если мы из подпрограммы, вызванной "call" выходим не по "returnу", а раньше, по goto, причем адрес возврата при этом уже становится ненужным. После нескольких подобных процедур, как я понимаю, переполняется стек. Может ли это чем то грозить?

 

picmaniac,спасибо!
И тогда по ходу ещё вопрос.Как в MPLab Sim ,или где ,можно отслеживать пользовательские регистры? Чё-то я не допетрал.Есть ли такая возможность?
И если знаете по Протеусу.Раньше когда нажимал кнопку "Пауза",появлялось окно дебаггера,а сейчас нет.Я вот не понял почему так.Вроде специально не удалял,и тоже не получается вернуть его .

 

Nikus: Как в MPLab Sim ,или где ,можно отслеживать пользовательские регистры?
Да каже так?! При отладке программы в мплабе только этим и занимаемся.
Если у вас седьмая версия, то войдите View - File registers. В появившемся окошке слева внизу надо выбрать Simbolic. В любом месте окошка кликните правой кнопки мыши, выберите properties. В появившемся окошке выберите Column Settings. Поставьте галочки того, что вы хотите в регистрах видеть.

Есть более удобное средство. View - Watch. Там вы можете выбрать показ любых регистров, не загромождаясь лишней информацией.

 

Nikus: И если знаете по Протеусу.Раньше когда нажимал кнопку "Пауза",появлялось окно дебаггера,а сейчас нет.Я вот не понял почему так.Вроде специально не удалял,и тоже не получается вернуть его
В режиме "пауза" войдите в Debug. Там внизу появляются 8 пунктов включения различных окошек показа.