Antes que nada, muchas gracias a Nocturno por este impresionante trabajo que realizo.
Ahora el pedido de ayuda
Necesito encender un led mientras se apoya un dedo sobre el pad tactil de un pic12f1840, intente con las funciones mtouch de ccs y no sirven por que solamente detentan el cambio de No-Pulsado a Pulsado y si sigues teniendo el dedo apoyado o no le da lo mismo.
Adjunto el codigo fuente modificado por si Nocturno o alguien mas me uede dar una mano.
Archivo: test.h
#FUSES INTRC_IO //Oscilador interno
//#FUSES VCAP_A0 //VCAP en pin A0
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPROTECT //Código accesible
//#FUSES PLLEN //PLL activado
#FUSES NOMCLR //Master Clear activado
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPUT //No Power Up Timer
#use delay (clock=8000000)
// No dejamos que el compilador establezca los TRIS
#use fast_io(A)
// Registros del micro
#byte ANSELA = 0x18C
#byte PORTA = 0x00C
#byte TRISA = 0x08C
#byte T1CON = 0x018
#byte T1GCON = 0x019
#byte CPSCON0 = 0x01E
#byte CPSCON1 = 0x01F
// Bits de configuración
#bit TMR1GIF = 0x011.7 // clear gate intpt flag
#bit TMR1GIE = 0x091.7 // enable gate intpt
#bit TMR1ON = 0x018.0
// Salidas de leds
#define LED PIN_A1
Archivo: test.c
/*
mTouch con 12F1840
Modificacion de del codigo de Manuel Jiménez - Nocturno 2009
www.micropic.es
*/
#include <12F1840.H> //16LF727.h>
#include <test.h>
#define ANTIRREBOTES 1
#define SENSIBILIDAD 5
// unsigned char indice;
unsigned long lectura; // lectura de cada sensor
unsigned long promedio; // promedio leído de cada sensor
unsigned long umbral; // umbral que debe superar para que se considere pulsado
unsigned long promedio_alto; // variable temporal de promedio alto
unsigned long promedio_bajo; // variable temporal de promedio bajo
// Estructura de información de los sensores
unsigned char rebotes;
int1 Pulsado;
int1 SePulso;
int1 Soltado;
/***********************************************************************************************
INICIALIZACIÓN
***********************************************************************************************/
void inicializacion() {
promedio = 0;
lectura = 0;
/* Utilizaremos este sensor:
CPS2: RA2
*/
ANSELA = 0b00000100; //SELECCIONAMOS COMO ENTRADA ANALOGICA RA2
set_tris_a (0b00001100); // SELECCIONAMOS COMO ENTRADAS RA2 Y RA3
//setup_timer_2(T2_DIV_BY_16,0xB4,15);// Timer2 activo, prescaler 1:16 REVISAR Y T1GCON
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
setup_timer_1(T1_GATE_INVERTED); // Timer1 activo, asociado al sensor capacitivo y sin prescaler
T1GCON = 0b11100001; // Timer1 gate activo, y asociado al Timer0 ya no al 2
CPSCON0 = 0b11001100; // Activamos los sensores capacitivos
CPSCON1 = 0x02; // y ahora usamos CPS2 que es RA2
TMR1GIF = 0; // Borramos el flag de interrupción
TMR1GIE = 1; // Activamos la interrupción del Timer1 Gate
enable_interrupts(GLOBAL); // Activamos la gestión de interrupciones
output_HIGH(LED); // Apagamos los leds
}
/***********************************************************************************************
RUTINA DE INTERRUPCIÓN
***********************************************************************************************/
#INT_DEFAULT
void GestionDeInterrupciones() {
if (TMR1GIF && TMR1GIE) { // Interrupción del Timer1 Gate
TMR1GIF = 0; // Borramos el flag de interrupción
TMR1ON = 0; // Paramos el timer1
// Cálculo de la media móvil de los últimos 4 ciclos
lectura = promedio_alto = get_timer1() * 4;
promedio_bajo = promedio / 4;
umbral = promedio>>SENSIBILIDAD;
// Si ha pulsado, veremos que el Timer se ha acortado, por debajo del promedio - umbral
if (promedio_alto < promedio - umbral) {
// Chequeo repetitivo para evitar rebotes
if(rebotes < ANTIRREBOTES) rebotes++;
if(!SePulso && rebotes == ANTIRREBOTES) {
Pulsado = 1;
SePulso = 1;
}
} else {
// Si no ha pulsado y estamos en ciclo de rebotes
if(rebotes > 0) rebotes--;
if(SePulso && rebotes == 0) {
SePulso = 0;
Soltado = 1;
}
// Al promedio acumulado le restamos el valor antiguo y le metemos el nuevo
promedio += promedio_alto/4 - promedio_bajo;
}
set_timer1(0); // Iniciamos la cuenta en el Timer1
TMR1ON = 1; // Activamos nuevamente el Timer1
}
}
/***********************************************************************************************
PROGRAMA PRINCIPAL
***********************************************************************************************/
void main() {
inicializacion();
output_low(LED); //enciendo y apago al principio para verificar el led
delay_ms(3000);
output_high(LED);
while (true) { // bucle infinito
delay_ms(1000); // incluyo un led testigo de que no se ha colgado
output_toggle(PIN_A4); // solo para probar
if(Pulsado) { // se ha detectado pulsación
output_LOW(LED);
Pulsado = 0; // trabajo realizado, borramos el indicador
} else if(Soltado) { // se ha quitado el dedo
output_HIGH(LED);
Soltado = 0; // trabajo realizado, borramos el indicador
}
}
}
desde ya muchas gracias.