PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các dự án mã nguồn mở (http://www.picvietnam.com/forum/forumdisplay.php?f=73)
-   -   MTouch PCB (http://www.picvietnam.com/forum/showthread.php?t=4633)

kimhuynguyen 24-07-2009 11:21 PM

MTouch PCB
 
3 Attachment(s)
Xin khai trương box này bằng một layout MTouch vẽ bằng Eagle, sử dụng 16F727.

Chỉ làm chức năng MTouch, kết nối với thiết bị khác thông qua UART.

ptt3i 25-07-2009 03:19 AM

Bạn kimhuynguyen có thể nói rõ hơn một chút chút không?
Thực sự thì ptt3i không hiểu rõ lắm về nội dung và mục đích của post của bạn lắm.

Nếu bạn cảm thấy không phiền thì có thể giải thích ý tưởng của bạn rõ rõ hơn một chút được không?

Xin cám ơn bạn rất nhiều.

phamminhtuan 25-07-2009 12:02 PM

1 Attachment(s)
Ủng hộ kimhuynguyen mình POST code viết bằng CCS C cho mạch của bạn

CODE CCS C
Code:

/*Author
    R&P Forwarding - Trading Co., Ltd.
    58/48 Nguyen Minh Hoang, Ward 12, Tan Binh District, HCMC, Viet Nam.
    http://dientu.rpc.vn
   
*/
#include<16f727.h>
#fuses    HS, NOWDT, MCLR
#use delay(clock=20Mhz)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

#byte    ANSELA = 0x185
#byte    ANSELB = 0x186
#byte    ANSELD = 0x188
#byte    ANSELE = 0x189

#byte    PORTA = 0x5
#byte    PORTB = 0x6
#byte    PORTC = 0x7
#byte    PORTD = 0x8
#byte    PORTE = 0x9

#byte    TRISA = 0x85
#byte    TRISB = 0x86
#byte    TRISC = 0x87
#byte    TRISD = 0x88
#byte    TRISE = 0x89



#byte    T2CON =  0x012                    // T2ON, prescale = 1:16
#byte    T1CON  = 0x010            // Timer1 enable, source= capacity sensing, 1:1 prescale, don't sync with sys clock
#byte    T1GCON = 0x08F            // T1GSS = Timer 2, toggle mode
#byte    PR2 =    0x092
#byte    OSCTUNE    = 0x091
#byte    OSCCON    = 0x090

#byte    CPSCON0 = 0x108                // control settings
#byte    CPSCON1 = 0x109                        // init to channel select = 0 (4 LSb's)


#bit    TMR1GIF  = 0x0C.7                        // clear gate intpt flag
#bit    TMR1GIE  = 0x8C.7                    // enable gate intpt
#bit    PEIE      = 0x8B.6                        // enable peripheral intpts
#bit    TMR2IF      = 0x0C.1
#bit    TMR2IE        = 0x8C.1
#bit    GIE        = 0x8B.7
#bit    TMR1ON        = 0x10.0

#bit    LED1_MUX    = PORTA.0
#bit    LED2_MUX    = PORTA.1
#bit    LED3_MUX    = PORTA.2
#bit    LED4_MUX    = PORTA.3
#bit    LED5_MUX    = PORTB.6
#bit    LED6_MUX    = PORTB.7
#bit    LED7_MUX    = PORTC.0
#bit    LED8_MUX    = PORTE.2

#bit    TRIS_LED1    = TRISA.0
#bit    TRIS_LED2    = TRISA.1
#bit    TRIS_LED3    = TRISA.2
#bit    TRIS_LED4    = TRISA.3
#bit    TRIS_LED5    = TRISB.6
#bit    TRIS_LED6    = TRISB.7
#bit    TRIS_LED7    = TRISC.0
#bit    TRIS_LED8    = TRISE.2




#define BOUNCE_TIME 2
unsigned char index;
unsigned long    reading[16];        // current reading for each button
unsigned long    average[16];        // running average for each button
unsigned long    threshold;                // threshold value is req'd # counts decrease from avg
unsigned long    bigval;                        // current button bigval  - for averaging technique
unsigned long    smallavg;                    // current button smallavg - for averaging technique


typedef struct{
    struct {
        unsigned char bounce;
    }BYTES;   
    struct {
        unsigned char isPress:1;
        unsigned char flagPress:1;
        unsigned char isRelease:1;   
        unsigned char unused:5;
    }FLAG;   
} BUTTON;

BUTTON    BTN[16];
   


void init();
void main() {
    unsigned char i;
    init();


    while(1) {   
        for(i=0; i<16; i++) {
            //button i is Pressed
            if(BTN[i].FLAG.isPress) {

               
                //Your code here when BTN[i] Pressed
               
                //Must Clear when BTN Press Processed
                BTN[i].FLAG.isPress = 0;
           
            //button i is Released
            }else if(BTN[i].FLAG.isRelease) {

                //Your code here when BTN[i] Release
               
                //Must Clear when BTN Release Processed
                BTN[i].FLAG.isRelease = 0;
            }
           
        //end for   
        }
   
    }   
}   

void init() {   
    char i;
    //setup_oscillator(OSC_8MHZ);
    for (index=0; index<16; index++){
        average[index] = 0;
        reading[index] = 0;
    }
    ANSELA = 0b00110000;
    TRISA  = 0b11111111;
   
    ANSELB = 0b00111111;
    TRISB  = 0b11111111;
   
    ANSELD = 0b11111111;
    TRISD  = 0b11111111;
    TRISC  = 0b11111111;
   
    ANSELE = 0b00000000;
    TRISE  = 0b00000000;
   
    T2CON  = 0b011110111;                    // T2ON, prescale = 1:16
    T1CON  = 0b11000101;                // Timer1 enable, source= capacity sensing, 1:1 prescale, don't sync with sys clock
    T1GCON = 0b11100010;                // T1GSS = Timer 2, toggle mode
    PR2 = 0xB4;
   
    CPSCON0 = 0b10001100;                // control settings
    CPSCON1 = 0x01;                        // init to channel select = 0 (4 LSb's)
    index = 0;
   
    TMR1GIF  = 0;                        // clear gate intpt flag
    TMR1GIE  = 1;                        // enable gate intpt
    PEIE      = 1;                        // enable peripheral intpts
    TMR2IF = 0;
    TMR2IE = 1;
    GIE = 1;

    for(i=0; i<16; i++) BTN[i] = 0;
    //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
    //enable_interrupts(INT_RTCC);
}   

#INT_DEFAULT
void global_isr() {
    if (TMR1GIF && TMR1GIE) {
        TMR1GIF = 0;                    // clear intpt flag
        TMR1ON = 0;                        // Timer1 off
       
        bigval = get_timer1();
        bigval = bigval * 4;
        reading[index] = bigval;
        smallavg = average[index] / 4;
        threshold = average[index]>>1;                                    // ratiometric threshold from avail above (& combinations)

        if (bigval < average[index] - threshold)
        {
            if(BTN[index].BYTES.bounce < BOUNCE_TIME) BTN[index].BYTES.bounce++;
            if(!BTN[index].FLAG.flagPress && BTN[index].BYTES.bounce == BOUNCE_TIME) {
                BTN[index].FLAG.isPress = 1;   
                BTN[index].FLAG.flagPress = 1;
            }   
        }
        else
        {
            if(BTN[index].BYTES.bounce > 0) BTN[index].BYTES.bounce--;
            if(BTN[index].FLAG.flagPress && BTN[index].BYTES.bounce == 0) {
                BTN[index].FLAG.flagPress = 0;
                BTN[index].FLAG.isRelease = 1;   
            }   
            // Perform average after detection comparison
            average[index] += bigval/4 - smallavg;
        }
        set_timer1(0);
        TMR1ON  = 1;                // Set up for next channel
        index ++;
        index &= 0x0F;;
        CPSCON1 = index;
    }else if(TMR2IF) {
        TMR2IF = 0;
    }
   
}


quyenbn87 25-07-2009 12:17 PM

thanks.bạn nhé.nhưng bạ có thể nói rõ hơn 1 chút đc không bạn ???

kimhuynguyen 25-07-2009 01:16 PM

Cảm ơn phamminhtuan đã ủng hộ về firmware.

Chức năng của mạch này là thay cái Keypad 4x4 (có bán ở Letran hoặc TMe)
Trên mạch có thiết kế Buzzer và Led. Khi chạm tay vào phím buzzer sẽ kêu và đèn sáng cho đến khi bỏ tay ra.

Đồng thời dữ liệu truyền ra UART là 2 byte (16 bit tương ứng với 16 phím-có thể nhấn nhiều phím cùng lúc)

Mong bạn phamminhtuan tiếp tục coding.

phamminhtuan 27-07-2009 10:09 AM

1 Attachment(s)
Trích:

Nguyên văn bởi kimhuynguyen (Post 28046)
Cảm ơn phamminhtuan đã ủng hộ về firmware.

Chức năng của mạch này là thay cái Keypad 4x4 (có bán ở Letran hoặc TMe)
Trên mạch có thiết kế Buzzer và Led. Khi chạm tay vào phím buzzer sẽ kêu và đèn sáng cho đến khi bỏ tay ra.

Đồng thời dữ liệu truyền ra UART là 2 byte (16 bit tương ứng với 16 phím-có thể nhấn nhiều phím cùng lúc)

Mong bạn phamminhtuan tiếp tục coding.

Mình nghĩ code như vậy đủ rồi, ai muốn viết thêm cái gì thì tùy người đó thôi, mình Post lên thêm code cho Hi-Tech C, lúc trước mình làm chạy rồi - nhưng phiên code này chưa test, nhưng có thể đảm bảo 99% là sẽ chạy trừ những trường hợp không chạy :D.
Giải thuật Mtouch tham khảo ở App Notes của Microchip nếu không muốn nói là lấy của nó luôn :(
CODE HT-PIC C
Code:

/*Author
    R&P Forwarding - Trading Co., Ltd.
    58/48 Nguyen Minh Hoang, Ward 12, Tan Binh District, HCMC, Viet Nam.
    http://dientu.rpc.vn
   
    Hi-Tech PICC Version 0.10 XTAL 20Mhz
   
*/
#include<htc.h>

__CONFIG(HS & WDTDIS  & UNPROTECT );



#define BOUNCE_TIME 2
unsigned char index;
unsigned long    reading[16];        // current reading for each button
unsigned long    average[16];        // running average for each button
unsigned long    threshold;                // threshold value is req'd # counts decrease from avg
unsigned long    bigval;                        // current button bigval  - for averaging technique
unsigned long    smallavg;                    // current button smallavg - for averaging technique


typedef union{
    unsigned short Val;
    struct {
        unsigned char bounce;
        struct {
            unsigned char isPress:1;
            unsigned char flagPress:1;
            unsigned char isRelease:1;   
            unsigned char unused:5;
        }FLAG;
    }BYTES;   

} BUTTON;

BUTTON    BTN[16];
   


void init();
void main() {
    unsigned char i;
    init();


    while(1) {   
        for(i=0; i<16; i++) {
            //button i is Pressed
            if(BTN[i].BYTES.FLAG.isPress) {

               
                //Your code here when BTN[i] Pressed
               
                //Must Clear when BTN Press Processed
                BTN[i].BYTES.FLAG.isPress = 0;
           
            //button i is Released
            }else if(BTN[i].BYTES.FLAG.isRelease) {

                //Your code here when BTN[i] Release
               
                //Must Clear when BTN Release Processed
                BTN[i].BYTES.FLAG.isRelease = 0;
            }
           
        //end for   
        }
   
    }   
}   

void init() {   
    char i;
    //setup_oscillator(OSC_8MHZ);
    for (index=0; index<16; index++){
        average[index] = 0;
        reading[index] = 0;
    }
    ANSELA = 0b00110000;
    TRISA  = 0b11111111;
   
    ANSELB = 0b00111111;
    TRISB  = 0b11111111;
   
    ANSELD = 0b11111111;
    TRISD  = 0b11111111;
    TRISC  = 0b11111111;
   
    ANSELE = 0b00000000;
    TRISE  = 0b00000000;
   
    T2CON  = 0b011110111;                    // T2ON, prescale = 1:16
    T1CON  = 0b11000101;                // Timer1 enable, source= capacity sensing, 1:1 prescale, don't sync with sys clock
    T1GCON = 0b11100010;                // T1GSS = Timer 2, toggle mode
    PR2 = 0xB4;
   
    CPSCON0 = 0b10001100;                // control settings
    CPSCON1 = 0x01;                        // init to channel select = 0 (4 LSb's)
    index = 0;
   
    TMR1GIF  = 0;                        // clear gate intpt flag
    TMR1GIE  = 1;                        // enable gate intpt
    PEIE      = 1;                        // enable peripheral intpts
    TMR2IF = 0;
    TMR2IE = 1;
    GIE = 1;

    for(i=0; i<16; i++) BTN[i].Val = 0;
    //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
    //enable_interrupts(INT_RTCC);
}   

void interrupt
 global_isr() {
    if (TMR1GIF && TMR1GIE) {
        TMR1GIF = 0;                    // clear intpt flag
        TMR1ON = 0;                        // Timer1 off
       
        bigval = (unsigned short)((TMR1H <<8) | TMR1L);
        bigval = bigval * 4;
        reading[index] = bigval;
        smallavg = average[index] / 4;
        threshold = average[index]>>1;                                    // ratiometric threshold from avail above (& combinations)

        if (bigval < average[index] - threshold)
        {
            if(BTN[index].BYTES.bounce < BOUNCE_TIME) BTN[index].BYTES.bounce++;
            if(!BTN[index].BYTES.FLAG.flagPress && BTN[index].BYTES.bounce == BOUNCE_TIME) {
                BTN[index].BYTES.FLAG.isPress = 1;   
                BTN[index].BYTES.FLAG.flagPress = 1;
            }   
        }
        else
        {
            if(BTN[index].BYTES.bounce > 0) BTN[index].BYTES.bounce--;
            if(BTN[index].BYTES.FLAG.flagPress && BTN[index].BYTES.bounce == 0) {
                BTN[index].BYTES.FLAG.flagPress = 0;
                BTN[index].BYTES.FLAG.isRelease = 1;   
            }   
            // Perform average after detection comparison
            average[index] += bigval/4 - smallavg;
        }
        TMR1H = 0;
        TMR1L = 0;
        TMR1ON  = 1;                // Set up for next channel
        index ++;
        index &= 0x0F;;
        CPSCON1 = index;
    }else if(TMR2IF) {
        TMR2IF = 0;
    }
   
}


linhnc308 29-07-2009 12:35 PM

Mục này là các dự án mã mở. Tôi thấy có rất nhiều bạn tải tài liệu về rồi nhưng phần cảm ơn sao ít quá. Diễn đàn có nút cảm ơn không phải chỉ để cho vui mắt đâu các bạn ạ. Người ta đã bỏ công ra làm và đưa lên không vì lợi ích cá nhân thì chúng ta hay biết cảm ơn họ.

zen1403 28-10-2009 09:47 AM

Mua 16F727
 
Ứng dụng này hay quá nhưng mình không biết mua 16F727 ở đâu, giá cả như thế nào.
Xin vui lòng chỉ giúp. Cảm ơn!

tungnh 28-10-2009 09:54 AM

Trích:

Nguyên văn bởi zen1403 (Post 30639)
Ứng dụng này hay quá nhưng mình không biết mua 16F727 ở đâu, giá cả như thế nào.
Xin vui lòng chỉ giúp. Cảm ơn!

Mua con Pic16f nào chẳng được hả bạn. về cơ bản chẳng khác nhau là mấy.

phamminhtuan 28-10-2009 10:56 AM

Trích:

Nguyên văn bởi tungnh (Post 30640)
Mua con Pic16f nào chẳng được hả bạn. về cơ bản chẳng khác nhau là mấy.

Với code trên và yêu cầu với số nút mTouch tới 16 thì phải cần PIC có module CSM (Capacitive Sensing Module) - Một số PIC16F khác có 2 module Comparator và 1 module S/R Latch chỉ hỗ trợ được tới 4 nút mTouch (không mux) thôi và cách viết chương trình có khác một chút

zen1403 30-10-2009 10:36 AM

Thanks!
 
Trích:

Nguyên văn bởi phamminhtuan (Post 30642)
Với code trên và yêu cầu với số nút mTouch tới 16 thì phải cần PIC có module CSM (Capacitive Sensing Module) - Một số PIC16F khác có 2 module Comparator và 1 module S/R Latch chỉ hỗ trợ được tới 4 nút mTouch (không mux) thôi và cách viết chương trình có khác một chút

Cám ơn bạn phamminhtuan.
Cái mình muốn là nhiều nút, nên mới hỏi về thằng 16F727. Mong bạn trả lời thắc mắc.
Tiện thể mình muốn hỏi, có cách gì để quét touch button như mình quét phím trước đây không?

picthanh 27-12-2009 10:49 PM

mình là thử mạch này rồi, mua con 16f727 (loại dán), về rất hăm hở, cuối cùng nạp ko dc. mình nạp bằng card nạp ICD2, từ lúc đó tới giờ bận quá, hôm nay mới có lụt lại thùng đồ mới phát hiện ra em nó, liền chạy lên đây hỏi anh em nạp thế nào chỉ mình với, con này thì nạp bằng những card nạp nào dc. mong bác nào làm qua chỉ dẫn em với

minhkha216 19-01-2010 05:56 PM

con này bạn có thể nạp bằng mạch nạp Pkit , chỉ cần nạp wa hai đường tính hiệu ở hai chân.Chân số mấy lâu quá mình cũng ko nhớ , xem datadheet đi nhé .

rhinoceros 10-02-2010 10:24 AM

hic.giờ sử dụng M-touch cũng có nhiều cái hay.
không biết những dòng Pic có trang bị M-touch thì có đặc điểm gì để nhận hay không.

em cũng sưu tầm đc cái code này,mang cho mọi người tham khảo .

Trích:

Nguyên văn bởi Nguyen Thang (Post 33183)
#include <pic10f20x.h>
#define led GP1 //chan out, khi cham vao nut thi out=0 (led sang), nguoc lai khi khong cham, out=1 (led tat)
//Chuong trinh viet cho MCU PIC10F206

void delay_ms(unsigned int n)
{
unsigned int n1;
while(n!=0)
{
n1=120;
while(n1!=0)
{
n1--;
}
n--;
}
}
void delay_us(unsigned int n)
{
while(n!=0)
{
n--;
}
}

void ConfigIO()
{
//cau hinh cac chan la IO
TRISGPIO=0;
COUTEN=1;
CMPON=0;//comparation disable
CWU=1;

OPTION=0xc0;
FOSC4=0;//GP2/T0CKI/COUT applied to GP2
}





void main()
{

ConfigIO();

//CMCON0 Register:CMPOUT | COUTEN | POL | CMPT0CS | CMPON | CNREF | CPREF |CWU
/*
bit 7 CMPOUT: Comparator Output bit
1 = VIN+ > VIN-
0 = VIN+ < VINbit
bit 6 COUTEN: Comparator Output Enable bit(1, 2)
1 = Output of comparator is NOT placed on the COUT pin
0 = Output of comparator is placed in the COUT pin
bit 5 POL: Comparator Output Polarity bit(2)
1 = Output of comparator not inverted
0 = Output of comparator inverted
bit 4 CMPT0CS: Comparator TMR0 Clock Source bit(2)
1 = TMR0 clock source selected by T0CS control bit
0 = Comparator output used as TMR0 clock source
bit 3 CMPON: Comparator Enable bit
1 = Comparator is on
0 = Comparator is off
bit 2 CNREF: Comparator Negative Reference Select bit(2)
1 = CIN- pin(3)
0 = Internal voltage reference
bit 1 CPREF: Comparator Positive Reference Select bit(2)
1 = CIN+ pin(3)
0 = CIN- pin(3)
bit 0 CWU: Comparator Wake-up on Change Enable bit(2)
1 = Wake-up on comparator change is disabled
0 = Wake-up on comparator change is enabled.
*/
COUTEN=0;//Output of comparator is placed in the COUT pin
POL=0;//Output of comparator inverted
CMPT0CS=1;//Comparator output used as TMR0 clock source
CMPON=1;//Comparator is on
CNREF=0;//Internal voltage reference
CPREF=1;//CIN+ pin


//OPTION Register:GPWU | GPPU | T0CS | T0SE | PSA | PS2 | PS1 |PS0
/*
bit 7 GPWU: Enable Wake-up on Pin Change bit (GP0, GP1, GP3)
1 = Disabled
0 = Enabled
bit 6 GPPU: Enable Weak Pull-ups bit (GP0, GP1, GP3)
1 = Disabled
0 = Enabled
bit 5 T0CS: Timer0 Clock Source Select bit
1 = Transition on T0CKI pin (overrides TRIS on the T0CKI pin)
0 = Transition on internal instruction cycle clock, FOSC/4
bit 4 T0SE: Timer0 Source Edge Select bit
1 = Increment on high-to-low transition on the T0CKI pin
0 = Increment on low-to-high transition on the T0CKI pin
bit 3 PSA: Prescaler Assignment bit
1 = Prescaler assigned to the WDT
0 = Prescaler assigned to Timer0
bit 2-0 PS<2:0>: Prescaler Rate Select bits
*/
OPTION=0b11100000;
TRIS=0B00000000;
led=0;
delay_ms(100);
led=1;
delay_ms(100);
led=0;
delay_ms(100);
led=1;
delay_ms(100);
// while(1)
// {
// led=0;
// delay_ms(500);
// led=1;
// delay_ms(500);
//
// }

while(1)
{
TMR0=0;//reset timer 0
delay_us(100);//cho de counter
if(TMR0<120)//tang gia tri nay de tang do nhay(170 la gia tri khong cach dien)
{
led=0;//nhan
}
else
{
led=1;//khong nhan
}
delay_ms(1);

}

}


falleaf 10-02-2010 01:46 PM

www.microchip.com/mtouch

Chúc vui


Múi giờ GMT. Hiện tại là 12:27 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam