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

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

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

Задача

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

Микроконтроллер: ATmega8, кварц 4 МГц. Среда: Atmel Studio / avra (или avra / Atmel Studio). Как настроить среду и прошить контроллер — в статье программирование AVR.

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

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

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

ВыводПодключение
PD4 / T0вход импульсов (включена внутренняя подтяжка)
PB0…PB7индикация результата

Алгоритм

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

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

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

;=======================================================
; Проект 23. Счётчик импульсов (основа частотомера)
; ATmega8, 8 МГц. Вход импульсов — T0 (PD4)
; T0 считает внешние импульсы, результат за 1 с — на PB0..PB7
;=======================================================
.include "m8def.inc"
.def    temp = r16
.def    d1   = r17
.def    d2   = r18
.def    d3   = r19

.cseg
.org    0x0000
        rjmp    RESET

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, 0xFF
        out     DDRB, temp              ; индикация
        cbi     DDRD, PD4               ; вход T0
        sbi     PORTD, PD4              ; подтяжка

        ldi     temp, (1<<CS02)|(1<<CS01)   ; тактирование от вывода T0, по спаду
        out     TCCR0, temp

MAIN:
        clr     temp
        out     TCNT0, temp             ; открываем окно счёта
        rcall   DELAY1S                 ; измерительный интервал
        in      temp, TCNT0             ; число импульсов за секунду
        out     PORTB, temp
        rjmp    MAIN

DELAY1S:
        ldi     d3, 41
C3:     ldi     d2, 255
C2:     ldi     d1, 255
C1:     dec     d1
        brne    C1
        dec     d2
        brne    C2
        dec     d3
        brne    C3
        ret

Пояснения

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

Что дальше

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