Доброго времени суток. Имею несколько наработок с сенсорами на PIC16F1825.
Начал с микрочиповкого аппнота и заметил несколько граблей.
Вот рабочий кусок кода
Код:
|
#define sensors 3 // Сенсоров 3
unsigned char Buttons;//Нажатые кнопки
unsigned char CopyButtons;//
unsigned int average[sensors];//среднеарифметическое для каждого сенсора
unsigned char trip[sensors];//Значение сработки сенсора
unsigned char gusterezis[sensors];//Значение отпускания сенсора
unsigned int raw[sensors];//Текущее измерение
unsigned char Index;//Шагаем по сенсорам
bit fStartCalibSens;//Если =1 то делаем непрерывное усреднение
static void interrupt isr(void)
{
if (TMR1GIE && TMR1GIF)
{
TMR1GIF = 0;
TMR0 = 0;
raw[Index] = TMR1L;//Считаем измеренное значение
raw[Index] +=((unsigned int)TMR1H ‹‹ 8);
if(!fStartCalibSens){//Если только включился контроллер
if(raw[Index] ‹ average[Index]){
if (raw[Index] ‹ (average[Index] - (unsigned int)trip[Index]) ) {// – trip
Buttons |= (1‹‹Index);
} else if (raw[Index] › (average[Index] - (unsigned int)trip[Index] + (unsigned int)gusterezis[Index])){// – trip
Buttons &= ~(1‹‹Index);
}
}
else {
Buttons &= ~(1‹‹Index);
}
if(CopyButtons != Buttons){
CopyButtons = Buttons;
}
}
//Если только включился контроллер то производить автокалибровку путём усреднения
if(fStartCalibSens)average[Index] = average[Index] + ((long)raw[Index]-(long)average[Index])/16;
//Здесь усреднение производить раз в минуту в течении одной секунды(убираем температурный дрейф)
else if (!(Buttons & (1‹‹Index)) && Del_1Min == 0 && Del_5sec==0)
average[Index] = average[Index] + ((long)raw[Index]-(long)average[Index])/16;
if(++Index › sensors-1)Index = 0;
CPSCON1 = Index+5;
TMR1ON = 0;
TMR1L = 0x00;
TMR1H = 0x00;
TMR1ON = 1;
}
if (T0IE && T0IF)
{
T0IF = 0;
}
}
void main(void){
trip[0] = 120;
trip[1] = 140;
trip[2] = 160;
gusterezis[0] = 24;
gusterezis[1] = 24;
gusterezis[2] = 24;
Index = 0;
TRISA = ~0x35;
TRISC = ~0x20;
ANSELA = 0x00; //CPS3 initialized as analog inputs
ANSELC = 0x0E;
CPSCON0 = 0b10001100; // Cap sense on, high range oscillator,//0x8C
//CPSCON1 = 0x03; //Cap sense channel input 3 is selected
OPTION_REG = 0x47; // fosc/4, hi-lo edge transition, 1:16 prescaler
WPUC = 0xE0;
TMR0IF = 0; // clear TMR0 interrupt flag
TMR0IE = 1; // enable TMR0 interrupt
T1CON = 0xC5; // Timer1 initialization
T1GCON = 0xE1; // Timer1 gate init /Toggle Mode/TMR0 time base
TMR1GIF = 0; // Clear Gate Interrupt Flag
TMR1GIE = 1; // Enable Gate Interrupt
fStartCalibSens = 1;
__delay_ms(100);
average[0] = raw[0]-50;
average[1] = raw[1]-50;
average[2] = raw[2]-50;
} |
А вот тут сей код эзается.
Если кому поможет то буду рад.