Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Entre los ltimos PICs que Microchip ha sacado al mercado destaca la incorporacin del
mdulo de sensado capacitivo mTouch que incluye todo el hardware necesario para realizar
un teclado capacitivo con slo pintar las pistas correspondientes a los botones.
Este es el aspecto del PCB del prototipo, con los componentes en una cara y los pads en la
otra, por ltimo un conector soldado directamente al micro para depurar con REAL ICE.
El cdigo est para compilarlo con CCS, que viene gratis en el MPLAB.
//************************************************************************
****//
// Nombre: tecladocap.c
// Autor: Flix Sasin
// Fecha: enero 2009
// Proposito: mostrar el uso del modulo de sensado capacitivo
// este programa escanea el estado de las 16 entradas del pic 16LF727
// con un intervalo fijo. Se hace una media de la frecuencia del teclado en reposo
// y cuando se toca un PAD la frecuencia cambia por la capacitancia del dedo.
// Cuando se pulsa una tecla se enciende un led y se enva la tecla pulsada por
// el puerto serie. El sistema se queda a la espera de que se suelte la tecla.
//
// Es muy sencillo modificar este programa para poder detectar varias teclas
// pulsadas de forma simultanea.
//
//************************************************************************
****//
#include <16LF727.h>
#include
#FUSES HS
//Cristal de 8 Mhz
#FUSES NOWDT
#FUSES NOPROTECT
#FUSES PLLEN
//Cdigo abierto
//Habilita PLL
#FUSES NODEBUG
#FUSES NOMCLR
//No Debug
//NO Master Clear pin
#FUSES NOBROWNOUT
#FUSES NOPUT
DEFINICIONES
//************************************************************************
****//
int16
timer1_val[NUMSENSORES];
int16
timer1_raw[NUMSENSORES];
int16
media_boton[NUMSENSORES];
int16
trip_val[NUMSENSORES];
char pasadas_estabilizacion;
char pasadas_media;
char num_sensor;
char tecla;
//************************************************************************
****//
//*
PROTOTIPOS
//************************************************************************
****//
void init(void);
void timers_isr(void);
void reset_timer1(void);
void selecciona_siguiente_sensor(void);
//************************************************************************
****//
//*
FUNCION DE INICIALIZACION
//************************************************************************
****//
void init()
{
char x;
setup_adc_ports( ALL_ANALOG );
OSCCON = 030;
= 0;
TMR1GIE
= 1;
PEIE
= 1;
GIE
= 1;
// APAGA EL LED
output_low(LED);
}
//************************************************************************
****//
// ISR() RUTINA DE INTERRUPCION
//************************************************************************
****//
#INT_DEFAULT
// Interrupciones
void timers_isr()
{
if (T0IF==1)
// Timer0
{
T0IF = 0;
}
if(TMR1GIF==1)
// Timer1 gate
{
TMR1GIF = 0;
TMR1ON = 0;
// TIMER1 off
timer1_val[num_sensor] = make16(TMR1H,TMR1L);
timer1_raw[num_sensor] = timer1_val[num_sensor] * 16;
//estabilizar el valor de media_boton
if(pasadas_estabilizacion > 000)
{
pasadas_estabilizacion;
media_boton[num_sensor] = timer1_raw[num_sensor];
if((pasadas_estabilizacion == 0) && (num_sensor < (NUMSENSORES - 1)))
{
pasadas_estabilizacion = PASES_ESTABILIZACION;
selecciona_siguiente_sensor();
}
}
else
{
//buscar botones pulsados
if(timer1_raw[num_sensor] < (media_boton[num_sensor] - trip_val[num_sensor]))
{
tecla=num_sensor+1;
}
else if(timer1_raw[num_sensor] > (media_boton[num_sensor] - trip_val[num_sensor])+
VALOR_HISTERESIS)
{
tecla=0;
//************************************************************************
****//
void reset_timer1()
{
TMR1L
= 0;
TMR1H
= 0;
TMR1ON = 1;
}
//************************************************************************
****//
//*
//************************************************************************
****//
void selecciona_siguiente_sensor()
{
num_sensor++;
if(num_sensor >= NUMSENSORES)
{
num_sensor = 0;
}
CPSCON1 = num_sensor;
}
//************************************************************************
****//
//*
BUCLE PRINCIPAL
//************************************************************************
****//
void main(void)
{
char tecla1;
Init();
num_sensor = 0;
while(true)
{
GIE
= 0;
tecla1=tecla;
GIE
= 1;
= 0;
tecla1=tecla;
GIE
= 1;
delay_ms(50);
}
output_low(LED); //apagar el led
}
}
//****************************************************************************
//
// nombre: tecladocap.h
// Autor: Flix Sasin
// Fecha: enero 2009
// Proposito: mostrar el uso del modulo de sensado capacitivo
//****************************************************************************
//
//*********************definiciones del registro ************************
#byte OSCCON = 090
#byte OPTION = 081
#byte T1CON = 010
#byte T1GCON = 08f
#byte CPSCON0 = 0108
DEFINICIONES
//************************************************************************
****//
#define
NUMSENSORES
16
#define
PASES_MEDIA
#define
PASES_ESTABILIZACION
#define
VALOR_HISTERESIS
#define
UMBRAL
3
50
30
220
//************************************************************************
****//
//*
DEFINICIONES DE I/O
//************************************************************************
****//
#define LED
Espero que sea til
PIN_C1