Просьба тапками не бросаться - только начал осваивать Attiny 2313. Изучаю по книге Белова
Сейчас ковыряюсь с таймерами.
Ниже кусок извращенского кода, который ведет себя странно (или, скорее всего, я еще не догоняю).
Хочу понять механику работы прерываний для T1 при совпадении с двух каналов.
В текущем виде в обработчиках chnlA/chnlB при значениях TCCR1A 0x40 и 0x10 соответственно сигнала нет на ногах ОС1A/OC1B.
Опытным путем выявил, если и там, и там 0х50, то сигнал идет на 2 канала. И самое странное: если значения реверсные 0х10 и 0х40, то сигналы идут с разной частотой и небольшим сдвигом по фазе
Догадки есть, но почему тишина при "родных" значениях для каналов?
Спойлер
Код: Выделить всё
.cseg
.org 0x00
rjmp reset
.org 0x04
rjmp chnlA
.org 0x0C
rjmp chnlB
; ------------- Модуль инициализации ----------------------------------
reset:
ldi temp, RAMEND
out SPL, temp
ldi temp, 0x18 ; Инициализация порта РВ на вывод: PB3=1 (15) и PB4=1 (16)
out DDRB, temp
clr temp
out DDRD, temp ; Порт PD на ввод DDRD=0
out PORTB, temp ; Низкий уровень => отключаем динамик
ldi temp, 0x7F
out PORTD, temp ; Включение внутренних резисторов
ldi temp, 0x80 ; Выключение компаратора
out ACSR, temp
; ------------- Инициализация таймера/счетчика T1 ---------------------
clr temp
out TCCR1A, temp ; Отключаем каналы А, В
ldi YH, 0x0A
ldi YL, 0x8C
out OCR1BH, YH
out OCR1BL, YL
ldi XH, 0x12
ldi XL, 0x8C
out OCR1AH, XH
out OCR1AL, XL
ldi temp, 0x09
out TCCR1B, temp ; Режим СТС и предделитель 1
ldi temp, 0x60
out TIMSK, temp ; Маска прерываний: разрешены по совпадению канала А и В
out TIFR, temp ; Очищаем флаг совпадения по каналу А и В
sei ; Разрешение прерываний
; ----------- Конец модуля инициалиации --------------------------------
loop: nop
rjmp loop
chnlB:
ldi ocrB, 0x10
out TCCR1A, ocrB ; 0x10 (канал В)
reti
chnlA:
ldi ocrA, 0x40
out TCCR1A, ocrA ; 0x40 (канал A)
reti