ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 14 [การส่งค่าออกเอาต์พุตพอร์ตของพอร์ตขนานเบื้องต้น]  (อ่าน 4380 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
เครื่องคอมพิวเตอร์ชนิดตั้งโต๊ะโดยส่วนใหญ่ยังมีพอร์ตเครื่องพิมพ์ที่เป็นชนิดพอร์ตขนาน (LPT) ให้ใช้งานได้อยู่ เราสามารถออกแบบและเขียนโปรแกรมเพื่อใช้งานพอร์ตขนานนี้ในงานควบคุมทางด้านอิเล็กทรอนิกส์อุตสาหกรรมได้ โดยพอร์ตขนานนี้จะมีพอร์ตย่อยให้ใช้งาน 3 พอร์ตคือ
  -Data port ทำงานเป็นเอาต์พุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x378
  -Status port ทำงานเป็นอินพุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x379
  -Control port ทำงานเป็นเอาตุพุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x37A
แต่ละพอร์จะมีขนาด 8 บิต เพียงแต่ขาที่มีให้ใช้งานได้จริงของ Status port และ Control Port จะมีไม่ครบ 8 บิตดังรูป


การเรียนรู้ในครั้งนี้เป็นการเรียนรู้เบื้องต้นของการส่งค่าออกทาง Data พอร์ตซึ่งทำหน้าที่เป็นเอาต์พุตพอร์ตมีขั้นตอนการเรียนรู้ดังนี้

1. วงจรเชื่อมต่อเพื่อใช้งานพอร์ต (สามารถต่อโดยใช้แผ่นปริ้นเอนกประสงค์)


2. สร้างโปรเจคใหม่พร้อมวาง Label ทั้งหมด 6 ตัวพร้อมแก้คุณสมบัติเพื่อให้ใด้ดังรูป


3. ดาวน์โหลดไดร์ฟเวอร์เพื่อติดต่อพอร์ตขนาน สามารถค้นหาด้วยคำว่า inpout32.dll หรือเข้าเวปไซต์โดยตรงได้ที่
http://www.highrez.co.uk/downloads/inpout32/


4. แตกไฟล์แล้วคัดลอกไฟล์ DLL ในกรณีที่เครื่องตั้งโต๊ะที่ใช้ทดลองติดตั้งวินโดว์ 32bit ให้ใช้ไฟล์ inpout32.dll แต่ถ้าเป็น 64bit ให้ใช้ไฟล์ inpoutx64.dll ซึ่งอยู่ในโฟลเดอร์ x64


5. นำไปวางในโฟลเดอร์ bin/Debug ซึ่งเป็นโฟลเดอร์เก็บไฟล์ EXE ของโปรแกรมที่สร้างขึ้น


6. เพิ่มไฟล์คลาสเพื่อเก็บโค้ดสำหรับติดต่อพอร์ตโดยดำเนินการดังนี้
   -คลิกขวาที่ชื่อโปรเจคงาน
   -คลิก Add
   -คลิก Class


7. ตั้งใช้ไฟล์คลาสเป็น PortAccess.cs


8. เขียนโค้ดในไฟล์คลาสที่ปรากฎขึ้น


โค้ดส่วนแรกที่แทรก
โค๊ด: [Select]
using System.Runtime.InteropServices;

โค้ดส่วนสองที่เขียนในคลาส
โค๊ด: [Select]
        [DllImport("Inpout32.dll")]
        public static extern short Inp32(int address);
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void Output(int adress, int value);

9. วางคอนโทรล Timer ลงใน Form และกำหนดค่าใน Properties ดังนี้
   -Enabled-->True   เพื่อให้ไทเมอร์ทำงานทันทีเมื่อรันโปรแกรม
   -Interval--->100 กำหนดช่วงเวลาการกระตุ้นเป็น 100 มิลลิวินาที (1/10 วินาที)


10. ดับเบิลคลิกที่ตัว Timer แล้วเขียนโค้ด

โค้ดโปรแกรมส่วนประกาศตัวแปร
โค๊ด: [Select]
        Byte value = 0;

โค้ดโปรแกรมส่วนส่งค่าออกพอร์ตและแสดงค่าหน้าจอ
โค๊ด: [Select]
            try
            {
                if (value < 255)
                {
                    label1.Text = Convert.ToString(value, 10).PadLeft(3, '0');
                    label2.Text = Convert.ToString(value, 16).PadLeft(2, '0').ToUpper();
                    label3.Text = Convert.ToString(value, 2).PadLeft(8, '0');
                    PortAccess.Output(0x378, value);
                    value++;
                }
                else
                    value = 0;
            }
            catch (System.DllNotFoundException)
            {
                timer1.Enabled = false;
                MessageBox.Show("inpout32.dll Not Found !!!", "Dll Error");
                System.Environment.Exit(-1);
            }


11. คลิกที่ Form ดับเบิลคลิกที่เหตุการกระตุ้นเป็น FormClosing เพื่อเขียนโค้ดให้ทำงานเมื่อโปรแกรมกำลังจะปิด


12. โค้ดที่ให้ทำเมื่อกำลังจะปิดโปรแกรมคือให้ส่งค่า 0 ออกพอร์ตเพื่อทำการส่งให้ LED ทุกตัวดับ

โค้ดโปรแกรมส่วนนี้
โค๊ด: [Select]
PortAccess.Output(0x378, 0);

13. คัดลอกไฟล์ EXE พร้อมกับไฟล์ DLL ไปรันที่เครื่องตั้งโต๊ะที่มีการต่อวงจรเชื่อมต่อไว้


<a href="https://www.youtube.com/v/KiyxwszAC_U" target="_blank" class="new_win">https://www.youtube.com/v/KiyxwszAC_U</a>
« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 02, 2020, 08:36:36 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์