AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 23. Счётчик импульсов (основа частотомера)

TMR0 переключён в режим счёта внешних импульсов. Открываем окно ровно на секунду — и получаем частоту. Это принцип работы любого цифрового частотомера.

Задача

Подсчитать число импульсов на входе за одну секунду.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • 8 светодиодов + 8×330 Ом
  • источник импульсов
  • резистор 10 кОм

Схема подключения

ВыводПодключение
RA4 / T0CKIвход импульсов (открытый сток — нужна подтяжка 10 кОм на +5 В)
RB0…RB7индикация результата
MCLRчерез 10 кОм на +5 В

Алгоритм

  1. Настроить OPTION_REG: источник TMR0 — вход T0CKI, счёт по спаду.
  2. Обнулить TMR0 — открыть окно измерения.
  3. Выдержать ровно одну секунду.
  4. Прочитать TMR0 — это число импульсов, то есть частота в герцах.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: p23.asm · p23.hex (готовая прошивка).

;=======================================================
; Проект 23. Счётчик импульсов (основа частотомера)
; PIC16F84A, 4 МГц. Вход импульсов — RA4/T0CKI
; TMR0 работает счётчиком внешних импульсов,
; результат за 1 секунду выводится на светодиоды RB0..RB7
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2, d3
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB           ; индикация — выходы
        movlw   b'00110000'     ; RA4 — вход
        movwf   TRISA
        movlw   b'00101000'     ; TMR0 от RA4/T0CKI, по спаду, без предделителя
        movwf   OPTION_REG
        bcf     STATUS,RP0

Main
        clrf    TMR0            ; открываем окно счёта
        call    Delay1s         ; измерительный интервал 1 секунда
        movf    TMR0,w          ; сколько импульсов насчитали
        movwf   PORTB           ; выводим код на светодиоды
        goto    Main

;--- измерительное окно ровно 1 секунда ---
Delay1s
        movlw   .5
        movwf   d3
S1      movlw   .255
        movwf   d1
S2      movlw   .255
        movwf   d2
S3      nop
        nop
        decfsz  d2,f
        goto    S3
        decfsz  d1,f
        goto    S2
        decfsz  d3,f
        goto    S1
        return

        END

Пояснения

  • Вывод RA4 имеет открытый сток, поэтому подтягивающий резистор обязателен, иначе счёт не пойдёт.
  • Восьмиразрядный TMR0 считает до 255; для больших частот подключают предделитель или наращивают разрядность программным счётчиком переполнений.
  • Точность измерения целиком зависит от точности секундного окна — здесь напрямую работает стабильность кварца.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.