Вот пример реализации ЧИМ + ШИМ на Tiny13 (OCR0A - регулирует частоту, OCR0B - ширину импульса):
Код
.include <tn13def.inc>
.def AL = R24
.def AH = R25
.equ Period = 100;
.equ SwitchPoint = 20;
;--------------------------------------------------
; Макрос настройки таймера T0 на работу в режиме ОС
; с длительностью периода = Period, и скважностью шириной импульса определяемой SwitchPoint
.macro INIT_TIMER0
ldi AL, (Period); Длительность периода
out OCR0A, AL
ldi AL, (SwitchPoint); Скважность
out OCR0B, AL
ldi AL, (1 << WGM01); Режим CTC по достижению OCR0A
out TCCR0A, AL
ldi AL, 1
out TCCR0B, AL; Режим подсчета тактов (Prescaler = 1)
ldi AL, (1 << OCIE0A)|(1 << OCIE0B); Разрешить оба прерывания по достижению OCR0A и OCR0B
out TIMSK0, AL
.endmacro
;---------------------------------------------------
.cseg
;===================================================
; ENTRY POINT
;===================================================
.org 0
rjmp Start
reti; IRQ0 Handler
reti; PCINT0 Handler
reti; Timer0 Overflow Handler
reti; EEPROM Ready Handler
reti; Analog Comparator Handler
rjmp TIM0_COMPA; Timer0 CompareA Handler
rjmp TIM0_COMPB; Timer0 CompareB Handler
reti; Watchdog Interrupt Handler
reti; ADC Conversion Handler
START: //
ldi AL,low(RAMEND); Main program start
out SPL, AL
ldi AL, $FF
out DDRB, AL
INIT_TIMER0; Инициализация таймера
sei
;****************************************************
; Основной цикл программы
;****************************************************
MainCycle:
rjmp MainCycle
;****************************************************
; Обработчик прерывания TMR0 (Timer 0 OC)
;****************************************************
TIM0_COMPA:; Timer0 Compare A Handler
cbi PortB, 0
reti
;****************************************************
; Обработчик прерывания TMR0 (Timer 0 OC)
;****************************************************
TIM0_COMPB:; Timer0 Compare B Handler
sbi PortB, 0
reti
Удачи
Цитата
В Мегах такой фишки не нахожу.
В мегах то же самое только на таймере 1. Поле для конструирования частот и ширины куда больше т.к. таймер 16-бит. если не нужно использовать все 16 разрядов, то можно производить запись соответственно только в младшую часть регистров OCR1AL, OCR1BL..