Задача
Сформировать на выводе прямоугольный сигнал частотой около 1 кГц.
Микроконтроллер: ATmega8, кварц 4 МГц. Среда: Atmel Studio / avra (или avra / Atmel Studio). Как настроить среду и прошить контроллер — в статье программирование AVR.
Что понадобится
- ATmega8
- кварц 8 МГц + 2×22 пФ
- осциллограф или пьезоизлучатель для проверки
- резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| PB0 | выход сигнала (на осциллограф или пьезоизлучатель) |
| RESET | через 10 кОм на +5 В |
Алгоритм
- Установить высокий уровень на выводе.
- Выдержать паузу в половину периода — 500 мкс.
- Установить низкий уровень и выдержать такую же паузу.
- Повторять бесконечно.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: 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.