Страница 1 из 1

задержка ацп и шпротеус

Добавлено: Вт сен 30, 2014 19:52:35
virus33
есть участок кода прерывания по таймеру 0:

Код: Выделить всё

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;					//сброс флага
	}

}
Что здесь происходит. Берем канал ацп, снимаем значение, пихаем в переменную и шлем байт в uart.
В даташите черным по белому написано, что задержка зарядки конденсатора ацп при переключении каналов(следующего преобразования) должна составить не менее 20мкс.
мне без разницы, устанавливать задержку по таймеру или тормозить проц пустым циклом, поэтому проще второе.
Но протеус упорно начал говорить что "у вас не выдержано время ожидания заряда". ну или как то так.


уже засунул пустой цикл, который дает задержку почти аж в 45 миллисекунд.

Код: Выделить всё

delay = 0;
while (delay < 15000)
{
delay = delay + 1;
}
но шпротеус продолжает гласить...

Мож я чего то не понял, обьясните пожалуйста?
заранее благодарен.

Re: задержка ацп и шпротеус

Добавлено: Вт сен 30, 2014 20:49:51
Enigm
В самом протеусе покрутите настройки микроконтроллера, а так да есть такое и многие считают это багом протеуса.

Re: задержка ацп и шпротеус

Добавлено: Вт сен 30, 2014 22:36:21
urry
ну как бы логично предположить, что задержку нужно устанавливать после переключения канала ацп...