Микроконтроллеры | Ликбез по программированию PIC |
|
---|---|---|
ОК,большое спасибо.Я тоже думал примерно таким образом,через проверку С,только не мог до конца сообразить.(Наверное проблемы с логикой |
|
|
Уааауууу!!!Круто!!! Получилось с первого раза. |
|
|
Ну и отлично! Вот и результат моего вчерашнего труда: http://www.pic16.nm.ru/likbez1/freq01_1.zip Предложение такое: создать в ОЗУ буфер, например, из 64 регистров - по 16 на каждый вход. Я пока использовал по 8 из них, но это количество легко изменить. Пока буду говорить о восьми регистрах для каждого входа. В обработчике прерываний по переполнению TMR0 при выявлении фронта на входе происходит запись числа, соответствующего интервалу времени от предыдущего фронта на этом входе до текущего, из регистра PERIOD в буфер - циклически: 1, 2, 3 .. 7, 8, 1, 2 .. и т.д. по каждому фронту. Применена косвенная адресация. После каждой такой операции регистр PERIOD обнуляется. Кроме того, при выявлении фронта на входе устанавливается соответствующий этому входу флаг разрешения счёта. Номер текущего регистра буфера хранится в регистре COUNTER. Инкремент регистра PERIOD происходит в прерываниях при условии, что установлен соответствующий флаг разрешения счёта. После инкремента проверяется условие тайм-аута по входу: если число в регистре PERIOD превысило 250 (0xFA), то флаг разрешения счёта сбрасывается, в регистр PERIOD заносится число 255 (0xFF), а регистр COUNTER обнуляется. Суть идеи такая: передать из обработчика прерываний через буфер в основную программу по 8 значений периодов для каждого входа. Причём в основной программе в любой момент все 8 значений для каждого входа доступны для чтения и отражают реальное положение дел. Признак тайм-аута может передаваться в основную программу через регистры PERIOD и COUNTER. А можно и соответствующие флаги предусмотреть. В основной программе остаётся усреднить результат из буфера (при условии, что нет тайм-аута). Затем сравнить его с заданными значениями и выдать результаты на индикаторы и на выход. Эту часть программы я пока не обдумывал. |
|
|
|
||
Вопросик к тем кто знает |
|
|
Да, если в программе указано cblock 0x20, то ассемблер сопоставит указанным далее именам регистры ОЗУ, начиная с адреса 020h, и далее по очереди (021h, 022h...). В этом можно убедиться собственными глазами - с помощью симулятора MPLAB например. Занести в программном коде в регистр пользователя определённую константу и посмотреть - в регистр по какому адресу она будет записана при симуляции. |
|
|
picmaniac, прошу прощения. |
|
|
picmaniac,спасибо! |
|
|
Nikus: Как в MPLab Sim ,или где ,можно отслеживать пользовательские регистры? Есть более удобное средство. View - Watch. Там вы можете выбрать показ любых регистров, не загромождаясь лишней информацией. |
|
|
Nikus: И если знаете по Протеусу.Раньше когда нажимал кнопку "Пауза",появлялось окно дебаггера,а сейчас нет.Я вот не понял почему так.Вроде специально не удалял,и тоже не получается вернуть его |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2025 |