Добрый вечер. Реализую устройство, интерфейс в котором один сенсорный датчик. Алгоритм таков: если нагрузки нет и мы держим "кнопку", то спустя ~секунду включается нагрузка, если нагрузка включена и мы держим больше 1 секунды, то нагрузка отключается. Вот набросал код
Раздел: AVR
, нажатия определяет, а вот длинные нажатия вообще нет. В чем может быть проблема? уже час смотрю и не понимаю(
#include <avr/io.h>
#include <avr/interrupt.h>
#define LOAD PD0
#define PORT_LOAD PORTD
#define SENSOR PC4
#define SENSOR_PIN (PINC&0x10)
#define SENSOR_DDR DDRC
unsigned char count, SensorL, SensorH, flag = 0;// 0 - выключенно, 1 - включенно
volatile unsigned char time; // Переменная подсчета времени касания
const unsigned char long_time = 93, short_time = 31; // Константы хранящие время срабатывания (3c, 1c)
unsigned char Check() // Проверка сенсоров
{
count = 0;
SENSOR_DDR &= ~(1<<SENSOR);
while(SENSOR_PIN==0)
count++;
SENSOR_DDR |= 1<<SENSOR;
if (count > SensorH) return 1;
else if (count < SensorL) return 0;
}
void Calibrate() // Настройка сенсоров
{
count = 0;
SENSOR_DDR &= ~(1<<SENSOR);
while(SENSOR_PIN==0)
count++;
SENSOR_DDR |= 1<<SENSOR;
SensorL = count + 10;
SensorH = count + 35;
}
void Load(unsigned char on_off)
{
if(on_off) PORT_LOAD |= 1<<LOAD;
else PORT_LOAD &= ~(1<<LOAD);
}
void func()
{
time = 0;
if(Check())
{
if (!(flag))
{
while(Check())
if(time >= short_time)
{
Load(1);
flag = 1;
time = 0;
}
}
else
{
while(Check());
if (time < long_time && time > short_time)
{
Load(0);
time = 0;
flag = 0;
}
}
}
}
void Init() // Инициализация, переферии, таймеров и тд
{
SENSOR_DDR = 1<<SENSOR;
TCCR0 |= (1<<CS02) | (0<<CS01) | (1<<CS00); // педделитель таймера 0 на 1024
sei();
}
ISR(TIMER0_OVF_vect) // Прерывание, по которому происходит опрос клавиатуры
{
Check();
time++;
}
int main(void)
{
Init();
Calibrate();
while(1)
{
func();
}
}
Раздел: AVR