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

Проект 46. Метроном с регулировкой темпа

Прибор отбивает такт щелчками пьезоизлучателя, а две кнопки меняют темп. Проект показывает генерацию звука и изменение параметра на ходу.

Задача

Отбивать такт с регулируемой скоростью.

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

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

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

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

ВыводПодключение
PB0пьезоизлучатель, второй вывод на GND
PB1светодиод такта
PD3 / PD4кнопки «быстрее» и «медленнее»

Алгоритм

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

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

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

;=======================================================
; Проект 46. Метроном с регулировкой темпа
; ATmega8, 8 МГц. Пьезоизлучатель — PB0,
; кнопки: PD3 быстрее, PD4 медленнее. Светодиод такта — PB1
;=======================================================
.include "m8def.inc"

.def tmp   = r16
.def tempo = r17                        ; чем меньше, тем быстрее
.def cnt   = r18

.cseg
.org 0x0000
        rjmp    RESET

RESET:
        ldi     tmp, low(RAMEND)
        out     SPL, tmp
        ldi     tmp, high(RAMEND)
        out     SPH, tmp

        ldi     tmp, 0b00000011
        out     DDRB, tmp
        sbi     PORTD, 3                ; подтяжки кнопок
        sbi     PORTD, 4
        ldi     tempo, 20               ; стартовый темп

MAIN:
        rcall   Click                   ; щелчок и вспышка
        mov     cnt, tempo
PAUSE:
        rcall   Delay20ms
        sbis    PIND, 3
        rcall   Faster
        sbis    PIND, 4
        rcall   Slower
        dec     cnt
        brne    PAUSE
        rjmp    MAIN

;--- короткий тональный щелчок ---
Click:
        sbi     PORTB, 1
        ldi     r19, 60                 ; ~60 периодов звука
CL:     sbi     PORTB, 0
        rcall   Delay500us
        cbi     PORTB, 0
        rcall   Delay500us
        dec     r19
        brne    CL
        cbi     PORTB, 1
        ret

Faster:
        rcall   Delay20ms
        sbic    PIND, 3
        ret
        cpi     tempo, 5                ; предел скорости
        breq    FA_REL
        dec     tempo
FA_REL:
        sbis    PIND, 3
        rjmp    FA_REL
        ret

Slower:
        rcall   Delay20ms
        sbic    PIND, 4
        ret
        cpi     tempo, 60
        breq    SL_REL
        inc     tempo
SL_REL:
        sbis    PIND, 4
        rjmp    SL_REL
        ret

Delay500us:
        ldi     r20, 250
T1:     nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        dec     r20
        brne    T1
        ret

Delay20ms:
        ldi     r20, 255
T2:     ldi     r21, 210
T3:     dec     r21
        brne    T3
        dec     r20
        brne    T2
        ret

Пояснения

  • Опрос кнопок внутри паузы даёт мгновенную реакцию на регулировку — темп меняется уже со следующего такта.
  • Пьезоизлучателю нужен именно переменный сигнал: постоянное напряжение звука не даёт. Излучатель со встроенным генератором подключают иначе — постоянным уровнем.
  • Ограничение диапазона обязательно: иначе счётчик темпа перескочит через ноль и метроном сорвётся в непрерывный треск.

Что дальше

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