Search This Blog

Tuesday, April 8, 2008

Parallel Port as IO

ဒစ်ဂျစ်တယ် device တွေကိုထိန်းဖို့အတွက်၊ ရိုးရှင်းတဲ့ ပရောဂျက်တွေအတွက် I/O တွေအနေနဲ့ ကွန်ပျူတာရဲ့ Parallel Port ကို အလွယ်တကူ သုံးလို့ရပါတယ်။ တချို့ စစ်စတမ် တွေမှာလဲ Industry PC တွေကိုသုံးပြီး Parallel Port နဲ့ အယ်စီဒီ မော်ဂျူး လေးတွေကို ထိန်းတာမျိုးလဲ တွေ့ဖူးပါတယ်။ တကယ်တော့ Parallel Port မှာ I/O အများကြီးပါတဲ့ အတွက် Relay တွေ၊ Transistor တွေနဲ့ တွဲ သုံးပြီး မော်တာတွေ၊ မီးသီးတွေ စသည်ဖြင့် တော်တော်များများ ထိန်းလို့ရပါတယ်။ ကျွန်တော်တော့ Parallel Port တစ်ခုထဲကို သုံးပြီး သူငယ်ချင်းတစ်ယောက်ရဲ့ ကံစမ်းမဲ ဖောက်တဲ့ မီးပြေးဘုတ်ကြီးက မီးသီး ၂၄ လုံးကို Solid State Relays တွေနဲ့ ထိန်းဖူးပါတယ်။ Parallel Port တစ်ခုမှာ အများဆုံး output က ၁၂ ခု ( data ၈ ခု၊ control line ၄ ခု)ထိပဲ ထုတ်လို့ရပေမယ့် demultiplex လုပ်ပြီး လိုအပ်ချက် အလိုက် ပြောင်းသုံးတာပါ။ Input ကတော့ ၅ ခုပါ ပါတယ်။ Data line ၈ ခုကိုပါ (နောက်ပိုင်း parallel port တွေမှာ) input အနေနဲ့ သုံးလို့ရမယ်ဆိုရင်တော့ စုစုပေါင်း input ၁၃ ခုထိ ရနိုင်ပါတယ်။ Parallel Port မှာ Mode ငါးခုရှိပြီး အသေးစိတ်ကို ဒီမှာ ကြည့်နိုင်ပါတယ်။ ကွန်ပျူတာ တစ်ခုမှာ Parallel Port တစ်ခုတော့ ပါတတ်ပါတယ်... အကယ်၍ မပါခဲ့ရင်လဲ Parallel Port ပါတဲ့ ကဒ်တွေကို အလွယ်တကူနဲ့ ဝယ်စိုက်လို့ရပါတယ်။

Hardware

အောက်က ပုံမှာ ကွန်ပျူတာရဲ့ Female 25 DB ခေါင်းတစ်ခုရဲ့ ပုံကို ပြထားပါတယ်။
Parallel Port တစ်ခုမှာ ရှိတဲ့ ဝါယာလိုင်းတွေကို
၁။ Data လိုင်းများ
၂။ Control လိုင်းများ
၃။ Status လိုင်းများ
ဆိုပြီး သုံးမျိုးခွဲခြားနိုင်ပါတယ်။ Data လိုင်းတွေကို Data register က ထိန်းချုပ်နိုင်၊ ဖော်ပြနိုင် ပြီးတော့ .... Control လိုင်းတွေကို Control register က ထိန်းချုပ်ပါတယ်။ Status လိုင်းတွေ မှာ ရှိတဲ့ တန်းဖိုးတွေကိုတော့ Status register မှာ ဖတ်ရှုနိုင်ပါတယ်။ သူတို့ရဲ့ ဆက်သွယ်မှုကို အောက်ကပုံမှာ ကြည့်နိုင်ပါတယ်။
Control lines တွေကို output အနေနဲ့ သုံးလို့ရပြီး၊ Status lines တွေကိုတော့ input အနေနဲ့သုံးလို့ရပါတယ်။ Data lines တွေကတော့ အဝင်၊ အထွက် နှစ်မျိုးလုံးသုံးလို့ရပါတယ်။ Data lines ကို အဝင်အနေနဲ့ သုံးချင်ရင်တော့ Bidirectional data transfer ကို ပထမဦးဆုံး enable လုပ်ဖို့လိုပါတယ်။ အဲဒီလိုလုပ်ဖို့ အတွက် Control register ထဲက bit 5 "Bidirectional" ကို set လုပ်ရမှာပါ။ အဲဒါကို Control register ထဲမှာ ၃၂ သွားရေးခြင်းအားဖြင့် set လုပ်နိုင်ပါတယ်။ ပင်တစ်ခုချင်းရဲ့ဆက်သွယ်မှုကိုတော့ အောက်က ဇယားမှာကြည့်နိုင်ပါတယ်။

