Thông báo

Collapse
No announcement yet.

Parallel Port - lập trình giao tiếp song song

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Parallel Port - lập trình giao tiếp song song

    undefinedChào mọi người, tôi xin bắt đầu tiếp tục về lập trình giao tiếp song song cho cổng máy in LPT.

    Ngôn ngữ lập trình là: Visual C++ và Visual Basic trong bộ Visual Studio 6.0 bản Enterprise hoặc Professional của Microsoft

    Tôi sẽ viết TUT về chủ đề này.Do không thể post liền một lúc lên hết được. Mong các bạn chờ đợi.Mỗi ngày một ít.Vì tôi cũng phải tìm tài liệu và do đó sẽ tìm hiểu cái nào hay nhất post lên cho mọi người.Tôi sẽ viết bài sao cho cô đọng và hay nhất

    Mọi đóng góp có thiện chí xin mời các bạn đóng góp sang một luồng khác( tôi đã lập) để luồng này cô đọng. Nếu có gì sai sót thì tôi sẽ sửa lại để đúng với mục đích phổ biến kiến thức chuẩn.

    Xin chân thành cảm ơn các bạn.
    Last edited by ngohaibac; 04-02-2006, 17:27.
    Technical sale at WT Microelectronics S'pore
    Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
    Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

  • #2
    Tài liệu, giới thiệu cổng song song, các dạng cổng

    Đầu tiên, tôi xin đưa cho các bạn tài liệu Parallel Port Complete của Jan Axelson:
    http://www.esnips.com/web/ParallelPortLPT/ (vào và download về nhé).

    Website: www.lvr.com mục Parallel Port
    **************
    1. Định nghĩa cổng song song

    Cổng song song( Parallel Port) là tập hợp các đường tín hiệu mà vi xử lí hoặc là CPU dùng để trao đổi dữ liệu với các thiết bị, thành phần khác. Điển hình nhất của loại giao diện này là dùng để giao tiếp với máy in, modems, keyboards và màn hình,.. Cổng song song truyền nhiều bít một lần, trong khi cổng nối tiếp chỉ truyền một bít một ở một thời điểm ( nhưng có thể truyền 2 chiều ở cùng một thời điểm).

    Cổng song song của PC ban đầu có 8 đường ra, 5 đường vào và 4 đường vào ra. Những đường này là đủ để giao tiếp với nhiều dạng của các thiết bị ngoại vi. Ở nhiều máy tính mới hơn, 8 đường ra có thể thực hiện chức năng như là đường Input để đạt giao tiếp với tốc độ cao với máy scaner, thiết bị và các thiết bị khác gửi dữ liệu tới PC.

    Cổng song song đã được thiết kế như là một cổng máy in.

    2. Các dạng cổng

    Một số nhà sản xuất máy tính đã giới thiệu các phiên bản cải tiến của cổng song song. Cổng mới này tương thích với thiết kế cũ nhưng có thêm nhiều chức năng mới, chủ yếu là để tăng tốc độ.

    Tốc độ là một yếu tố quan trong bởi vì máy tính và thiết bị ngoại vi đã trở lên nhanh hơn rất nhiều, những công việc mà máy tính làm được đã phức tạp hơn, và tổng dung lượng thông tin mà chúng cần trao đổi tăng lên. Cổng song song truyền thống là đủ nhanh lắm rồi cho truyền byte dưới dạng kí tự mã ASCII tới một ma trận điểm hoặc là máy printer kiểu cũ. Nhưng với printer hiện đại cần nhận nhiều thông tin nhiều thông tin quan trọng hơn để in một trang như nhiều font, đồ hoạ chi tiết, thường trong màu sắc. Với tốc độ cao máy tính có thể truyền thông tin, cũng với tốc độ cao này máy tin có thể bắt đầu quá trình và in kết quả.

    2.1. Original( SPP): dạng máy in chuẩn

    SPP - Standard Parallel Port : cổng song song chuẩn
    Cổng song song trong các máy PC cổ điển thiết kế dựa trên một giao diện máy in vẫn đang tồn tại là Centronic.

    SPP có thể truyền 8 bít một lần tới thiết bị ngoại vi, dùng giao thức giống như được dùng trong giao diện Centronic gốc. SPP không có đường nhận dữ liệu rộng 1 byte, nhưng khi truyền từ PC tới thiết bị ngoại vi, SPP có thể dùng Nibble Mode để truyền mỗi lần 4 bít. Nibble Mode thì chậm nhưng đã trở thành phổ biến như là một cách để dùng cổng song song cho Input.

    2.2. Dạng PS/2 ( Vào ra 2 chiều đơn giản - Simple Bidirectional)

    Một sự cải tiến sớm cho cổng song song là cổng dữ liệu vào ra 2 chiều( Bidirectional Port) được đưa ra trong máy tính IBM: dạng PS/2. Cổng vào/ra cho phép một thiết bị ngoại vi truyền 8 bít một lần tới PC. Nhóm PS/2 bao gồm các cổng song song có một cổng dữ liệu vào ra nhưng không hỗ trợ các mode EPP hoặc ECP( sẽ giới thiệu dưới đây). Byte mode là một giao thức truyền dữ liệu 8 bít mà cổng dạng PS/2 có thể dùng để truyền dữ liệu từ thiết bị ngoại vi tới PC.

    2.2.1. EPP

    EPP( enhanced parallel port - cổng song song nâng cao) là cổng được phát triển ban đầu bởi nhà sản xuất chip Intel, sản xuất máy tính Zenith, và Xircom – nhà sản xuất sản phẩm mạng song song. Như một cổng dạng PS/2, các đường dữ liệu là các đường vào ra. Một EPP có thể đọc hoặc ghi 1 byte dữ liệu trong một chu kì của bus mở rộng ISA hoặc 1 micro giây, bao gồm bắt tay, trong khi với SPP hoặc PS/2 thì cần 4 chu kì. Một EPP có thể chuyển đổi chiều nhanh chóng, vì thế nó rất là hiệu quả khi dùng với đĩa hoặc là thiết bị dài và các thiết bị khác truyền dữ liệu trong cả 2 chiều. Một EPP có thể dùng thay cho SPP và một vài EPP có thể dùng thay cho cổng dạng PS/2.

    2.2.2. ECP

    ECP(Extended capabilities port - cổng có khả năng mở rộng) được đưa ra lần đầu tiên bởi Hewlett Packard và Microsoft. Giống với EPP, ECP cũng có các đường dữ liệu vào ra và có thể truyền dữ liệu ở tốc độ của bus ISA. ECP có bộ đệm và hỗ trợ DMA( direc memory access – truy cập bộ nhớ trực tiếp) truyền và nén dữ liệu. Các bộ truyền nhận kiểu ECP rất hữu ích cho printer, và các thiết bị ngoại vi khác truyền các khổi dữ liệu lớn. Một ECP có thể ECP có thể dùng như là một cổng SPP hoặc PS/2 và nhiều ECP có thể dùng thay cho cổng EPP rất tốt.

    2.3. Các port đa chế độ (Multi-mode Ports).

    Rất nhiều cổng mới hơn là các cổng với Multi-mode có thể cạnh tranh một vài hoặc tất cả các dạng trên. Các cổng này thường bao gồm các lựa chọn cấu hình để có thể sử dụng tất cả các dạng cổng hoặc cho phép một chế độ nhất định trong khi khóa các chế độ khác.

    Chúc các bạn thành công.
    Last edited by ngohaibac; 29-06-2007, 22:38.
    Technical sale at WT Microelectronics S'pore
    Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
    Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

    Comment


    • #3
      Giao tiếp LPT trong VC++ 6.0 dùng thư viện INPOUT32

      Bạn download thư viện INPOUT32 tại đây

      Giải nén và vào thư mục \inpout32_source_and_bins\inpout32_source_and_bins \binaries\ocx

      Trong thư mục đó, tạo một file .bat với nội dung như sau:
      Code:
      REGSVR32  hwinterface.ocx
      Để đăng ký hwinterface. Các bạn có thể download file đính kèm, giải nén và chạy file bac.bat nhé .

      Khi đó bạn mở Visual C++. Mở menu Projects-> Add to project-> Components and control và chọn Registered ActiveX Controls và tìm đến hwinterface để cho nó vào projects.

      Tiếp theo bạn khai báo và sử dụng lớp này bình thường với tên là: CHwinterface.

      Lớp này có 2 hàm dùng để đọc và ghi dữ liệu:
      Code:
      	short InPort(short Address);
      	void OutPort(short Address, short Data);
      Chúc bạn thành công.
      Attached Files
      Last edited by ngohaibac; 07-06-2007, 10:18.
      Technical sale at WT Microelectronics S'pore
      Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
      Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

      Comment


      • #4
        3. Các tài nguyên hệ thống

        Cổng song song dùng nhiều tài nguyên của hệ thống. Tất cả các cổng dùng một dãy địa chỉ, cho dù số lượng và vị trí của các địa chỉ thay đổi. Nhiều cổng có một mức IRQ (Interrupt request) xác định, và các cổng ECP có thể có một kênh DMA xác định. Các tài nguyên dành cho một cổng không thể dùng cho các thành phần khác của hệ thống, các cổng song song khác.

        3.1. Địa chỉ (Addressing)

        Cổng song song chuẩn dùng ba địa chỉ liền nhau, thường là một trong 3 dãy sau:

        • 3BCh, 3BDh, 3EEh
        • 378h, 379h, 37Ah
        • 278h, 279h, 27Ah



        Địa chỉ đầu tiên trong dãy là địa chỉ gốc (base address) của Port thương được gọi là địa chỉ thanh ghi Dữ liệu (Data register) hoặc là địa chỉ của cổng.

        Địa chỉ thứ 2 là địa chỉ của thanh ghi trạng thái (Status register).

        Địa chỉ thứ 3 là địa chỉ của thanh ghi Điều khiển (Control register).

        Chú ý: Các cổng EPP và cổng ECP dành một số địa chỉ bổ sung cho mỗi cổng.

        EPP thêm 5 thanh ghi tại địa chỉ Base address + 3 tới Base address + 7, còn ECP thêm 3 thanh ghi tại địa chỉ base address + 400h tới base address + 402h.

        Ví dụ: với Base address = 378h thì các thanh ghi của cổng EPP ở tại địa chỉ 37Bh tới 37Fh, và các thanh ghi cổng ECP tại địa chỉ 778h tới 77Fh.

        Trong các máy tính PC cũ các cổng song song có Base address tại 3BCh. Nhưng trong các máy tính hiện nay phần lớn có Base address = 378h. Tuy nhiên tất cả 3 dãy địa chỉ là dành riêng cho các cổng song song, và nếu phần cứng của cổng cho phép bạn có thể thiết lập cổng song song ở bất cứ địa chỉ nào trong 3 địa chỉ trên.

        Note:
        Thế nhưng, bình thường bạn không thể có một cổng EPP có base address = 3BCh bới vì các thanh ghi EPP bổ sung tại địa chỉ này có thể được dùng cho hiển thị màn hình (video display).

        Cổng PS/2 có 3 thanh ghi bổ sung ở địa chỉ base address + 3 tới base address + 5, và cho phép base address 1278h hoặc 1378h.

        Thông thường, DOS và Windows coi cổng đầu tiên theo thứ tự số là LPT1, thứ 2 là LPT2, thứ 3 là LPT3. LPT1 thường ở vị trí 378h nhưng nó có thể ở một trong 3 địa chỉ. LPT2 nếu tồn tại có thể ở vị trí 378h hoặc 278h. LPT3 chỉ có thể ở vị trí 278h.

        (còn tiếp).
        Technical sale at WT Microelectronics S'pore
        Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
        Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

        Comment


        • #5
          3.2. Các ngắt (Interrupts)

          Phần lớn các cổng song song có khả năng phát hiện tín hiệu ngắt từ thiết bị ngoại vi. Thiết bị ngoại vi có thể dùng ngắt để thông báo rằng đã sẵn sàng để nhận byte hoặc có một byte để truyền.

          Để dùng ngắt, cổng song song phải có một mức yêu cầu ngắt (Interrupt request - IRQ) xác định.

          Theo qui ước LPT1 dùng IRQ7 và LPT2 dùng IRQ5. Thế nhưng IRQ5 được dùng bởi nhiều card âm thanh, và bởi vì các mức IRQ không được dùng bởi các thành phần hệ thống nào rất là hiếm trong hệ thống, thậm chí IRQ7 có thể được dành cho các thiết bị khác. Một vài cổng cho phép chọn các mức IRQ khác 2 mức trên.

          Rất nhiều driver máy in hoặc nhiều ứng dụng và thiết bị khác truy nhập cổng song song không yêu cầu ngắt cổng song song. Nếu bạn không chọn mức báo ngắt cho cổng song song thì cổng này vẫn hoạt động trong hầu hết các trường hợp rất là hiệu quả và bạn có thể dành mức báo ngắt IRQ cho công việc khác.


          3.3. Các kênh truy nhập bộ nhớ trực tiếp (DMA chanels).


          DMA : direct memory access

          Các cổng ECP có thể truy nhập bộ nhớ trực tiếp (DMA) đối với dữ liệu tại cổng song song. Khi DMA tro đổi dữ liệu thì CPU không cần kiểm soát đường truyền và có thể làm các công việc khác vì thế trao đổi dữ liệu bằng DMA làm tăng khả năng hoạt động cho toàn bộ hệ thông. Yêu cầu để dùng DMA là các cổng này phải có kênh DMA xác định, thay đổi từ 0 đến 3.
          Technical sale at WT Microelectronics S'pore
          Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
          Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

          Comment


          • #6
            Mạch test LPT

            Chào các bạn.

            Mình đính kèm mạch giao tiếp cổng LPT với PIC16F877A hay là con PIC18 40 chân nào cũng good hết.

            Hình ảnh mạch in:



            Hình 1: Mạch in

            Chương trình test nằm trong file LPT Tester. Giao diện chương trình:



            Hình 2: Giao diện chương trình test.


            Ngoài ra còn có source code - đĩa đính kèm của quyển Parallel Port Complete nữa.

            Viết chương trình cho LPT không khó. Mình sẽ upload chương trình đơn giản sau. Để mình làm ngon lành rùi cho code lên ngay. Ai có ý kiến giơ tay nào .

            Chúc các bạn thành công.
            Attached Files
            Technical sale at WT Microelectronics S'pore
            Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
            Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

            Comment


            • #7
              Các bác cho em hỏi :
              làm thế nào để set LPT ở mode ECP , sử dụng chế độ xuất nhập song song hai chiều (bidirection) ờ các chân data của LPT port
              làm thế nào để nhận dữ liệu (song song) 8 bit về máy tính ở ECP mode.
              K=inp32(addr_in)
              vậy địa chỉ Addr_in là bao nhiêu
              có phải là 378H hay là 378H+402H
              cám ơn các bác nhiều

              Comment


              • #8
                Có ai biết lập trình điều khiển thiết bị ngoại vi bằng C++.Net mới qua LPT không

                chào mọi người !
                có ai biết về lập trình điều khiển thiết bị ngoại vi bằng C++.net mới qua cổng LPT không.
                hoặc có tài liệu về vấn đề này cho mình xin .
                thanks a lot

                Comment


                • #9
                  chào mọi người mình muốn hỏi nếu lập trình truyền dữ liệu giữa 2 máy tính(giống như chat) qua cổng LPT bằng VB6.0 thì phải làm như thế nào? Mình mới học nên không hiểu rõ lắm mình cũng ko biết là cần những thư viện nào, các lệnh nhận dl, xuất dl thì dùng ra sao? Có tài liệu nào nói về vấn đề này thì giới thiệu cho mình với. Mình cảm ơn rất rất là nhiều!

                  Comment


                  • #10
                    ... biết tí xíu nè !

                    Trả lời hbaocr : cổng máy in của mainboard máy tính bây giờ mặc định là ECP không hà ( Pentium 4 ),bạn không cần quan tâm đến Mode nữa, các Mode cũ kia chỉ mang ý nghĩa lịch sử quá trình phát triển thôi muốn SET thì vào BIOS SETUP mà SET, còn xem Mode ở Windows thì vào System Properties / Hardware /Device Manager / Ports , sử dụng xuất nhập hai chiều cái cần quan tâm là mạch điện bên ngoài , tức là cần phài có thêm các IC chuyên dùng nữa , ví dụ như con 74LS374 có chân 11 điểu khiển việc xuất dữ liệu ra (chỉ xuất khi có 1 xung clock ) ....
                    Địa chỉ là "888" hoặc "378h" ( số Dec hoặc số Hex ) vì xuất nhập hai chiều nên dù xuất hay nhập thì vẫn điạ chỉ là 378h chứ không có + gì hết
                    378h + 1 = 379h hay 378h + 2 = 37Ah là địa chỉ thanh ghi
                    378h,379h,37Ah là những địa chỉ dùng cho máy tính để bàn
                    278h,279h,27Ah cho máy tính xách tay
                    Trả lời lulong C++.net hay Vb.net hay C# hay Vb6.0 gì khi khái báo Dll rồi dùng lệnh giống nhau hết , tài liệu thiếu gì nhưng tiếng việt thì không có
                    Trả lời lan_huong hiện nay người ta chỉ sử dụng 1 trong 2 loại Dll này thôi : IO.DLL và INPOU32.DLL , search 2 cái tên đó sẽ ra 1 đống tài liệu

                    Cách sử dụng :

                    Đối với IO.DLL
                    Public Declare Sub PortOut Lib "io.dll" (ByVal Port As Integer, ByVal Value As Byte)
                    Public Declare Function PortIn Lib "io.dll" (ByVal Port As Integer) As Byte

                    Đối với INPOUT32.DLL
                    Public Declare Function Inp Lib "inpout32.dll" _
                    Alias "Inp32" (ByVal PortAddress As Integer) As Integer
                    Public Declare Sub Out Lib "inpout32.dll" _
                    Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
                    biết có nhiêu đó thôi
                    Đang thất nghiệp 0988-010-486

                    Comment


                    • #11
                      Làm sao mô phỏng nó trên máy vi tính bây giờ anh

                      em được biết là có phần mềm mô phỏng được giao tiếp cổng USB nhưng chưa nghe ai nói về mô phỏng giao thiếp song song (LPT) trên máy vi tính hết. AI biết xin chỉ em với. Em rất muốn biết. Cám ơn anh nhiều.
                      Huỳnh Lê Phước Sơn.

                      Comment


                      • #12
                        Mình đang lập trình bằng Turbo C++ (cài trên XP SP2) để truyền dữ liêu qua cổng song song (SPP). Mình thử một chương trình đơn giản như sau :

                        #include"conio.h"
                        #include"dos.h"

                        #define PORT 0x378

                        void main()
                        {
                        while(!kbhit())
                        {
                        outportb(PORT, 0xFF); // den sang
                        delay(1000);
                        outportb(PORT, 0x00); //den tat
                        delay(1000);
                        }
                        }


                        Như vậy khi chạy chương trình đèn sẽ sáng tối liên tục (1s). Nhưng mình làm mãi mà nó chẳnng chạy j cả, mặc dù đã thay đổi địa chỉ cổng từ 0x378, 0x3BC, 0x278 mà cũng ko đc. Mạch bên ngoai của mình đơn giản chỉ có mấy con led và trở hạn dòng thui :

                        pin 2 ------R=470-----------GND
                        pin 3 ------R=470-----------GND
                        pin 4 ------R=470-----------GND
                        pin 5 ------R=470-----------GND
                        pin 6 ------R=470-----------GND
                        pin 7 ------R=470-----------GND
                        pin 8 ------R=470-----------GND
                        pin 9 ------R=470-----------GND
                        pin 18->25 đều nối với GND.

                        Vậy mà nó vẫn cứ không chạy đc như ý mình! Các bác có kinh nghiệm giúp e với !!
                        |

                        Comment


                        • #13
                          hay qua , cảm ơn NHB, mình muốn hỏi nếu mình ko dùng PIC mà dùng AVR thì sơ đồ nguyên lý sẽ thế nào , có khác j ko??? nếu khác thì Bắc có thể post cho mình một mạch được ko??
                          thanks
                          Last edited by kinhaxac; 07-07-2008, 13:36.

                          Comment


                          • #14
                            cho em hỏi các chú các bác về vấn đề viualbasic đề tài là (tạo máy phát điện sóng sử dụng DAC0808 và giao tiếp cổng LPT) và cho biết và vẽ dao diện vb và đổ chương trình làm sao
                            nếu được gởi qua địa chỉ này nhé hanhpro85@yahoo.com hay nguyenthingocanh85@gmail.com
                            cảm on cac ban rất nhiều nếu đươc thì xin hậu tạ lại

                            Comment


                            • #15
                              Nguyên văn bởi nguago Xem bài viết
                              Mình đang lập trình bằng Turbo C++ (cài trên XP SP2) để truyền dữ liêu qua cổng song song (SPP). Mình thử một chương trình đơn giản như sau :
                              ...
                              Như vậy khi chạy chương trình đèn sẽ sáng tối liên tục (1s). Nhưng mình làm mãi mà nó chẳnng chạy j cả, mặc dù đã thay đổi địa chỉ cổng từ 0x378, 0x3BC, 0x278 mà cũng ko đc. Mạch bên ngoai của mình đơn giản chỉ có mấy con led và trở hạn dòng thui :

                              pin 2 ------R=470-----------GND
                              pin 3 ------R=470-----------GND
                              pin 4 ------R=470-----------GND
                              pin 5 ------R=470-----------GND
                              pin 6 ------R=470-----------GND
                              pin 7 ------R=470-----------GND
                              pin 8 ------R=470-----------GND
                              pin 9 ------R=470-----------GND
                              pin 18->25 đều nối với GND.

                              Vậy mà nó vẫn cứ không chạy đc như ý mình! Các bác có kinh nghiệm giúp e với !!
                              Tất cả các thiết lập cho cổng LPT đều không được cho phép trên WinXP ,Win2k, WinMe... ( chỉ có từ Win 98 trở về trước ) nhưng nếu muốn chỉ có thể sử dụng thông qua 2 DLL nói trên.

                              Bạn hãy thử :Cũng với phần cứng như trên bạn chạy chương trình này (port378.exe) trên Win98 , bạn sẽ thấy nó chớp các led, rồi thử chạy chương trình trên WinXp thì thấy không cho ra cái gì cả .

                              Bạn không cần phải cài Win98, chỉ cần dùng diã HirenBoot để chạy Win98 trên diã.
                              Vấn đề của bạn chắc giống như vậy đó . !.(^_^).!
                              Attached Files
                              Đang thất nghiệp 0988-010-486

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X