PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   hỏi về keypad 4x4 dùng ADC (http://www.picvietnam.com/forum/showthread.php?t=3622)

tranhuyky 02-03-2009 09:46 AM

hỏi về keypad 4x4 dùng ADC
 
Chào mọi người!
Mình đang làm 1 ứng dụng dùng keypad.
Cách thông thường là dùng 8 chân thì mình làm được rồi.
Nhưng do không đủ chân mình định dùng keypad ADC để tiết kiệm chân.
Mà mình không biết ưu điểm và khuyết điểm cũng như cách làm keypad ADC.
Có ai biết keypad ADC tư vấn cho mình nhe.
Xin cảm ơn.

namqn 02-03-2009 08:28 PM

Trích:

Nguyên văn bởi tranhuyky (Post 23127)
Chào mọi người!
Mình đang làm 1 ứng dụng dùng keypad.
Cách thông thường là dùng 8 chân thì mình làm được rồi.
Nhưng do không đủ chân mình định dùng keypad ADC để tiết kiệm chân.
Mà mình không biết ưu điểm và khuyết điểm cũng như cách làm keypad ADC.
Có ai biết keypad ADC tư vấn cho mình nhe.
Xin cảm ơn.

Google một cái là có ngay mà bạn, chẳng hạn:
http://lancer3.com/ADC%20Keypad.htm

Bạn thử nghĩ xem nếu nhấn hai nút đồng thời thì thế nào nhé.

Thân,

tranhuyky 02-03-2009 11:29 PM

Trích:

Nguyên văn bởi namqn (Post 23145)
Google một cái là có ngay mà bạn, chẳng hạn:
http://lancer3.com/ADC%20Keypad.htm

Bạn thử nghĩ xem nếu nhấn hai nút đồng thời thì thế nào nhé.

Thân,

Cám ơn anh namqn đã đặt 1 câu hỏi làm sáng tỏ vấn đề.
Tiện thể anh có thể cho em xin code của driver keypad 4x4 viết bằng ngắt được không anh?

namqn 02-03-2009 11:41 PM

Trích:

Nguyên văn bởi tranhuyky (Post 23154)
Cám ơn anh namqn đã đặt 1 câu hỏi làm sáng tỏ vấn đề.
Tiện thể anh có thể cho em xin code của driver keypad 4x4 viết bằng ngắt được không anh?

Vì bạn cho biết cách thông thường bạn đã làm được, nên tôi giả thiết bạn đang hỏi cách hiện thực có dùng ADC. Bạn cho biết thêm bạn định viết code bằng hợp ngữ hay ngôn ngữ cấp cao nào, cho PIC cụ thể nào (vì PIC16F và PIC18F có nhiều khác biệt trong xử lý ngắt, mặc dù đều là PIC 8-bit).

Bạn cũng nên tránh hỏi riêng một ai đó trên diễn đàn, vì đâu phải chỉ có một người có thể giúp bạn.

Thân,

tranhuyky 02-03-2009 11:47 PM

Trích:

Nguyên văn bởi namqn (Post 23157)
Vì bạn cho biết cách thông thường bạn đã làm được, nên tôi giả thiết bạn đang hỏi cách hiện thực có dùng ADC. Bạn cho biết thêm bạn định viết code bằng hợp ngữ hay ngôn ngữ cấp cao nào, cho PIC cụ thể nào (vì PIC16F và PIC18F có nhiều khác biệt trong xử lý ngắt, mặc dù đều là PIC 8-bit).

Bạn cũng nên tránh hỏi riêng một ai đó trên diễn đàn, vì đâu phải chỉ có một người có thể giúp bạn.

Thân,

Em đang dùng CCS viết cho PIC18F4550. Ứng dụng của em dùng keypad với LCD kèm theo 1 số giao tiếp khác.
Hiện tại đã dùng được driver thông thường. Nhưng cách này viết menu cho LCD thì không tiện.
Trong khi dùng ngắt thì lại gặp vấn đề không tương thích với các hàm delay của LCD.
Mong nhận được sự chỉ giáo của các đàn anh.

thvinh1010 04-03-2009 05:47 PM

Mình cũng đang học về PIC, viết một ứng dụng đơn giản có sử dụng keypad + tính năng
ngắt. Nhưng vẫn chưa chạy tốt được. Vì lí do gì thì vẫn chưa hiểu được. Mặc
dù không có ngắt thay đổi điện áp bởi nhất nút keypad nhưng mà vẫn vào hàm ngắt.
Anh chị nào có kinh nghiệm, xin chỉ giáo. Cảm ơn.

Thông tin trên mạch như sau:
+ PB0-PB3 là Output, giá trị 0
+ PB4-PB7 là Input, được kéo Pullup lên Vcc
+ Khi nhấn nút thì PB0 -> PB4, or PB1 -> PB5, or PB2 -> PB6, or PB3 -> PB7. Làm cho
tín hiệu ở PB4-PB7 thay đổi từ H->L

==> khi đổ xuống PIC, thấy xuất ra ký tự "C" liên tục :-(. Xin được giúp đỡ.

Code:

#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000,crystal)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


#int_rb
void detect_rb_change() {
        putc('c');
}

void main() {

    set_tris_b(0xF0);

    enable_interrupts(INT_RB);
    enable_interrupts(GLOBAL);
 
    ext_int_edge(H_to_L);

    while (TRUE)
    {
    }
}


picpen 05-03-2009 12:55 AM

Làm sao bạn biết là nó luôn nhảy vào ngắt ??
Bạn cho hiển thị ký tự " C " lên LCD hay máy tính vậy , Mà sao chương trình không thấy báo bảo khởi tạo LCD
Mình bị một lần : khai báo lệnh " enable_interrupts(INT_RB); " thì không thể nào vào ngắt đươc , sau đó mình thay đổi bằng lệnh :

ENABLE_INTERRUPTS( INT_RB7);
ENABLE_INTERRUPTS( INT_RB6);

Thì chạy bình thường
Trường hợp của bạn có thể do phần cứng , bạn dò lại mạch xem nhé

tranhuyky 05-03-2009 08:17 AM

Trích:

Nguyên văn bởi picpen (Post 23216)
Làm sao bạn biết là nó luôn nhảy vào ngắt ??
Bạn cho hiển thị ký tự " C " lên LCD hay máy tính vậy , Mà sao chương trình không thấy báo bảo khởi tạo LCD
Mình bị một lần : khai báo lệnh " enable_interrupts(INT_RB); " thì không thể nào vào ngắt đươc , sau đó mình thay đổi bằng lệnh :

ENABLE_INTERRUPTS( INT_RB7);
ENABLE_INTERRUPTS( INT_RB6);

Thì chạy bình thường
Trường hợp của bạn có thể do phần cứng , bạn dò lại mạch xem nhé

ủa, làm gì có interrupt INT_RB6, INT_RB7.
Chắc bạn thvinh1010 chưa cho xuất ra LCD chỉ mới xuất ra cổng com thôi.
Mình cũng đang bị vướng chổ ngắt RB cho con 18F4550, chưa biết làm sao hểt :(

picpen 05-03-2009 01:29 PM

Trích:

Nguyên văn bởi tranhuyky (Post 23222)
ủa, làm gì có interrupt INT_RB6, INT_RB7.
Chắc bạn thvinh1010 chưa cho xuất ra LCD chỉ mới xuất ra cổng com thôi.
Mình cũng đang bị vướng chổ ngắt RB cho con 18F4550, chưa biết làm sao hểt :(

Không có hay bạn không biết ? Nếu bạn chỉ đọc bản help của CCS thì cả đời cũng chẳng bao giờ nhìn thấy lệnh đó . Vì thằng HELP của CCS còn khá sơ sài
Bạn có thể mở các file .H trong bộ cài ở forder DRIVERS ra tìm hiểu

Chúc may mắn ......

tranhuyky 05-03-2009 01:41 PM

Trích:

Nguyên văn bởi picpen (Post 23242)
Không có hay bạn không biết ? Nếu bạn chỉ đọc bản help của CCS thì cả đời cũng chẳng bao giờ nhìn thấy lệnh đó . Vì thằng HELP của CCS còn khá sơ sài
Bạn có thể mở các file .H trong bộ cài ở forder DRIVERS ra tìm hiểu

Chúc may mắn ......

Thật sự thì mình chưa biết.
Mình đã xem rồi. Các khai báo INT_RB6, INT_RB7 chỉ có trong 1 số file .h thôi.
Riêng con 18F4550 thì không có!!!

tranhuyky 05-03-2009 06:11 PM

Mình đã điều khiển ngắt RB được rồi, mình gởi source để mọi người cùng tham khảo.
Port B được nối với keypad 4x4. Nếu nhấn 1 nút trên port B thì sẽ xuất 1 ký tự 'c' qua RS232.

Nhưng có 1 chỗ mình chưa hiểu là nếu mình comment khối lệnh IF trong hàm ngắt RB_isr() thì ký tự 'a' được xuất ra liên tục(hàm ngắt xãy ra liên tục).
Có ai giải thích dùm mình được không?


Code:

#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000,crystal)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#byte portb = 0xf81
#use fast_io(B)

static int old_b_state;
#int_RB
void RB_isr(void) {
    putc('a');
    if (old_b_state != portb)
    {
        disable_interrupts(INT_RB);
        putc('c');
        enable_interrupts(INT_RB);
    }
}

void main() {

    port_b_pullups(TRUE);
    output_b(0xf0);
    set_tris_b(0xf0);

    old_b_state = portb;

    enable_interrupts(INT_RB);
    enable_interrupts(global);
 
  while (TRUE)
  {
  }
}



Múi giờ GMT. Hiện tại là 02:02 AM.

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