----------------------------------------------------------
|Pin No |Signal Name |Direction |Register -bit |Inverted |
----------------------------------------------------------
| 1.... | nStrobe....| Out......| Control-0....| Yes ....|
| 2.... | Data0......| In/Out...| Data-0.......| No......|
| 3.... | Data1......| In/Out...| Data-1.......| No......|
| 4.... | Data2......| In/Out...| Data-2.......| No......|
| 5.... | Data3......| In/Out...| Data-3.......| No......|
| 6.... | Data4......| In/Out...| Data-4.......| No......|
| 7.... | Data5......| In/Out...| Data-5.......| No......|
| 8.... | Data6......| In/Out...| Data-6.......| No......|
| 9.... | Data7......| In/Out...| Data-7.......| No......|
| 10... | nAck.......| In.......| Status-6.....| No......|
| 11... | Busy.......| In.......| Status-7.....| Yes.....|
| 12... | Paper-Out..| In.......| Status-5.....| No......|
| 13... | Select.....| In.......| Status-4.....| No......|
| 14... | Linefeed...| Out......| Control-1....| Yes.....|
| 15... | nError.....| In.......| Status-3.....| No......|
| 16... | nInitialize| Out......| Control-2....| No......|
| 17... | nSelect-Printer| Out..| Control-3....| Yes.....|
| 18-25 | Ground.....|-.........| - ...........| - ......|
----------------------------------------------------------
အိုင်ဘီအမ် ပီစီ တွေမှာ data register၊ control register၊ status register တွေ ဟာ တိကျတဲ့ IO address ရှိပါတယ်။ သူတို့ရှိတဲ့ နေရာတွေကို အောက်ကဇယားမှာ ကြည့်နိုင်ပါတယ်။

---------------------------------------------------
| Register........| LPT1 | LPT2 |
---------------------------------------------------
| Data Register...| 0x378| 0x278|
| Status Register.| 0x379| 0x279| (baseaddress + 1)
| Control Register| 0x37A| 0x27A| (baseaddress + 2)
---------------------------------------------------
ဥပမာ IO address 0x378 မှာ သုည ကိုသွားရေးလိုက်ရင် LPT1 ပထမ parallel port ရဲ့ ဒေတာ ရီဂျစ်စတာထဲကို သုည ဝင်သွားမှာဖြစ်ပြီး သူနဲ့ဆက်ထားတဲ့ DB25 ခေါင်းရဲ့ Pin No ၂ ကနေ ၉ အထိ သုည ဗို့ထွက်သွားမှာပါ။ အဲဒီလို ပဲ IO address 0x378 မှာ ပဲ တစ်ရှစ်လုံး ( 0xFF ) သွားရေးလိုက်ရင် ဒေတာရီဂျစ်စတာရဲ့ Data 0 ကနေ Data 7 ထိ တစ်တွေဝင်သွားပြီး Pin ၂ ကနေ ၉ အထိမှာ +5V ထွက်လာမှာပါ။
ထိုနည်း၄င်းပဲ IO address 0x37A မှာ သုည ကိုရေးလိုက်ရင် ကွန်ထရိုး ရီဂျစ်စတာထဲကို သုည ဝင်သွားပြီး၊ သူနဲ့ဆက်ထားတဲ့ Pin 1, 14, 16, 17 တို့မှာ သက်ဆိုင်ရာတန်ဖိုးတွေထွက်လာမှာပါ။ Pin 1, 14, 17 တို့ဟာ ပြောင်းပြန်ဖြစ်တဲ့ အတွက် 0 ဆိုရင် +5V ထွက်လာမှာဖြစ်ပြီး၊ Pin 16 ကတော့ အတည့် ဖြစ်တဲ့ အတွက် 0 ဟာ 0V ပဲထွက်လာမှာ ဖြစ်ပါတယ်။
IO address 0x379 မှာရှိတဲ့ စတေတပ် ရီဂျစ်စတာ ကတော့ input ဖြစ်တဲ့ အတွက် သွားဖတ်ရမှာဖြစ်ပါတယ်။ Pin 10, 11,12, 13, 15 တို့မှာ ရှိတဲ့ Voltage တွေဟာ သူတို့ရဲ့ ရီဂျစ်စတာမှာရှိတဲ့ သက်ဆိုင်ရာ bit တွေမှာ သွားရောက်ထင်ဟပ်နေမှာ ဖြစ်ပါတယ်။ Pin 11 ကတော့ 0V ဆိုရင် 1၊ +5V ဆိုရင် 0 ဆိုပြီး ပြောင်းပြန် ဝင်နေမှာ ဖြစ်ပြီး၊ ကျန်တာတွေကတော့ အတည့် ပေါ်နေမှာ ဖြစ်ပါတယ်။

