Показать сообщение отдельно
Старый 07.12.2009, 00:34   #8
Urvin
Старший Пользователь
 
Аватар для Urvin
 
Регистрация: 13.11.2008
Возраст: 36
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2000\Basin\2111
Сообщений: 250
Urvin will become famous soon enough
По умолчанию



Программку вот эту подергать надо (hi-tech C):
Код:
//------------------------------------------------------------------------//
#include <htc.h>
//------------------------------------------------------------------------//



//------------------------------------------------------------------------//
// БИТЫ КОНФИГУРАЦИИ
//------------------------------------------------------------------------//
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLREN & BORDIS & UNPROTECT & UNPROTECT & RCCLK);
//------------------------------------------------------------------------//
// Oscillator               = Internal RC no Clockout
// Watchdog Timer           = Off
// Power Up Timer           = Off
// Master Clear Enable      = External
// Brown Out Detect         = Off
// Code Protect             = Off
// Data EE Read Protect     = Off
// Bandgap Calibration Bits = Highest Bandgap Voltage
//------------------------------------------------------------------------//



//------------------------------------------------------------------------//
// ВРЕМЕННЫЕ ЗАДЕЖКИ ЗМЕНЕНИЯ СОСТОЯНИЙ
//------------------------------------------------------------------------//
#define TIMER_COUNTS_BEFORE_SWITCH_ON 30
#define TIMER_COUNTS_BEFORE_SWITCH_OFF 150
//------------------------------------------------------------------------//



//------------------------------------------------------------------------//
volatile unsigned char state = 0;			// Переменная номера состояния
volatile unsigned char timerCounts = 0;     // Счетчик таймера
//------------------------------------------------------------------------//



//------------------------------------------------------------------------//
// ФУНКЦИЯ ПРЕРЫВАНИЙ
//------------------------------------------------------------------------//
void interrupt my_isr(void){
	// Прерывание от таймера
	if((T0IE)&&(T0IF))
	{
		T0IF=0;	// clear event flag
		
		// Инкрементация счетчика таймера
		timerCounts++;
		
		// Если состояние "реле включено, камера выключена"
		if (state == 1)
		{
			// Если срок включения вышел, переодим в стабильное состояние
			if (timerCounts >= TIMER_COUNTS_BEFORE_SWITCH_ON) state = 2;
		}
		
		// Если состояние "реле выключено, камера включена"
		else if (state == 3)
		{
			// Если срок выключения вышел, переодим в стабильное состояние
			if (timerCounts >= TIMER_COUNTS_BEFORE_SWITCH_OFF) state = 0;
		}

	}
	
}
//------------------------------------------------------------------------//



//------------------------------------------------------------------------//
// ИНИЦИАЛИЗАЦИЯ ОБОРУДОВАНИЯ
//------------------------------------------------------------------------//
void init(void){
	// Включение прерывания таймера
	INTCON	= 0b00100000;
	
	// Ножка 1 на вход, прочие на выход
	TRISIO	= 0b00000010;
	
	// Делитель 128, внутренний генератор сигнала
	OPTION	= 0b00000110;
	
	// Обнуление таймера
	TMR0 = 0;
	
	// Непосредственное включение прерываний
	ei();
	
}
//------------------------------------------------------------------------//



//------------------------------------------------------------------------//
// ГЛАВНАЯ ФУНКЦИЯ
//------------------------------------------------------------------------//
void main(void)
{	
	init();			// Первичная инициализация

	
	while (1)		// Бесконечный главный цикл
	{
		// Если состояние "все выключено"
		if (state == 0)
		{
			GPIO0 = 1;			// Отключаем камеру
			
			if (GPIO1 == 0)		// Если включилось оптореле...
			{
				state = 1;		// переходим в следующее состояние
				timerCounts=0;  // и обнуляем счетчик таймера
			}
		}
		else if (state == 1)
		{
			if (GPIO1 == 1) state=0;
		}
		
		// Если состояние "все включено"
		else if (state == 2)
		{
			GPIO0 = 0;			// Включаем камеру
			
			if (GPIO1 == 1)		// Если оптореле выключилось...
			{
				state = 3;		// переходим в состояние пятисекундной задержки
				timerCounts=0;	// обнуляем счетчик таймера
			}
		}
		else if (state == 3)
		{
			if (GPIO1 == 0) state=2;
		}
		
	}	// Конец главного цикла
}
//------------------------------------------------------------------------//
__________________
Устройства для CarPC: torpedo Control, torpedo Modest
Urvin вне форума   Ответить с цитированием