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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 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;
}
но шпротеус продолжает гласить...

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

Сообщение Enigm »

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

Сообщение urry »

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

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