Circuit Connection

ကွန်ပျူတာထဲမှာ ရှိတဲ့ Hardware အကြောင်းပြီးတဲ့ အခါ Parallel Port နဲ့ ဆက်သွယ်ဖို့ ဝါယာဆက်သွယ်မှု အကြောင်း ဆက်ပြောပါမယ်။ Male 25 DB ခေါင်းပါတဲ့ ကြိုးတစ်ခုကို ဝယ်ပြီး ကွန်ပျူတာဘက်ကိုဆက်နိုင်ပြီး ကျန်တဲ့ဘက်က ဝါယာတွေကိုတော့ input, output တွေနဲ့ဆက်နိုင်ပါတယ်။
နမူနာ အနေနဲ့ ဒေတာ ပင် ၂ ကနေ ၉ အထိရယ်၊ ကွန်ထရိုးပင် ၁၊ ၁၄၊ ၁၆၊ ၁၇ တို့ကို output အနေနဲ့သုံးကြည့်မှာဖြစ်ပြီး၊ status pin ၁၀၊ ၁၁၊ ၁၂၊ ၁၃၊ ၁၅ တို့ကို input အနေနဲ့ သုံးကြည့်မှာဖြစ်ပါတယ်။ ဒါကြောင့် output တွေကို အောက်ကပုံအတိုင်း LED မီးလုံးလေးတွေနဲ့ ဆက်ပြီး input တွေကို ခလုတ်လေးတွေနဲ့ ဆက်ကြည့်မှာပါ။
ဒီအောက်က ပုံကတော့ ဒေတာ ငုတ်တွေကို အဝင်နေနဲ့ရော၊ အထွက်အနေနဲ့ရော သုံးထားတာပါ။ ကျွန်တော်တို့ နမူနာမှာတော့ ရှင်းလင်းအောင် ဒေတာ ကို အထွက် အနေနဲ့ပဲ သုံးမှာပါ။
ဘယ် ပင်က ဘယ်ဝါယာလဲ ဆိုတာ မသိခဲ့ရင်တော့ မီတာကို အသုံးပြုပြီး တိုင်းကြည့်နိုင်ပါတယ်။ တချို့ကြိုးတွေ ကတော့ အရောင်ခွဲမထားဘူး။ ကျွန်တော့် ကြိုးတုန်းကတော့
၁။ အနက်
၂။ နက်ဖြူကြား
၃။ အညို
၄။ ညိုဖြူကြား
၅။ အနီ
၆။ နီဖြူကြား
၇။ နီနက်ကြား
၈။ လိမ်မော်
၉။ လိမ်မော်၊ဖြူကြား
၁၀။ လိမ်မော်၊နက်ကြား
၁၁။ ပန်းရောင်
၁၂။ ပန်းနက်ကြား
၁၃။ အဝါ
၁၄။ ဝါနက်ကြား
၁၅။ အစိမ်း
၁၆။ စိမ်းဖြူကြား
၁၇။ စိမ်းနက်ကြား
၁၈။ အစိမ်းနု
၁၉။ အပြာ
၂၀။ ပြာဖြူကြား
၂၁။ ခရမ်း
၂၂။ ရမ်းဖြူကြား
၂၃။ မီးခိုး
၂၄။ ခိုးနက်ကြား
၂၅။ အဖြူ
လို့တွေ့ရှိရပါတယ်။ အထက်ပါ အတိုင်း မီးလုံးများ၊ ခလုပ်များတပ်ဆင်ပြီးတဲ့အခါ သူတို့ကို ထိန်းချုပ်ဖို့၊ ဖတ်ရှုဖို့ အတွက် ပရိုဂရမ် ရေးဖို့လိုပါတယ်။

Programming

