Программку вот эту подергать надо (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;
}
} // Конец главного цикла
}
//------------------------------------------------------------------------//