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

Частотомер и подсчет импульсов

Всем привет!
Я как-то создавал тему http://pro-radio.ru/controllers/7584/ и там Gregory написал по поводу частотомера следующее:

"это электронный спидометр, т.е. по сути - частотомер. В расказанном вами случае, он реализован на подсчёте импульсов за единицу времени. Данный способ весьма "инертен". Более "быстрым" является способ измерения времени между импульсами. В/у 628-й МК позволяет это реализовать аппаратно, ибо имеет встроенный модуль CCP, который, будучи включённым в режиме "захвата", как-раз и производит данное действие."

Я вот нашел эту реализацию, это на CCS-PICC:

#include <16F877.h>
#use delay(clock=10000000)
#fuses HS, NOWDT

int N_overflows; // количество переполнений
unsigned long int N_start, N_end; // N_start - количество тактовых импульсов принятых на начало периода, N_end - количество тактовых импульсов принятых на конец периода
long int N;

#int_timer1 // обработка прерывания при переполнении TMR1
timer1_isr()
{
++N_overflows; // увеличиваем счетчик переполнений
}

#int_CCP1 // обработка прерывания при захвате на входе
CCP1_isr()
{
N_end = CCP1; // количество тактовых импульсов подсчитанных с момента поступления предыдущего импульса на входе CCP1
// вычисляем период между двумя последовательными импульсами CCP1
N = (N_overflows * 0x10000) - N_start + N_end; // период, количество тактовых импульсов между внешними импульсами

...

N_start = N_end; // запоминаем позицию текущего замера
N_overflows = 0; // сбрасываем счетчик переполнений
}

void main()
{
setup_ccp1(CCP_CAPTURE_RE);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_CCP1);
enable_interrupts(global);
while(1);
}

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

и еще яхочу код переделать под HI-TECH, подскажите как перевести эту строку: #use delay(clock=10000000) ?

 

если не используете встроенную функцию delay можно просто выкинуть, если используете то тоже выкинуть
и написать свою функцию delay

 

ок, но подскажите по самому вопросу еще пожалуйста..