Все просто!
Пример:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
;FastPWM Init на прерываниях
; ШИМ будет на выводах 3 и 6 порта D
SETB DDRD,3,R16 ; DDRD.3 = 1 Порты на выход
SETB DDRD,6,R16 ; DDRD.6 = 1
; Выставляем для обоих каналов ШИМ режим вывода ОС** выключеным.
; COM1A = 00 и COM1B = 00
; Также ставим режим FAST PWM 8bit (таймер 16ти разрядный и допускает
; большую разрядность ШИМ сигнала. Вплоть до 10 бит. WGM = 0101
; Осталось только запустить таймер на частоте МК CS = 001
OUTI TCCR1A,0<<COM1A0|0<<COM1B0|0<<WGM11|1<<WGM10
OUTI TCCR1B,0<<WGM13|1<<WGM12|1<<CS10
SETB TIMSK,OCIE1A,R16 ; Включаем прерывание по сравнению А
SETB TIMSK,OCIE1B,R16 ; Включаем прерывание по сравнению Б
SETB TIMSK,TOIE1,R16 ; Включаем прерывание по переполнению Т1
; Причем в режиме WGM=1010
переполнение
; будет на FF т.е. таймер работает
как
; 8ми разрядный.
Осталось только прописать обработчики и вектора:
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
.CSEG
.ORG $000 ; (RESET)
RJMP Reset
.ORG $002
RETI ; (INT0) External Interrupt Request 0
.ORG $004
RETI ; (INT1) External Interrupt Request 1
.ORG $006
RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG $008
RETI ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG $00A
RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Event
.ORG $00C
RJMP Timer1_OCA ; (TIMER1 COMPA) Timer/Counter1
Compare Match A
.ORG $00E
RJMP Timer1_OCB ; (TIMER1 COMPB) Timer/Counter1
Compare Match B
.ORG $010
RJMP Timer1_OVF ; (TIMER1 OVF) Timer/Counter1
Overflow
.ORG $012
RJMP Timer0_OV ; (TIMER0 OVF) Timer/Counter0 Overflow
.ORG $014
RETI ; (SPI,STC) Serial Transfer Complete
.ORG $016
RETI ; (USART,RXC) USART, Rx Complete
.ORG $018
RETI ; (USART,UDRE) USART Data Register Empty
.ORG $01A