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

Проект 08. Генератор меандра 1 кГц

Программный генератор прямоугольного сигнала. Проект учит считать время в тактах — навык, без которого невозможны точные задержки и программные протоколы обмена.

Задача

Сформировать на выводе прямоугольный сигнал частотой около 1 кГц.

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

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

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

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

ВыводПодключение
PB0выход сигнала (на осциллограф или пьезоизлучатель)
RESETчерез 10 кОм на +5 В

Алгоритм

  1. Установить высокий уровень на выводе.
  2. Выдержать паузу в половину периода — 500 мкс.
  3. Установить низкий уровень и выдержать такую же паузу.
  4. Повторять бесконечно.

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

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

;=======================================================
; Проект 08. Генератор меандра 1 кГц на PB0
; ATmega8, 8 МГц (1 такт = 0,125 мкс). Полупериод 500 мкс
;=======================================================
.include "m8def.inc"

.def    temp = r16
.def    cnt  = r17

.cseg
.org    0x0000
        rjmp    RESET

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, (1<<PB0)
        out     DDRB, temp

MAIN:
        sbi     PORTB, PB0
        rcall   HALF                    ; пауза 500 мкс
        cbi     PORTB, PB0
        rcall   HALF
        rjmp    MAIN

;--- ~500 мкс: 1330 тактов, виток цикла 3 такта ---
HALF:
        ldi     cnt, 220
HL:     dec     cnt
        nop
        brne    HL
        ret

Пояснения

  • В отличие от PIC, у AVR большинство команд выполняется за один такт, а не за четыре. При 8 МГц такт равен 0,125 мкс.
  • Виток цикла из dec, nop и brne занимает четыре такта (переход — два), поэтому 220 витков дают около 500 мкс.
  • Для точной частоты лучше применять аппаратный таймер в режиме CTC — программная задержка сбивается любым прерыванием.

Что дальше

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