Код: Выделить всё
void interrupt pwm_int(void) // общая процедура прерывания
{
if (T0IF == 1)
{
TMR0 = 60; //10 мсек на тик
T0IE = 0; //Отключаем таймер
T0IF = 0; //Сбрасываем флаг
OneByte = 0b11010000;
// обрабатываем значение оси Z, канал ацп RA1
ADCON0 = 0b00000001;
ADGO = 1;
while (ADGO == 1)
{
asm("NOP");
}
z = ADRESH; //Значения из АЦП отправляем в переменную Z
temp = 1;
delay = 0;
while (delay < 15000)
{
delay = delay + 1;
}
temp = 0;
// обрабатываем значение оси X, канал ацп RA2
ADCON0 = 0b00001001;
ADGO = 1;
while (ADGO == 1)
{
asm("NOP");
}
x = ADRESH; //Значения из АЦП отправляем в переменную X
if (x < 130) //Устанавливаем ноль на центре манипулятора Х(+/- 2 значения погрешности)
{
if (x > 126)
{
OneByte &= 0b11011100;
forward = 0;
backward = 0;
}
}
if (x > 130 )
{
OneByte |= 0b11010011;
forward = 1;
backward = 0;
}
if (x < 126 )
{
OneByte |= 0b11010010;
backward = 1;
forward = 0;
}
delay = 0;
while (delay < 15000)
{
delay = delay + 1;
}
// обрабатываем значение оси Y, канал ацп RA3
ADCON0 = 0b00011001;
ADGO = 1;
while (ADGO == 1)
{
asm("NOP");
}
y = ADRESH; //Значения из АЦП отправляем в переменную Y
if (y < 130) //Устанавливаем ноль на центре манипулятора Y(+/- 2 значения погрешности)
{
if (y > 126)
{
OneByte &= 0b11010011;
right = 0;
left = 0;
}
}
if (y > 130 )
{
OneByte |= 0b11011000;
right = 1;
left = 0;
}
if (y < 126 )
{
OneByte |= 0b11011100;
left = 1;
right = 0;
}
delay = 0;
while (delay < 15000)
{
delay = delay + 1;
}
send_Usart(OneByte); //Первый байт
send_Usart(z); //Второй байт
////////////////////////////////////////////////////////////////////////////
CCPR1L = z;
T0IE = 1; //Включаем таймер
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
if (TMR2IF == 1) //таймер 2
{
TMR2IF = 0; //сброс флага
}
}В даташите черным по белому написано, что задержка зарядки конденсатора ацп при переключении каналов(следующего преобразования) должна составить не менее 20мкс.
мне без разницы, устанавливать задержку по таймеру или тормозить проц пустым циклом, поэтому проще второе.
Но протеус упорно начал говорить что "у вас не выдержано время ожидания заряда". ну или как то так.
уже засунул пустой цикл, который дает задержку почти аж в 45 миллисекунд.
Код: Выделить всё
delay = 0;
while (delay < 15000)
{
delay = delay + 1;
}Мож я чего то не понял, обьясните пожалуйста?
заранее благодарен.
