Вот снимок из даташита:
А вот неоптимизированный пример идеи, набитый на скорую руку.
Довести до ума и будет чётко
Код: Выделить всё
.include "tn26def.inc"
;*********************************
;Definitions
.def temp0 = r16
.def temp1 = r17
.def play_count = r18
;*********************************
; SRAM
.dseg
buffer: .byte 64
;*********************************
;FLASH
.cseg
.org 0x0000
rjmp RESET
.org OC1Aaddr
rjmp TIM1_CMP1A ; Timer1 compare match 1A
;----------
.org INT_VECTORS_SIZE
TIM1_CMP1A:
; Тут мы будем грузить новый байт
; Время для выполнения операции подбирается в OCR1A
ld temp1, Y+
out OCR1B, temp1
inc play_count
cpi play_count, 0x40 ;64
breq CLRCNT
reti
CLRCNT:
clr play_count
ldi YL, Low(buffer)
ldi YH, High(buffer)
reti
;---------- Начало программы
RESET:
ldi temp0, Low(RAMend)
out SP, temp0
;---------- Настройка портов для работы ШИМ
sbi DDRB, 3
;---------- Настройка таймера
ldi temp0, (1<<PWM1B)|(1<<COM1B1)
out TCCR1A, temp0
;---------- Частота и разрешение ШИМ
ldi temp0, 0xFF
out OCR1C, temp0
;---------- Ранний вызов прерывания
ldi temp0, 0xE1
out OCR1A, temp0
;---------- Почистим регистр вывода
ldi temp0, 0x00
out OCR1B, temp0
;---------- Разрешим прерывание по А
ldi temp0, (1<<OCIE1A)
out TIMSK, temp0
;----------
clr play_count
ldi YL, Low(buffer)
ldi YH, High(buffer)
;---------- Частота тактирования
ldi temp0, (1<<CS10)
out TCCR1B, temp0
sei
;---------- Пустой бесконечный цикл
LOOP:
rjmp LOOP
