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

Проект 50. Электронный метроном

Завершающий проект: метроном отбивает такт щелчком и вспышкой светодиода, темп регулируется кнопками. Объединяет генерацию звука, отсчёт интервалов и опрос кнопок.

Задача

Отбивать такт с регулируемым темпом звуком и светом.

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

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

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

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

ВыводПодключение
RB0пьезоизлучатель (второй вывод на GND)
RB1светодиод через резистор 330 Ом
RA0 / RA1кнопки: быстрее и медленнее

Алгоритм

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

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

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

;=======================================================
; Проект 50. Электронный метроном
; PIC16F84A, 4 МГц. Пьезоизлучатель — RB0, светодиод — RB1
; Кнопки RA0 (быстрее) и RA1 (медленнее), темп 40..208 уд/мин
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2, period, cnt, beats
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB
        movlw   b'00011111'
        movwf   TRISA
        bcf     STATUS,RP0
        clrf    PORTB
        movlw   .50             ; стартовый темп (около 120 уд/мин)
        movwf   period

Main
        call    Click           ; щелчок и вспышка
        movf    period,w        ; пауза до следующей доли
        movwf   cnt
PDelay
        call    Delay10ms
        call    CheckKeys
        decfsz  cnt,f
        goto    PDelay
        goto    Main

;--- короткий тон 2 кГц на пьезоизлучателе ---
Click
        bsf     PORTB,1         ; вспышка светодиода
        movlw   .60
        movwf   beats
Tone
        bsf     PORTB,0
        call    Delay250us
        bcf     PORTB,0
        call    Delay250us
        decfsz  beats,f
        goto    Tone
        bcf     PORTB,1
        return

CheckKeys
        btfss   PORTA,0         ; быстрее — уменьшаем паузу
        goto    Faster
        btfss   PORTA,1         ; медленнее — увеличиваем
        goto    Slower
        return
Faster
        movlw   .20             ; предел темпа
        subwf   period,w
        btfsc   STATUS,C
        decf    period,f
        return
Slower
        movlw   .150
        subwf   period,w
        btfss   STATUS,C
        incf    period,f
        return

Delay250us
        movlw   .82
        movwf   d1
X2      nop
        decfsz  d1,f
        goto    X2
        return

Delay10ms
        movlw   .20
        movwf   d2
Y1      movlw   .165
        movwf   d1
Y2      nop
        decfsz  d1,f
        goto    Y2
        decfsz  d2,f
        goto    Y1
        return

        END

Пояснения

  • Тон формируется переключением вывода с периодом, вдвое меньшим периода звука: 250 мкс на полупериод дают около 2 кГц.
  • Пьезоизлучатель нужен пассивный, без встроенного генератора, иначе он выдаст собственный тон вместо заданного.
  • Опрос кнопок встроен в паузу, поэтому регулировка отзывчива и не сбивает ритм.

Что дальше

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