marți, 8 noiembrie 2011

Capacitive Touch with PIC12F675. Part 1.

Cum spuneam intr-un post anterior dupa ce am ramas fara senzori capacitivi , m-am suparat si m-am apucat sa mii fac singur. Pornind de la ce aveam pe acasa(in speta PIC12F675) am cautat teoria pentru a implementa.
Asa ca am dat peste aceasta pagina . Acolo e prezentata un model pentru implementarea unui senzor capacitiv. Ce am facut eu nu e identic, doar folosesc ideile de acolo.
Metoda e simpla: un pin al unui port care este setata ca iesire este legat prin doua rezistente la alti doi pini  setati ca intrare. Acest pin de incarcare este dus in 1, se pastreaza valoarea portului care contini pini setati ca intrare intr-o variabila, se duce in 0 portul de incarcare. Daca unul din pad-uri este atins acesta isi pastreaza valoarea de 1 desi portul de incarcare a fost trecut in 0.
Deci , cum spuneam, e foarte simplu. Ce nu imi place este a trebuie efectiv sa fie atins pad-ul, deci un contact fizic(nu am patiti inca niciodata nimic, dar imi este frica de sarcini electrostatice, de fire "calde", etc).


Dupa cum vedeti schema are putine piese si este usor de realizat. Mai jos codul.
Pro: usor de realizat , nu necesita reglaje.
Con: trebuie touch efectiv, adica trebuie efectiv atins pad-ul.


/************************************************************************
*                                                                       *
*   Processor:     12F675                                               *
*                                                                       *
*************************************************************************
*                                                                       *
*   Pin assignments:                                                    *
*       GP4 - indicator LED - Iesire                                   *
*       GP5 - indicator LED sau RS232 - Iesire                          *
*       GP2 - Legat la GP0,1 cu rol de incarcare a capacitati         *
* GP0,1 - Touch PAD                                             *
************************************************************************/
#include <pic.h>
#include <legacy\pic12rf675.h>
#include <stdlib.h>


#define _XTAL_FREQ  4000000     // oscillator frequency for _delay()


#define LED1 GPIO4
#define LED2 GPIO5
#define L_UP GPIO2


/***** CONFIGURATION *****/
// config 4mhz int clock & power-up timer enable & ext reset off & no code protect & no brownout detect 
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS);


//////////////////////////////////////////////////////////////////////
void init_ports(void) {
CMCON = 0x07; //Turn off analog comparator
ANSEL = 0;                  // Turn off ADC
TRISIO = 0b00000011; //Set GP0 si GP1 input  restul output
INTCON = 0; //Disable interrupt
GPIO  = 0; //Turn off all pins
}


void blink(void)
{
LED1 = 1;LED2 = 1;  __delay_ms(200);  LED1  = 0; LED2 = 0; __delay_ms(200);
}


/**************************************************************
                    Main Program
**************************************************************/
void main(void){


volatile union 

    unsigned char Acc2Bits; 
    struct 
    { 
        unsigned b0                  : 1;
        unsigned b1                  : 1;
        unsigned b2                  : 1;
        unsigned b3                  : 1;
        unsigned b4                  : 1;
        unsigned b5                  : 1;
        unsigned b6                  : 1;
        unsigned b7                  : 1;
    }; 
} sGPIO;




init_ports();
blink();


while(1){ //looping


do 
{
L_UP = 1; //il fac high deci impliciti 0,1,2 au 1 la intrare
sGPIO.Acc2Bits = GPIO;
L_UP = 0;


if(sGPIO.b0 == 1) {GPIO &=~(1 << 5 ); } else { GPIO |= (1 << 5 ); };
if(sGPIO.b1 == 1) {GPIO &=~(1 << 4 ); } else { GPIO |= (1 << 4 ); };


__delay_us(200);
} while(1);



} //loping


} //main

Am folosit in cod un union deoarece vreau sa incerc si pe un microcontroler cu mai multi pini(fizici) ca sa pot face 4-5 contacte capacitive dintr-un singur microcontroler. Si am zis eu ca asa imi va fi mai usor.
Am si inceput sa fac proiectul fizic cu un PIC16F628A. Dar timpul .......

O sa incerc sa fac si un film, sa vad unde il pun, pentru a vizualiza functionarea lui in practica.

Niciun comentariu:

Trimiteți un comentariu