Radist, спасибо большое за советы! Сейчас попробую переделать чтобы импульсы за секунду считались...
Мне вот только не совсем понятно что это значит:
А для малых лучше измерять период импульсов, но не одного, а сколько их будет за секунду, а затем усреднить. Границей переключения режимов предлагаю 1 кГц.
Ещё не совсем понятно как сделать так, чтобы считалось время от каждого импульса, чтобы считать не число импульсов , а время между ними как говорил
Мур.???
Попробую порассуждать...
При возникновении импульса по нарастающему фронту генерирую прерывание и в обработчике должен прописать:
...Запрещаю глобально прерывания
1) Читаю значение из таймера.
2) Перевожу в секунды.
3) Вывожу на экран.
4) Обнуляю таймер.
... Разрешаю глобально прерывания
Не совсем понимаю в каком режиме нужно запустить таймер и как из него прочитать текущее значение ???
По сути функция main будет пустая ? ...вся программа в обработчике прерывания ?
Извините, если есть глупые вопросы, просто по воле судьбы я то занимаюсь своим хобби, то приходится забросить на время работы, вот и забывается многое и опыт медленно нарабатывается...
Спасибо Вам за помощь !
Добавлено спустя 18 минут 5 секунд:Считать за секунду получилось *)
Вот куски кода, сначала обработчик внешнего прерывания и переполнения таймера, а потом бесконечный цикл из основной функции...
***
int s; // переменная для хранения выводимого значения
int i; // переменная счётчик прерываний - импульсов
int a; // переменная для подсчёта 31-ого переполнения таймера для выделения секунды
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
i++; // при каждом импульсе увеличиваем i на еденицу
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x00;
// Place your code here
a++;
}***
А теперь основная функция...
***
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{ if (a == 31)
{
#asm ("cli") // глобально запрещаем прерывания на время обработки
s = i; // расчитываем сколько импульсов за секунду
i=0; // обнуляем счётчик импульсов
a=0; // обнуляем счётчик секунды
#asm ("sei") // разрешаем глобальные прерывания
};
// Place your code here
lcd_gotoxy(0,0);
lcd_putchar(s/10+0x30);
lcd_putchar(s%10+0x30);
// delay_ms ();
};
}Теперь хочу научиться считать время между каждым импульсом, подскажите как это сделать ?
В каком режиме запускать таймер и как это сделать ?
Или может без таймера можно обойтись ?