အရင် ဝင်းဒိုး ၉၈ တို့၊ ဝင်းဒိုး Me တို့မှာ တုန်းက Turbo C တို့၊ Borland C တို့မှာ ပါတဲ့ "InportB", "OutportB" တို့၊ VC++ မှာ ပါတဲ့ "_inp" တို့ "_outp" တို့ကို သုံးပြီး Port ကို တိုက်ရိုက်ထိန်းနိုင်ပါတယ်။ သူတို့ကို "conio.h" ထဲမှာကြေငြာထားတာပါ။ ဒါပေမယ့် ဝင်းဒိုး NT/2000/XP တို့မှာ တော့ တိုက်ရိုက်ထိန်းလို့ မရတဲ့အတွက် "inpout32.dll" ဆိုတဲ့ လိုက်ဘရီဖိုင်ကို ထည့်ပြီးမှ သုံးမှာဖြစ်ပါတယ်။ သူ့ကို http://logix4u.net/inpout32_source_and_bins.zip မှာဒေါင်းလုပ် လုပ်ပြီးယူနိုင်ပါတယ်။
အခု ကျွန်တော် တို့ ဝင်းဒိုး XP မှာ သုံးမှာဖြစ်ပါတယ်။ ပြီးရင် "inpout32.dll" ဆိုတဲ့ ဖိုင်ကို "C:/windows/system32/" ထဲမှာသွားထားပါ။ ပြီးရင်Visual Basic 2005 ကနေ သုံးပြီး ထိန်းချုပ်မှာ ဖြစ်ပါတယ်။ Visual Basic 6 အတွက်လည်း အတူတူပါပဲ အဲဒီအတိုင်း သုံးလို့ရပါတယ်။ အပေါ်လင့်က ဆိုရင် နမူနာ test application တွေလည်း ပါပါတယ်။ ပထမဆုံး အနေနဲ့ Visual Basic 2005 ထဲမှာ Project အသစ်တစ်ခုဖန်တီးပါမယ်။ File Menu ကနေ New Project... ကိုနှိပ်ပါ။ ပြီးရင် Windows Application ကိုရွေး၊ နာမည်ပေး ပြီးရင် အိုကေ ကိုနှိပ်ပါ။ ပြီးရင် Tools bar ထဲက Add New Item ကနေ Add Module ... ကိုနှိပ်ပြီး Module တစ်ခုထည့်ပါ။ ပြီးရင် Module ထဲမှာ အောက်က နှစ်ကြောင်းကို ကြေငြာပေးမှာပါ။

'Inp and Out declarations for port I/O using inpout32.dll.
Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Short) As Short
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Short, ByVal Value As Short)
ဒီပုံထဲကလိုပါ။
ပြီးရင် ဖောင် ပေါ်မှာ ခလုပ် နှစ်ခု၊ တက်စ်ဘောက်စ် နှစ်ခုထည့်ပါမယ်... ပုံ အကြီးကြည့်ဖို့ ပုံပေါ်မှာ ကလစ်နှိပ်ပြီးကြည့်နိုင်ပါတယ်။
ပထမ ခလုတ် ကိုနှိပ်ရင် သူ့ဘေး မှာထည့်ထားတဲ့ hexa တန်ဖိုးကို ဒေတာ ငုတ်တွေမှာ ထွက်သွားအောင် အခုလိုရေးနိုင်ပါတယ်။

Out(&H378, Val("&H" & txtData.Text))
Out function ရဲ့ ပထမ argument က သူသွားပြီးရေးရမယ့် IO address ပါ။ ဒေတာ ရီဂျစ်စတာမှာ ရေးချင်လို့ 0x378 ကိုသုံးပါတယ်။ ဒုတိယ argument က ရေးရမယ့် တန်ဖိုးပါ။ TextBox ထဲကတန်ဖိုးကို hexa တန်ဖိုး အနေနဲ့ ဖတ်ဖို့ "&H" ပေါင်းထည့်ပြီး တန်ဖိုးပြန်ပြောင်းထားတာပါ။
ဒုတိယ ခလုတ်ကိုနှိပ်ရင် စတေးတပ် ငုတ်တွေမှာရှိတဲ့ တန်ဖိုးတွေကိုဖတ်ပြီး သူ့ဘေးက TextBox ထဲမှာ ဖော်ပြပေးမှာပါ။ IO address 0x379 မှာရှိတဲ့ စတေးတပ် ရီဂျစ်စတာကို ဖတ်ပြီး hexa တန်ဖိုးနဲ့ ဖော်ပြဖို့ အခုလိုရေးနိုင်ပါတယ်။

txtStatus.Text = Hex(Inp(&H379))
Inp function ရဲ့ argument က သူသွားပြီးဖတ်ရမယ့် IO address ပါ။ ရတဲ့ တန်ဖိုးကို Hex function နဲ့ hexa string ပြောင်းပြီး Textbox မှာသွားထည့်ပါတယ်။
အဲဒါဆိုရင် Program နဲ့ စမ်းသပ်လို့ရပါပြီ။
Reference:
http://logix4u.net/Legacy_Ports/Parallel_Port/A_tutorial_on_Parallel_port_Interfacing.html

No comments:

Post a Comment