Собираю устройство, которое на основании измеренного напряжения своим АЦП на одном из своих портов выдает импульсы широтой, зависящей от измеренного напряжения. Пока результат такой. Зеленым цветом - сигнал на выходе, красным - этот же сигнал после фильтра, в иделе он должен быть прямой.

Пока что интересует то, как убрать паузы в выдаче сигнала, чтобы он шел не пакетами, а непрерывно?
Код:

Пока что интересует то, как убрать паузы в выдаче сигнала, чтобы он шел не пакетами, а непрерывно?
Код:
Код: Выделить всё
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40
int s = 1; // переменная для хранения секунд
int o = 1;
int n=0;
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // Обработка прерывания по совпадению
{
s++; // увеличиваем переменную каждую секунду
o++;
if(o>n)
{
PORTB.0=1;
}
if(o>20)
{
PORTB.0=0;
o=0;
}
TCNT1=0; //обнуляем таймер
}
void main(void)
{
int adc; //переменная для записи значений АЦП
int v; //переменная для сохранения значения реального напряжения в миливольтах
TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x08; //записываем число в регистр сравнения
TIMSK=0x10; //запускаем таймер
#asm("sei")
PORTB=0x00;
DDRB=0x01;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x81;
while (1)
{
adc=read_adc(0); // читаем ацп с порта 0
v=adc*5; // ток разряда
if (v<350) // ток разряда 350 мА
{
n=n+1;
}
if (v>350)
{
n=n-1;
}
};
}
