Thông báo

Collapse
No announcement yet.

Một số kiểu thiết kế tiết kiệm chân Vi điều khiển!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Một số kiểu thiết kế tiết kiệm chân Vi điều khiển!

    Có thể bạn chưa biết! Một số kiểu thiết kế tiết kiệm chân MCU!

    Bàn phím là 1 chức năng không thể thiếu trong việc thiết kế mạch. Một số mạch,nếu dùng hết chân vào/ra của MCU mà vẫn ko đủ cho ứng dụng của mình. Vậy làm sao? kiếm 1 con MCU nhiều cổng I/O hay ghép nhiều con.. hay vô vàn cách khác. Tuy nhiên trước khi tìm đến giải pháp đó, bạn nán lại ít phút. Có thể giải pháp của tôi đưa ra có thể giúp ích được cho bạn trong một số trường hợp. Các mạch này tôi đã từng làm và chạy khá tốt.

    Tiết kiệm chân nếu mạch quét Led7T+bắt phím.
    Mạch 1: Led7T và 4 phím ấn. Chỉ mất: 8 chân data, 4 chân điều khiển,1 chân đọc phím. Tổng mất:8+4+1=13 chân.
    Làm như trên mạch của bạn sẽ có tính năng: Dữ liệu mềm dẻo, tiết kiệm IC giãi mã 7T kiểu-Bạn hoàn toàn có thể hiển thị:0-9, ngoài ra bạn có thể hiển thị lên đó một số chữ như:A,B,C,..G,g,n,U,u... trên cái mặt LED cỏn con đó.
    Vậy lợi ích đã rõ: bạn tiết kiệm được IC giải mã, mềm dẻo hơn trong hiển thị, có thể bắt 4 phím, tất nhiên có thể phát triển thành 8, 16, thậm chí hơn nữa, mà không tốn thêm 1 chân nào dành cho việc quét phím(lần sau).

    Việc bắt phím vô cùng đơn giản. Giả sử bạn quét đến LED thứ i(i=1->4), bạn đọc trạng thái chân Keyboard.
    if(Keyboard)
    {
    //Phím thứ i được ấn
    //Bạn có thể dùng thêm mã lệnh để chống rung
    }

    Sau đây là hình ảnh gửi kèm(các thành viên đăng nhập mới thấy được hình ảnh và file gửi kèm)
    Attached Files
    Last edited by BinhAnh; 29-08-2005, 23:31.


  • #2
    Đây là một kiểu thiết kế tương tự, cũng chỉ với 13 chân, bạn có thể mở rộng 8 phím ấn.

    Cách thực hiện cũng đơn giản, sau mỗi dòng lệnh xóa led, bạn chèn mã lệnh bằng cách gán data_i=1; nếu sau đó đọc trạng thái chân keyboard. Nếu bằng 1 thì có nghĩa là phím i được ấn.

    Chú ý, với PIC thì bạn có thể vô tư với kiểu trên, song với 89 thì cần trở kéo ở các chân data. Cách hay hơn nếu dùng 89, bạn đảo ngược tất cả đầu LED, nối điện trở chân KB lên 1. Sau dòng lệnh xóa Led, nếu chân KB==0 thì phím được ấn.

    Có thể biến đổi mạch trên khác đi 1 chút cho hợp với thiết kế của mình
    Attached Files
    Last edited by BinhAnh; 29-08-2005, 23:32.

    Comment


    • #3
      Với cách ở hình 3, nó sẽ gần giống cách hình 2.
      Sau mỗi dòng lệnh xóa Led, bạn chèn thêm mã lệnh quét kiểu matran phím. Theo cách này bạn lại có thể mở rộng 16 phím. Vậy chỉ cần 13-1=12 chân, bạn có thể làm được 1 kiểu quét khá tiết kiệm.
      Lưu ý: với PIC, trước khi làm thao tác quét này bạn nhớ khởi tạo chức năng công I/OATA là 4:I,4:O
      Với 89 thì nhớ set các chân data lên 1 đã.[/b]
      Attached Files
      Last edited by BinhAnh; 29-08-2005, 23:33.

      Comment


      • #4
        Biến đổi đi một tý, chỉ với 13 chân, có thể điều khiển được 4 Led7T+16 nút ấn+4 Led đơn.

        Cũng trên các ý tưởng này, không chỉ dừng lại có đến thế...
        Attached Files
        Last edited by BinhAnh; 29-08-2005, 23:34.

        Comment


        • #5
          Một số thiết kế, bạn có thể tái sử dụng các chân I/O. Ví dụ có thể sử dụng lại các chân điều khiển LCD, I2C... để bắt phím.

          Comment


          • #6
            Bắt phím bằng analog.

            Đối với một số MCU có ADC, bạn có thể dùng kiểu quét phím = analog.
            Mỗi khi ấn phím, sẽ tạo các điện áp khác nhau đặt vào chân ADC. Nên cho dòng đủ lớn qua hệ này để giảm nhiễu: do sờ tay, do ẩm ướt. Nếu thiết kế nhiều nút ấn = kiểu này, các bác phải tính đến các yếu tố:
            +Độ phân giải của ADC, sai số.
            +Sai số của D,R.
            +ĐỘ trôi nhiệt không đồng đều của D,R
            +Môi trường.
            Song với các ứng dụng thông thường, thì cách này hoàn toàn khả thi.
            Sau đây là một kiểu bắt phím bằng sử dụng ADC và điện trở. Ví dụ này có phổ biến trên các Appnote của Microchip(PIC),Cypress(PSoC)...
            Attached Files
            Last edited by BinhAnh; 29-08-2005, 23:35.

            Comment


            • #7
              Có thể dùng diode thay thế R, song số phím sẽ hạn chế.

              Nếu dùng R, sẽ nâng được số lượng nút ấn lên.
              Attached Files
              Last edited by BinhAnh; 29-08-2005, 23:36.

              Comment


              • #8
                Một cách khác, thiết kế sử dụng ĐKTX có sẵn!

                Trong một số trường hợp, khi sản xuất thiết bị, bạn khá đâu đầu bởi:

                1-Hệ thống menu phức tạp, càng ít nút ấn thì độ phức tạp về phần mềm càng cao, menu làm nhiều cấp hơn, người sử dụng sẽ rất khó sử dụng. Nếu ko quen, thì cái điện thoại cầm tay của bạn là 1 ví dụ. Bạn thử tưởng tượng cái tivi nhà bạn, nếu ko dùng ĐKTX thì sẽ khó điều khiển những chức năng đặc biệt ntn.

                2-Càng nhiều nút ấn, người sử dụng dễ vận hành hơn, phần mềm cũng dễ và gọn hơn. Đặc biệt, bố trí cơ khí, mặt máy để đưa 1 hệ thống phím lên cũng khá khoai.

                Tuy nhiên yếu tố người sử dụng sẽ đặt lên trên, còn chuyện lập trình menu chỉ tốn thêm ít thời gian, chứ ko khó khăn.

                Vậy bạn có thể sử dụng một giải pháp khác!

                Bạn hãy ra chợ kiếm một ĐKTX rẻ tiền ở chợ Giời(rẻ lắm), sau đó dán ĐỀ CAN lên đó. Bạn có thể in mọi thứ lên đó tùy theo chức năng các phím điều khiển. Thế là bạn đã đỡ đi một hệ thống phím khổng lồ trên máy, một công việc làm về cơ khí vốn "Kỵ" với dân điện tử.
                Bạn chon một con mắt nhận hông ngoại 3 chân(GND,VCC,DATA_out), nên mắc 1 tụ 47uF ngay sát chân VCC&GND của nó. Sau đó nối vào mạch của bạn(nên nối vào chân ngắt ngoài để dễ lập trình).
                Công việc còn lại là bạn tìm quy luật mã của ĐKTX bạn sử dụng, theo tôi bạn nên lên mạng download về:
                Ví dụ:
                http://www.tapspring.com/HATcker_AP_TV.htm
                www.ustr.net/infrared/index.shtml
                http://www.ustr.net
                http://users.pandora.be/davshomepage/rc5.htm

                Thông thường có 2 luật mã: RC5(gần giống mã Manschester) và PWM(bit 0 và 1 khác nhau ở % độ rộng xung).

                Comment


                • #9
                  Cám ơn anh BinhAnh ve các thủ thuật trên.
                  Bọn em cung đang mày mò làm mấy cái điều khiển từ xa dùng PSoC.
                  Cho em hỏi cái.
                  Nếu không dùng các thiết bị phát tia hồng ngoại có sẵn thì sao?
                  Các thiết bị phát tia hồng ngoại nào thì dùng mã RC5?
                  Cụ thể là của hãng nào thì theo chuẩn mã gì.Phân biệt hay làm cách nào để biết được.
                  Anh cũng đang làm về PSoC phải không?
                  Hỡi mặt trời hay chính trái tim em trong ngực
                  Soi cho tôi ngày hôm nay bước tiếp quãng đường dài

                  Comment


                  • #10
                    Psoc

                    Nguyên văn bởi hoaibk54
                    Cám ơn anh BinhAnh ve các thủ thuật trên.
                    Bọn em cung đang mày mò làm mấy cái điều khiển từ xa dùng PSoC.
                    Cho em hỏi cái.
                    Nếu không dùng các thiết bị phát tia hồng ngoại có sẵn thì sao?
                    Các thiết bị phát tia hồng ngoại nào thì dùng mã RC5?
                    Cụ thể là của hãng nào thì theo chuẩn mã gì.Phân biệt hay làm cách nào để biết được.
                    Anh cũng đang làm về PSoC phải không?
                    Chào bạn
                    Tôi xin trả lời thay cho Bình Anh về vấn đề của bạn như sau:
                    1. Nếu bạn không sử dụng các thiết bị phát tia hồng ngoại có sẵn thì bạn phải làm một hệ thống bao gồm một bộ thu và một bộ phát riêng biệt. Như của bạn sử dụng PSOC thì bạn cần phải sử dụng 2 con PSOC cho công việc thu phát hồng ngoại riêng biệt và theo tôi được biết thì ứng dụng này đã được nói đến trong thư viện FTP của diễn đàn điện tử và phát triển bởi Nhóm kỹ sư Phòng tự động hoá - Viện CNTT.
                    2. Việc phân biệt bộ điều khiển phát mã RC5 của hãng nào sử dụng chuẩn mã gì bạn nên tham khảo tại các trang web mà Binh Anh đã cung cấp và điều này còn dựa vào kinh nghiệm khi triển khai và lập trình thực tế
                    Tôi gửi kèm theo đây 1 file bạn có thể lấy về tham khảo. Hy vọng nó sẽ giúp ích cho bạn trong quá trình nghiên cứu của mình.
                    Attached Files
                    |

                    Comment


                    • #11
                      Nguyên văn bởi hoaibk54
                      Cám ơn anh BinhAnh ve các thủ thuật trên.
                      Bọn em cung đang mày mò làm mấy cái điều khiển từ xa dùng PSoC.
                      Cho em hỏi cái.
                      Nếu không dùng các thiết bị phát tia hồng ngoại có sẵn thì sao?
                      Các thiết bị phát tia hồng ngoại nào thì dùng mã RC5?
                      Cụ thể là của hãng nào thì theo chuẩn mã gì.Phân biệt hay làm cách nào để biết được.
                      Anh cũng đang làm về PSoC phải không?
                      Như Haile nói, có thể thiết kế tách cả thu lẫn phát. Thông thường thì mạch phát người ta dùng nguồn PIN cho gọn nhẹ vì là thiết bị cầm tay. Bởi thế nhất thiết nên dùng VĐK phát ở chế độ tiết kiệm năng lượng. Mỗi khi ấn phím, nó sẽ thoát khỏi chế độ tiết kiệm và phát mã ứng với phím ấn.
                      Một cách khác, người ta ko sử dụng chế độ tiết kiệm năng lượng mà sử dụng kiểu: khi ấn phím thì phím đồng thời cấp nguồn và mã.Tuy nhiên có thể dùng các cặp thu phát chuyên dụng. Có lẽ em dùng PSoC cho nó hoành tránh
                      Thông thường ở các MCU khác như PIC, AVR.. thì ngưòi ta phải viết mã cho phần mã hóa. Nếu dùng PSoC thì dùng sẵn User Module của nó thì nhẹ nhàng lắm em nhi?
                      Anh đã thiết kế bộ thu & phát = PIC. Bộ phát, chờ mãi mà nó chẳng chịu hết PIN cho.
                      RC5 chẳng qua là một chuẩn mã hóa thông dụng cho hồng ngoại. Ví dụ Philips chẳng hạn. Bit 0 thì được mã hóa là 01(Độ rộng xung 50:50), 1 mã hóa là 10(Độ rộng xung 50:50).
                      http://users.pandora.be/davshomepage/rc5.htm
                      Có thể có những kiểu mã hóa khác như mã theo độ rộng xung(Sony chẳng hạn).Chẳng hạn:bit 0 mã là 10 với rộng 1:T,0:T còn bit 1 mã hóa cũng mã hóa 10 nhưng độ rộng 1:T,0:2T. Tóm lại, mã độ rộng xung thì độ rộng xung sẽ khác nhau nếu là bit 1 hay 0. Ví dụ:
                      http://www.ustr.net/infrared/sony.shtml
                      Có Có thể tra bằng từ khóa trên Google nếu 3 wedsite trên ko có. Vào đó, sẽ biết hãng nào thì chuẩn nào.

                      Comment


                      • #12
                        Chuẩn RC5!

                        Hi vọng những bài viết tiếp theo trong luồng này sẽ giúp cho những ai đang có ý định làm về điều khiển hồng ngoại hiểu nhanh hơn. Và cũng rất mong mọi người đóng góp thêm, đặc biệt bác Hard đã có rất nhiều mã nguồn và kinh nghiệm trong vấn đề này.
                        Tôi sẽ trình bày về chuẩn RC5 khá thông dụng.

                        Sau đây là một frame khuôn dạng dữ liệu gồm 14 bit(các bạn Online để thấy được hình ảnh):
                        Attached Files

                        Comment


                        • #13
                          Một bit được tạo bởi 2 bit đơn(giống mã manchester):
                          Bít 1:mã là 10(T/2 là mức cao-T/2 là mức thấp)
                          Bít 0:mã là 01(T/2 là mức thấp-T/2 là mức cao)
                          Do vậy, mỗi bít độ dài cố định là T, nên độ dài khung truyền là 14*T.
                          Phần Hearder(nhận dạng):gồm 3 bít:1,1 và một bít đặc biệt CHK(theo hình vẽ).
                          Bên thu sẽ liên tục nhận tín hiệu, nếu đúng dạng Header thì nó mới cho phép tiếp tục nhận mã địa chỉ và dữ liệu.
                          Phần địa chỉgồm 5 bit, bởi thế có thể định ghĩa được 32 địa chỉ.
                          Phần data gồm 6 bít, bởi thế có thể định nghĩa được 64 lệnh.
                          Attached Files

                          Comment


                          • #14
                            Các bước làm bộ nhận cho mã RC5!

                            Mắt nhận có thường có 3 chân(out,GND,+5V), nên cho 2 tụ(1 tụ 0.1uF và 1 tụ hóa hóa >=47uF) vào GND và +5V thật sát để chống nhiễu, bởi các mắt nhận kiểu này rất nhạy với nhiễu nguồn. Mắt nhận này bán phổ biến ở Việt Nam- gần như ở bất cứ của hàng linh kiện nào cũng có.
                            Trong thiết kế, lối ra của mắt nhận bình thường ở mức 1. Lối ra của mắt nhận nên cho vào chân ngắt Int(nên cho ngắt này) hoặc có thể ngắt Onchange, tùy theo loại Vi điều khiển để dễ dàng cho việc lập trình.


                            Có nhiều mã lệnh, chúng có thể khác nhau tý chút, sau đây là 1 cách dễ hiểu:
                            Cài đặt vi điều khiển: sử dụng 1 ngắt ngoài kích theo sường âm và 1 ngắt timer(thời gian T/2).Một biến Index(lưu chỉ số bit nhận) . Đầu tiên cho Index=0;
                            //Ngắt ngoài Int
                            1-Index=0;
                            2-Cấm luôn ngắt ngoài Int;
                            3-Nạp và chạy bộ định thời cho timer với thời gian=T/4, cho phép ngắt timer;
                            //Kết thúc ngắt ngoài
                            ////////////////////
                            //Ngắt timer
                            1-Nạp lại bộ định thời thời gian là T/2;
                            2-buff[Index++]=Value(tại chân Int);
                            3-if(Index==5)
                            {
                            Xem đúng mã Header(nhận dạng) ko? nếu không đúng Index=0;dừng timer, cho phép ngắt ngoài để chờ , nhận mã mới

                            }
                            4-If(index==Max_Index)
                            {
                            So sánh mã, nếu đúng mã thì ...
                            Kết thúc việc nhận dữ liệu:Index=0;dừng timer, cho phép ngắt ngoài để chờ nhận mã mới
                            }
                            //Kết thúc ngắt timer
                            Phần đối chiếu mã, bạn phải biến đổi mã dựa vào buff và phải thõa mãn mã RC5 là buffp[2*i]<>buff[2*i+1] (với i=4...MAX_Index/2-1).

                            Comment


                            • #15
                              Mã kiểu PWM thì độ dài khung truyền khác nhau. Cang nhiều bit 1 thì độ dài càng tăng.
                              Lập trình nhận mã thì chỉ khác đi một chút.
                              Cho phép ngắt ngoài và 1 ngắt timer.
                              1-Mỗi sườn âm sẽ tạo ra ngắt ngoài, khởi động 1 ngắt timer = 1.5*T để đọc bit
                              2-Có ngắt timer, buff[index++]=Not(Value). Nếu Dừng timer.
                              ....
                              Chú ý: thực tế tín hiệu nhận đều ngược mức, nên mới có giải thuật như trên
                              Attached Files

                              Comment

                              Về tác giả

                              Collapse

                              BinhAnh Tìm hiểu thêm về BinhAnh

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X