Как мы и запланировали. С первого канала длительность импульса в 1/3
периода, а со второго в 1/2
Ну и светодиоды горят с разной яркостью. Один ярче, другой тусклей. Меняя
значение в регистрах OCR*** мы можем менять скважность.
Давай сделаем так, чтобы светодиод плавно менял свою яркость от нуля до
максимума. Как помнишь, у нас там была программа, с мигающем по
таймеру0 светодиодом. Немного ее подправим, сделаем так, чтобы по
таймеру не светодиод мигал, а менялось значение в регистрах сравнения
OCR1A и OCR1B. Причем меняться оно будет в разные стороны :)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
; Main =========================================================
Main: LDS R16,TCNT ; Грузим числа в регистры
LDS R17,TCNT+1
CPI R16,0x10 ; Сравниванем побайтно выдержку
BRCS NoMatch
CPI R17,0x01 ; Выдержку сделали поменьше = 0x0110
BRCS NoMatch
; Если совпало то делаем экшн
Match: CLI ; Запрет прерываний, т.к. атомарный доступ
; Меняем первый канал
; Особенность 16ти разрядных регистров в том, что их надо правильно читать
и записывать.
; Читают вначале младший, потом старший байты. Так надо, чтобы младший не
успел измениться
; (он ведь может тикать по таймеру) пока читают первым старший. Укладывают
их в обратном
; порядке. Сначала старший, потом младший. Правда для регистров OCR это не
имеет большой
; разницы -- они статичные, а вот для TCNT очень даже!
IN R16,OCR1AL ; Достали первый байт сравнения
IN R17,OCR1AH ; он 16ти разрядный, но старший байт будет 0
INC R16 ; Увеличили
OUT OCR1AH,R17 ; И сунули их обратно
OUT OCR1AL,R16
; Меняем второй канал
IN R16,OCR1BL ; Достали второй байт сравнения
IN R17,OCR1BH ; он 16ти разрядный, но старший байт будет 0
DEC R16 ; Уменьшили
OUT OCR1BH,R17 ; И сунули их обратно
OUT OCR1BL,R16
SEI ; Конец атомарного доступа
; Теперь надо обнулить счетчик, иначе за эту же итерацию главного цикла