Использую два прерывания , одно по переполнению , другое по совпадению.
В прерывании по переполнению задаю высокий уровень на нужных выходах, а в прерывании по совпадению обнуляю.
Меняя число по совпадению изменяется скважность сигнала на выходе.
Но есть одна большая проблема , при уменьшении скважности менее 10-15% (то есть переменник в ноль) сигнал на выходе начинает выдавать импульсы со скважностью менее 10-15% но в то же время и импульсы с 80-90% скважностью. На осциллографе это выглядит так
http://uploads.ru/ZyFg9.jpg
Вот предел ниже которого это происходит
http://uploads.ru/viRLY.jpg
А вот максимум когда переменник на +
http://uploads.ru/6ZX8p.jpg
А вот код
Спойлер
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x60
char ADC;
int read=0;
char PW0=0;
char PW1=0;
char PW2=0;
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
PORTD|=(PW0<<3)|(PW1<<4)|(PW2<<5);
read++;
}
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTD&=0xFF&((0<<3)|(0<<4)|(0<<5));
}
void main(void)
{
PORTB=0x00;
DDRB=0x07;
PORTC=0x30;
DDRC=0x00;
PORTD=0xC0;
DDRD=0x38;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x01;
TCNT2=0x00;
OCR2=0x80;
MCUCR=0x00;
TIMSK=0xC0;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
while (1)
{
PW0=(~PIND.6)&PIND.7;
PORTB.0=PIND.6&(~PIND.7);
PW1=PINC.4&(~PIND.7);
PORTB.1=(~PINC.4)&PIND.7;
PW2=(~PINC.4)&PIND.6;
PORTB.2=PINC.4&(~PIND.6);
if(read==0){
ADMUX=0x00 | (ADC_VREF_TYPE & 0xff);} //первый
if(read==3121){
ADCSRA|=0x40;} //через время 2
if(read==3125){
ADC=ADCH;//(ADCH>>1);
OCR2=ADC;
read=0;}
}
}


