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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Аватара пользователя
virus33
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

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

Сообщение 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;
}
но шпротеус продолжает гласить...

Мож я чего то не понял, обьясните пожалуйста?
заранее благодарен.
Реклама
Аватара пользователя
Enigm
Говорящий с текстолитом
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

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

Сообщение Enigm »

В самом протеусе покрутите настройки микроконтроллера, а так да есть такое и многие считают это багом протеуса.
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

ну как бы логично предположить, что задержку нужно устанавливать после переключения канала ацп...
Ответить

Вернуться в «PIC»