Вы вошли на сайт, как Гость
Регистрация

Секундомер

Программные примеры для микроконтроллеров PIC - MPLab IDE
(Секундомер)

В рассмотренной ниже программе время отслеживается с помощью прерывания от таймера TMR1 через каждую миллисекунду. Запуск секундомера реализуем по нарастающему фронту сигнала на выводе INTO, а останов — по ниспадающему фронту сигнала на том же выводе. Текущее значение секунды выводится через порт D и отображается с помощью светодиодов.

С помощью функции setup_timer_1 устанавливается коэффициент деления частоты системной синхронизации для тактирования таймера. Переполнение счетчика должно возникать через каждые 0,001 с (то есть, 1 мс). Если коэффициент деления выбрать равным 1, то в случае рабочей частоты микроконтроллера в 10 МГц периоду 1 мс соответствует 0,001 x 10000000 = 10000 отсчетам. Поскольку с помощью 16 разрядов счетчика можно получить максимальное значение 65535 (OxFFFF), то он должен инициализироваться значением 65536 - 10000 = 55536.

Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "16F877.h", "stdio.h".

#use delay(clock=10000000)
#fuses HS, NOWDT

int16 msecs;
int secs;
unsigned char is_output;

#int_timer1
void timer1_isr(void)
{
  if (is_output)
  {
    if (++msecs == 1000)
    {
      if (++secs == 60) secs = 0;
      msecs = 0;
      output_D(~secs);
    }
  }
}

#int_ext
void ext_isr(void)
{
  delay_ms(100);
  if (is_output & 1)
    ext_int_edge(0, L_TO_H);
  else 
  {
    set_timer1(55536);
    msecs = 0;
    secs = 0; 
    ext_int_edge(0, H_TO_L);
  }  
  is_output ^= is_output;
}

void main()
{
  port_b_pullups(TRUE);
  ext_int_edge(0, L_TO_H);
  is_output = 0;
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  enable_interrupts(INT_EXT);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(global);
  while(1);   
}

Файлы проекта можно скачать здесь: