برای ارسال و دریافت اطلاعات از پورت موازی LPT در زبان برنامه نویسی VB8 نیازمند یک فایل DLL کمکی هستیم که نمونه مورد استفاده در بحث جاری را میتوانید با
این لینک دانلود کنید. برای صحیح کار کردن برنامه در زمان طراحی و دیباگ معمولاً باید فایل مذکور در پوشه System32 کپی شده باشد ولی در نسخه نهایی برنامه نیاز به هیچ عمل خاصی ندارد و موجود بودن فایل مذکور در کنار فایل اصلی برنامه کافیست.
این DLL شامل دو API است، که برای ارتباط با پورت های موازی از جمله LPT مورد نیاز است.
برای تعریف و به کار گیری این API ها در برنامه VB.Net باید دو خط زیر به اول ماژول کدنویسی اضافه شوند.
(VB.Net برای عمل فوق دو راه دارد که کد هر دو در زیر آمده و با وجود تفاوت ظاهری، هر دو کد دقیقاً یک عمل را انجام میدهند.)
VB.Net2005/2008: (VB8/9)
Private Declare Sub Out Lib
"inpout32.dll" Alias "Out32" (ByVal
PortAddress As Short, ByVal
Data As Short)
Private Declare Function Inp
Lib "inpout32.dll" Alias "Inp32" (ByVal
PortAddress As Short) As Short
یا
<System.Runtime.InteropServices.DllImport("inpout32.dll", EntryPoint:="Out32")> _
Private Shared Sub Out(ByVal PortAddress As Short, ByVal Data As Short)
End Sub
<System.Runtime.InteropServices.DllImport("inpout32.dll", EntryPoint:="Inp32")> _
Private Shared Function Inp(ByVal PortAddress As Short) As Short
End Function
C#.Net2005/2009: (C#2/3)
[System.Runtime.InteropServices.DllImport("inpout32.dll", EntryPoint="Out32")]
private extern static void Out(short PortAddress, short Data);
[System.Runtime.InteropServices.DllImport( "inpout32.dll", EntryPoint="Inp32")]
private extern static short Inp(short PortAddress);
بعد از اضافه کردن دو خط فوق (و البته کپی DLL) شما قادر خواهید بود با دستوری مثل
Out(address, data) عدد data را به پورت
با آدرس address ارسال کنید و نیز میتوانید عدد باز گردانده شده از
Inp(address) را بخوانید که حاوی داده موجود
در پورت با آدرس address است.
(جالب است که دستورات Out و Inp
جزء کلمات رزو شده بیسیک بودند، ولی مایکروسافت این دو کلمه کلیدی را از نسخه ویژوال
حذف کرد و حال با کمک DLL مذکور و این دو خط کد، میتوان
آن دو دستور را مجدداً بازسازی کرد و برگرداند. گرچه مایکروسافت دو دستور فوق را حذف
کرد ولی به نظر میرسد جامعه برنامه نویسان هنوز فراموش نکرده اند و سعی در
بازگرداندن آنها دارند!)
در ارتباط نرم افزارها با پورتهای موازی معمولاً از روش فلاگی و بیتی استفاده
میشود، واضح است که هر عددی قابل تبدیل به مبنای دو و باینری میباشد، در روش فوق هر
تک بیت صفرویک عدد، وضعیت یک تک پین را مشخص میکند، چه این تک پین ورودی باشد و چه
خروجی.
توجه در تمام مثالهای زیر فرض شده که i یک متغییر از نوع
Short است که حاوی عدد خوانده شده از
پورت است.
تبدیلات باینری اعداد خارج از حوصله بحث جاری است، ولی دوستان میتوانند از ماشین
حساب داخلی ویندوز و قرار دادن آن در حالت پیشرفته کمک بگیرند (View->Scientific) و
نیز در مباحثی از این نوع بشدت از اعداد مبنای شانزده هم استفاده میشوند، چون این
اعداد هم کوتاه هستند و هم بدون محاسبه و به طور ذهنی و سریع قابل تبدیل شدن به
باینری هستند.
مثلاً در برنامه ای عدد 114 را به یک پورت ارسال کنیم، (دستور:
Out(portaddress, 114))
چون باینری عدد مذکور 01110010 میشود این بدان معنی است که: (مبنای 16 آن هم x72
میشود)
پین 0 ام درگاه مذکور 0 میشود.
پین 1 ام درگاه مذکور 1 میشود.
پین 2 ام درگاه مذکور 0 میشود.
پین 3 ام درگاه مذکور 0 میشود.
پین 4 ام درگاه مذکور 1 میشود.
پین 5 ام درگاه مذکور 1 میشود.
پین 6 ام درگاه مذکور 1 میشود.
پین 7 ام درگاه مذکور 0 میشود.
همین مسئله در خواندن اطلاعات از درگاه هم صادق است و اگر از درگاهی اطلاعات را
بخوانیم و مثلاً حاصل همان عدد 114 شود (x72 در مبنای 16) چون باینری عدد مذکور
01110010 میشود این بدان معناست که: (دستور
i =
Inp(portaddress))
پین 0 ام درگاه مذکور 0 بوده.
پین 1 ام درگاه مذکور 1 بوده.
پین 2 ام درگاه مذکور 0 بوده.
پین 3 ام درگاه مذکور 0 بوده.
پین 4 ام درگاه مذکور 1 بوده.
پین 5 ام درگاه مذکور 1 بوده.
پین 6 ام درگاه مذکور 1 بوده.
پین 7 ام درگاه مذکور 0 بوده.
متوجه شدن مطلب فوق بسیار ساده و در عین حال حیاتی است و پیش نیاز مباحث بعدی است.
خوب حال اصلاً صفرویک از نظر الکترونیکی یعنی چه؟ وقتی میگوییم که خروجی 1 است این
یعنی چه؟
از نظر خالص ریاضی و الکترونیک حرفه ای و با توجه به استاندارد TTL (درگاه موازی
رایانه های شخصی طبق این استاندارد کار میکنند)، یک منطقی یعنی ولتاژی بین 2+ تا 5+
است و صفر به معنی ولتاژی بین 0 تا 8/0+ ولت است.
ولی به بیان آمیانه یک به معنی قطب مثبت منبع تغذیه است و صفر به معنی قطب منفی.
در نتیجه اگر شما یک سر لامپ مناسبی را به قطب مثبت منبع تغذیه و سر دیگرش را به
خروجی یک پین از پورتی وصل کرده باشید، طبیعتاً برای روشن شدن لامپ مذکور باید
خروجی صفر شود، و وقتی خروجی یک باشد لامپ خاموش میشود (و برعکس!) (این متن را
مجدداً بخوانید و مطمئن شوید دلیل جملات را درک کرده اید!)
برای کنترل تک تک پین های یک پورت باید از دستورات AND و OR استفاده کرد.
فعلاً یادآور میشوم که:
AND صفر و صفر میشود صفر
AND صفر و یک میشود صفر
AND یک و صفر میشود صفر
AND یک و یک میشود یک
OR صفر و صفر میشود صفر
OR صفر و یک میشود یک
OR یک و صفر میشود یک
OR یک و یک میشود یک
و اگردو عدد بزرگ با هم AND یا OR شوند تک تک بیتهای نظیر (بیت اول با اول، بیت دوم
با دوم ...) با هم AND یا OR میشوند.
مثلاً:
01100111 (103)
10110010 (178) AND
-------------
00100010 (34)
شاید ده دهی آن بی معنا باشد (103 با 178 AND شود حاصل 34 میشود ؟؟؟!!!) ولی باینری
آن کاملاً بامعنی و مفید است.
مثلاً من عدد 114 را از یک پورت خواندم، حالا چگونه متوجه شوم که مثلاً پین پنجم چه
بوده؟ آیا باید تبدیل به باینری کنیم و ...؟؟؟ (دقت کنید که اندیس بیت ها از صفر
شروع میشود.)
نه خیلی راحت است، عدد به ذات باینری هستند پس تبدیل اصولاً معنا ندارد، در رایانه
در اصل 01110010 وجود دارد و این ما هستیم که به آن میگوییم 114 ، پس اصلاً باینری
است و تبدیل سفسته ای بیش نیست! درس فلسفه مان به همین مقدار کافیست!
در مورد سوال بالا من فقط میخواهم وضعیت پنجمین بیت عدد 114 را بدانم و با بقیه بیت
ها کاری ندارم، برای متوجه شدن وضعیت بیت پنجم می آیم و عدد مورد نظر (در اینجا 114
که مثلاً از پورت خوانده شده!) را با عدد 32 AND میکنم!!!! 32 از کجا آمد؟؟؟؟ عدد
32 برابر 2 به توان 5 است و باینری آن 00100000 میشود و چون فقط بیت پنجم عدد 32 یک
است این عدد با هر عددی AND شود بدون توجه به آنکه بیتهای دیگر آن عدد چه باشد AND
تک تک آن بیتها محکوم به صفر است و حاصل عمل AND صرفاً وابسته به بیت پنجم عدد مورد
محاسبه میشود، اگر حاصل این AND صفر باشد یعنی حتماً بیت پنج صفر بود یا یعنی حتماً
پین پنجم صفر بوده و اگر حاصل عددی غیر صفر شود یعنی حتماً بیت پنجم یک بوده یا
یعنی حتماًً ....
(جالب آنکه نتیجه AND های این تیپی یا صفر است یا آن عدد شاخص که در اینجا و در
مثال ما 32 است، ولی در برنامه نویسی به این نکته دقت میکنیم که حاصل یا صفر است یا
غیر صفر، چون این طرز دید راحت تر است!)
حالا عدد 114 را با عدد 32 AND کنید، خواهید دید که حاصل صفر نمیشود (32 میشود!) پس
در نتیجه بیت پنجم یک بوده و در نتیجه پین پنجم پورتی که عدد 114 را از آن خواندیم
یک بوده. (مثلاً دستور:
If (Inp(portaddress)
And 32) > 0
Then)
بیشتر از این به مبحث اعمال بیتی نمی پردازیم چون این مبحث هم خودش بحث های مفصلی
دارد که خارج از حوصله من و شماست!
تمام پورتها شامل یک شماره یا آدرس هستند که با آن قابل شناسایی هستند، این شماره
مثل کدپستی است و موجب میشود تا واحد پردازشگر بداند با کدام پورت باید ارتباط
برقرار کند و در نرم افزار به کمک این شماره ثابت اطلاعات فرستاده یا گرفته میشود،
مثلاً دستور میدهیم، عدد 123 را به پورت 987 ارسال کن که میشود
Out(987, 123)
طبیعتاً برای کار با پورت ها باید شماره آنها را بدانیم و نیز این که هر کدام از
پایه های پورت چندمین پین پورت است (چون در خیلی از موارد محل قرار گیری فیزیکی پین
ها پشت سر هم و به ترتیب نیست!!!)
ضمناً برخی از پورت ها صرفاً ورودی هستند و اطلاعات را از دنیای خارج میتوانند
بخوانند و وارد رایانه کنند و برخی فقط خروجی هستند و فقط یک سری از پورت ها دو
طرفه هستند که در این مورد آخر یا کل پورت ورودی است یا کل پورت خروجی است و نمیشود
که هر پین برای خود جداکار کند. (البته میتوان با شکستن زمان و با همانگی های خاص
بین نرم افزار و سخت افزار طوری شبیه سازی کرد که هر پین در مبحث ورودی-خروجی مجزا
عمل میکند.)
در زبانهای برنامه نویسی مختلف راه های مختلفی برای فرستادن اطلاعات به یک پورت یا
گرفتن اطلاعات از آن وجود دارد و شما به راحتی با تبدیل دستورات بیان شده به زبان مورد نظرتان
میتوانید از مطالب موجود برای هر زبانی استفاده کنید.
خوب حالا پیش نیازها مطرح شد و آماده دریافت اطلاعات اصلی هستیم.
بحث ما به طور خاص سر درگاه LPT در رایانه های شخصی است که نام های دیگری همچون
پورت پرینتر یا درگاه سنترونیکس را هم دارد.
این درگاه معمولا (و در حال حاضر) 25 پایه یا پین دارد. و شامل سه پورت با شماره یا
آدرس متفاوت است. هر پایه شماره فیزیکی ای مخصوص دارد که در روی سوکت به صورت ریز درج شده.
اطلاعات تک تک پایه های کانکتور sub-D25 مربوط به درگاه LPT1 |
شماره پایه کانکتور |
نام |
آدرس پورت |
شماره پین |
ورودی-خروجی |
1 |
STROB |
0x37A |
0 |
I/O |
2 |
D0 |
0x378 |
0 |
OUT |
3 |
D1 |
0x378 |
1 |
OUT |
4 |
D2 |
0x378 |
2 |
OUT |
5 |
D3 |
0x378 |
3 |
OUT |
6 |
D4 |
0x378 |
4 |
OUT |
7 |
D5 |
0x378 |
5 |
OUT |
8 |
D6 |
0x378 |
6 |
OUT |
9 |
D7 |
0x378 |
7 |
OUT |
10 |
ACK |
0x379 |
6 |
INP |
11 |
BUSY |
0x379 |
7 |
INP |
12 |
PE |
0x379 |
5 |
INP |
13 |
SELECT |
0x379 |
4 |
INP |
14 |
AUTO FEED |
0x37A |
1 |
I/O |
15 |
ERROR-NC |
0x379 |
3 |
INP |
16 |
INT |
0x37A |
2 |
I/O |
17 |
SEL IN |
0x37A |
3 |
I/O |
18 الی 25 |
GND |
زمین = صفر ولت مدار |
- پورت 888 = 0x378
همه 8 پین این پورت در دسترس هستند، این پورت صرفاً خروجی است و خروجی های آن
توان ارائه جریان مداوم 2.6mA و نیز پیک
24mA را دارند.
- پورت 889 = 0x379
این پورت پین 0
و 1 و 2 ندارد و نباید در آنها چیزی ریخت یا اطلاعات خوانده شده و این پینها را
معتبر دانست؛ این پورت صرفاً ورودی است و خروجی نمیتواند باشد.
- پورت 890 = 0x37A
این پورت هم پین
4 و و5 و 6 و 7 ندارد و نباید با آنها کارکرد، این پورت هم میتواند ورودی باشد
و هم خروجی، در حالت خروجی توان ارائه جریان 7mA
را دارد.
(در کار با پورت ها همانطور که بیان شد معمولاً از اعداد مبنای 16 استفاده میکنند،
VB هم مثل دیگر زبانها به شما اجازه تایپ راحت اعداد مبنای 16 را میدهد ولی قبل از
اعداد مذکور باید دو کاراکتر
&H حتماً بیایند. مثلاً در هرجایی از
کدهایتان، (اصلاً فرقی ندارد کجا باشد و ربطی به پورت ها داشته باشد یا نه) که عدد
888 را نوشته باشید، نوشتن
&H378 هم همان اثر را دارد چون
378
همان
888 ولی در مبنای 16 است.)
باید توجه داشته باشید که خروجی این پورت ها مثل هر خروجی دیگری یک حد تحملی برای
بارمصرفی دارد که اگر از این حد بیشتر آمپر کشیده شود موجب صدمه دیدن ترانزیستور
موجود در آی.سی کنترل کننده پورت میشود که در آخر و در صورت صدمه دیدن باید آی.سی
مربوطه عوض شود، پس مراقب باشید!
میتوان با ترانزیستور خروجی های مذکور را تقویت کرد و حتی به کمک رله میتوان وسایل
برقی پر مصرف را کنترل و خاموش و روشن کرد.
نکته ای هم که در مورد اغلب خروجی ها صادق است آن است که معمولاً برون ده (قدرت
خروجی) پین ها در سطح صفر منطقی بیشتر از یک منطقی است، یعنی اگر میخواهید یک LED
را با خروجی پورت روشن کنید بهتر است سر منفی LED (کاتد) را به خروجی وصل کنید و با صفر
کردن پین مذکور LED را روشن و با یک کردن آن LED را خاموش کنید، شاید به نظر برعکس
بیاید ولی این روش بسیار رایج تر و ایمن تر است و هیچ ایرادی ندارد، مجدداً دلیلش
را به زبان آمیانه تر میگویم (نه زبان علمی!): «چون خروجی وقتی صفر میدهد، صفر قوی
تری میدهد در حالی که وقتی یک میدهد، یک میدهد ولی یک ضعیفتری میدهد!»
پورت LPT منبع تغذیه و ولتاژی مستقیمی را در اختیار وسیله ای که به آن وصل میشود
قرار نمیدهد و وسیله متصل شده به پورت LPT نمیتواند از رایانه تغذیه کند و باید
خودش برق مصرفی اش را با باتری یا آداپتور یا هر منبع دیگری تهیه کند. (برعکس پورت
USB که برق رایانه را در اختیار وسیله ای که به آن وصل میشود قرار میدهد و وسیله
متصل شده به USB اصولاً اجبار و نیازی به منبع تغذیه خارجی ندارد و میتواند از
موهبت برق رایانه استفاده کند.)
کلاً در الکترونیک وقتی دو مدار با دو منبع تغذیه جدا به هم متصل میشوند باید یکی
از سیم های منبع تغذیه مشترک باشد و معمولاً سیم صفر ولت (یا به بیان آمیانه، قطب
منفی) را مشترک میکنند و در پورت LPT همه پایه های 18 الی 25 به صفر ولت داخلی پاور
رایانه متصل شده اند و باید در مدار متصل شده به پورت LPT منبع تغذیه مدار ما هم به
این پایه ها وصل شوند.
(این یک بحث بسیار بسیار پیش پا افتاده الکترونیک است و رعایت آن ضرورری است ودلیل
آن هم به
مدار بودن مدارات الکتریکی مربوط میشود! و خارج از بحث
ماست.)
در زیر برای روشن شدن مبحث خروج اطلاعات به بررسی چند نمونه اتصال LED به پورت
LPT میپردازیم:
توجه:
X به معنای آن است که صفر یا یک بودن اهمیتی ندارد.
برای گرفتن تصاویر با کیفیت تر روی عکس ها کلیک کنید.
چند مدار نمونه جهت خروجی |
|
این نمونه جزء ساده ترین حالات میباشد.
در این مدار قطب کاتد یا منفی LED به پایه 2 درگاه LPT وصل
شده قطب آند یا مثبت آن به خط تغذیه +5V
خارجی وصل شده، (با ولتاژ بالاتر یا پایین تر یا همیشه LED روشن
است و یا خاموش!) طبیعتاً برای روشن شدن LED مربوطه باید پایه 2
درگاه که همان پین صفرام پورت &H378 است،
"صفر" شود.
در نتیجه:
برای روشن کردن LED باید عدد باینری
B-XXXXXXX0 به پورت &H378 ارسال شود (مثلاً دستور
Out(&H378, 0)) و
برای خاموش کردن LED باید عدد باینری
B-XXXXXXX1 به پورت &H378 ارسال شود. (مثلاً دستور
Out(&H378, 1)) |
|
همانطور که قبلاً بیان شد، در درگاه LPT ولتاژ عرضه نمیشود و شما
نیاز به منبع تغذیه خارجی دارید.
با این وجود در این مدار سعی شده ولتاژ مثببت کافی برای روشن کردن
LED از طریق "یک" کردن چهار پین تآمین شود و نیاز به منبع خارجی برطرف
شود. (سطح تحمل آمپر این ولتاژ صرفاً برای روشن کردن یک LED کافیست)
در نتیجه:
برای روشن کردن LED باید عدد باینری
B-1111XXX0 به پورت &H378
ارسال شود (مثلاً دستور Out(&H378, &HF0))
و
برای خاموش کردن LED باید عدد باینری
B-0000XXX1
یا B-0000XXX0 یا
B-1111XXX1 به پورت &H378
ارسال شود. (مثلاً دستور Out(&H378, 1))
توجه داشته باشید که وجود همه مقاومت ها ضروری است. در کل نبود
مقاومت ها موجب آمپر کشی زیاد و صدمه به واحد خروجی میشود و برای
هر پین هم یک مقاومت جدا لازم است تا تضمینی هم باشد بر اینکه ایراد
در نرم افزار موجب اتصال کوتاه و صدمه به سخت افزار نشود. |
|
این نمونه هم باز اصلاح شده نمونه قبلی است و برای روشن کردن یک
LED نیازی به منبع خارجی ندارد، در این نمونه قطب کاتد LED
مستقیماً به صفر ولت مدار وصل شده و صرفاً با ولتاژ مثبت ناشی از
"یک" شدن چهار پین بالارتبه پورت &H378 روشن
میشود.
در نتیجه:
برای روشن کردن LED باید عدد باینری
B-1111XXXX
به پورت &H378 ارسال شود (مثلاً دستور
Out(&H378, &HF0)) و
برای خاموش کردن LED باید عدد باینری
B-0000XXXX
به پورت &H378 ارسال شود. (مثلاً دستور
Out(&H378, 0))
|
|
این هم یک نمونه کامل تر است که خروجی به وسیله یک ترانزیستور
تقویت شده و برای مصارف بالاتر نیز قابل استفاده است، ترانزیستور
استفاده شده در این مدار دوقطبی تیپ مثبت است، در نتیجه با کاهش
ولتاژ در بیس روشن میشود و این به معنی روشن شدن ترانزیستور با "صفر"
منطقی است.
وجود منبع ولتاژ خارجی با ولتاژ 5 ولت ضروری است.
(شماره و مشخصات ترانزیستورهای پیشنهادی در آخر مقاله ذکر شده)
در نتیجه:
برای روشن کردن LED باید عدد باینری
B-XXXXXXX0
به پورت &H378 ارسال شود (مثلاً دستور Out(&H378,
0)) و
برای خاموش کردن LED باید عدد باینری
B-XXXXXXX1
به پورت &H378 ارسال شود. (مثلاً دستور Out(&H378,
1)) |
|
این هم توسعه پیدا کرده مدار قبلی است که به جای یک LED معمولی یک
رله را روشن میکند و رله قطعه ای الکترونیکی-مکانیکی است که با
روشن شدنش اجازه روشن شدن وسیله ای با ولتاژ و آمپر خیلی بالا را
میدهد، به طور مثال با این مدار شما میتوانید اقدام به کنترل وسایل
برقی پرمصرف با امنیت و ایزولاسیون بالا نمایید.
برای بهتر متوجه شدن جریان بد نیست توضیح مختصری در مورد رله بدهم:
رله شامل یک سیم پیچ است که با ولتاژ کمی آهن ربا میشود و با آهن
ربا شدن آن تکه فلزی که در جلوی سیم پیچ قرار دارد حرکت کرده و
اتصالی را برقرار میکند و در اصل دو تکه آهن به هم وصل میشوند و به
راحتی و اطمینان میتوان به جای هر نوع کلیدی از رله استفاده کرد و
خروجی نهایی رله هیچ تماس الکتریکی با ورودی آن که ورودی سیم پیچ
است ندارد و به اصطلاح الکترونیکی دو طرف مدار کاملاً ایزولاسیون
(ایزوله) شده اند.
ضمناً وجود دیود هرزگرد و ضربه گیری هم برای خنثی سازی جریان
معکوسی که در اثر خود القایی در سیم پیچ رله به وجود می آید ضروری
است.
ونیز وجود منبع ولتاژ خارجی با ولتاژ 5 ولت ضروری است.
(شماره و مشخصات ترانزیستورهای پیشنهادی در آخر مقاله ذکر شده)
در نتیجه:
برای روشن شدن رله باید عدد باینری
B-XXXXXXX0
به پورت &H378 ارسال شود (مثلاً دستور Out(&H378,
0)) و
برای خاموش شدن رله باید عدد باینری
B-XXXXXXX1
به پورت &H378 ارسال شود. (مثلاً دستور Out(&H378,
1)) |
|
آخرین مدار عرضه شده مطلب خاصی ندارد بجز آنکه در مدارات قبلی
ولتاژ منبع تغذیه باید 5 ولت می بود ولی در این مدار ولتاژ منبع
تغذیه خارجی بهرانی نیست و از نظر واقعی و عملی میتوانداز بیش از 1
ولت تا ده ها ولت باشد و به مصرف کننده بستگی دارد.
دقت کنید که در این مدار نوع ترانزیستور مصرفی تغییر کرده و از یک
ترانزیستور دو قطبی تیپ منفی (که بهتر است دارلینگتون هم باشد)
استفاده شده و در نتیجه برای روشن شدن ترانزیستور به حداقل 0.7 ولت
افزایش ولتاژ نیاز است و این به معنی آن است که خروجی "یک"
ترانزیستور را روشن و "صفر" آن را خاموش میکند.
(شماره و مشخصات ترانزیستورهای پیشنهادی در آخر مقاله ذکر شده)
در نتیجه:
برای روشن شدن خروجی باید عدد باینری
B-XXXXXXX1
به پورت &H378 ارسال شود (مثلاً دستور Out(&H378,
0)) و
برای خاموش شدن خروجی باید عدد باینری
B-XXXXXXX0
به پورت &H378 ارسال شود. (مثلاً دستور Out(&H378,
1)) |
مشخصات چند ترانزیستور پیشنهادی |
شکل |
نام |
نوع |
آمپر |
ولتاژ |
توان |
فرکانس |
|
BC547 |
NPN |
0.1A |
50V |
0.5W |
300MHz |
BC557 |
PNP |
0.1A |
50V |
0.5W |
150MHz |
BC517 |
NPN-Darl |
0.4A |
40V |
0.625W |
220MHz |
BC516 |
PNP-Darl |
0.4A |
40V |
0.625W |
220MHz |
|
BD139 |
NPN |
1.5A |
100V |
12.5W |
50MHz |
BD140 |
PNP |
1.5A |
100V |
12.5W |
50MHz |
BD679 |
NPN-Darl+Di |
4.0A |
80V |
40W |
10MHz |
BD680 |
PNP-Darl+Di |
4.0A |
80V |
40W |
10MHz |
یادآور میشود که تمام مدارات فوق صرفاً برای آشنایی با طریقه کار است و در
بنیان یکی هستند، در اصل پس از متوجه شدن اصل مطلب دیگر مشکلی نیست و با یک مقدار
کم اطلاعات الکترونیکی به راحتی میتوان به منظور مورد نظر رسید و نیز مدارت فوق
را میتوان برای استفاده از دیگر پورت ها و پین ها تکثیر کرد و به هر تعداد که نیاز
است توسعه داد ولی در موارد توسعه باید توجه داشت که لزوم نیاز به منبع ولتاژ خارجی
ضروری است و نمیتوان با "یک" کردن چند خروجی ولتاژ مورد نیاز را تأمین کرد.
در زیر برای روشن شدن مبحث ورود اطلاعات به
بررسی چند نمونه اتصال کلید به پورت LPT میپردازیم:
در مورد اتصال کلید اولین مطلب و مهمترین مطلب نواسانات ناشی از قطع و وصل شدن
کلیدهای مکانیکی است.
تمام کلیدهای مکانیکی اینطور که به نظر میرسد نیست که با فشار فوراً و قطعاً
وصل شود و یا قطع شود! کلیدها در زمان قطع شدن یا وصل شدن به مدت حدود 20 میلی
ثانیه نواسان میکنند (به بیان آمیانه با سرعت بالا مدام قطع و وصل میشوند) تا
بالاخره به ثبات برسند.
برای حذف این نواسات یا باید در نرم افزار از زمان تشخیص اتصال، به مدت 20 هزارم
ثانیه نرم
افزار را خواباند و مجدداً بررسی کرد یا باید از یک انتگرال گیر سخت افزاری یا یک
فیلتر پایین گذر سخت افزاری استفاده کرد که در مورد اتصال یک کلید این حرف به معنی
استفاده از یک خازن واحد است که برخلاف اسمش، بسیار ساده است!
نمونه پالس ناشی از کلید و اعمال خاص بر روی آن |
|
این پالس خام ناشی از فشردن لحظه ای و رها سازی یک کلید است. |
|
این همان پالس خام پس از عبور از فیلتر پایین گذر یا انتگرال گیر است. |
|
این همان پالس خام پس از عبور از یک مدار اشمیت تریگر است. |
|
این همان پالس است که از یک فیلتر پایین گذر و سپس یک مدار اشمیت تریگر
گذشته که بهترین حالت است. |
همانطور که بیان شد برای استفاده و ارتباط یک کلید به رایانه صرف وجود یک فیلتر
پایین گذر کافیست و به مدار اشمیت تریگر نیازی نیست ولی حیفم آمد راه حل قطعی و
بهترین راه را بیان نکنم!
نکته ای هم در مورد نرم افزار وجود دارد و آن این مطلب است که تمام نرم
افزارهای خواندن وضعیت ورودی با پورت LPT باید یک حلقه داشته باشند که مدام وضعیت را
بخواند و به محض تغییر وضعیت کلید کار مورد نظر را انجام دهد، یعنی هر وقت شما
وضعیت را میخوانید این صرفاً مربوط به همان زمان است و شاید چند هزارم ثانیه پس از
خوانده شدن وضعیت توسط نرم افزار کلید فشار داده شود پس لزوم حلقه ای که مدام عمل
خواندن را تکرار کند امری حیاتی است.
زیاد مربوط به بحث نیست ولی یک فرمول الکترونیکی که با کمک معادلات دیفرانسیل
به راحتی قابل به دست آمدن است در ساخت این قبیل فیلترهای ساده استفاده میشود،
فرمول
رابطه بین زمان و
پر شدن یک خازن توسط مقاومت را بیان میکند که با قرار دادن ولتاژ اولیه صفر به
معادله
میرسیم که
معادله خالی شدن خازن است ولی در راه سریع که معمولاً هم خوب جواب میدهد استفاده از
فرمول ساده (ولی نه چندان دقیق)
t = 0.7RC است.
نکته ای دیگری که در مورد ورودی های دیجیتالی بسیار مهم است و اغلب افراد غیر
مطلع آن را رعایت نمیکنند، این است که اگر ورودی یک مدار دیجیتال به هیچ جا وصل
نباشد و به امان خود رها شود این اصلاً و به هیچ وجه و با هیچ توجیح الکترونیکی به
معنی آن نیست که به آن ورودی "صفر" میدهد! این خیلی مهم است:
اگر میخواهید "صفر" دهید حتماً باید به نوعی خط صفر ولت یا همان قطب منفی منبع تغذیه
را به آن ورودی وصل کنید و
اگر میخواهید "یک" دهید حتماً باید به نوعی خط 5 ولت یا همان قطب مثبت منبع تغذیه را
به آن ورودی وصل کنید و
اگر ورودی دیجیتای را به هیج جا وصل نکنید، این یک وضعیت ناپایدار و اغلب غیر قابل
پیش بینی است و بشدت باید از آن دوری کرد، حتی در مدارات دیجیتال، ورودی ها بخش
هایی از مدارات که استفاده نمیشوند و کلاً صفر یا یک بودن آنها هیچ تأثیری در
عملکرد مدار ندارد، باز به امان خدا رها نمیشوند و به یکی از قطب های تغذیه وصل
میشوند تا از هر گونه نوسان و ناپایدار در مدار جلوگیری شود.
در نقشه های زیر ورودیها استفاده نشده به جایی وصل نشده اند، چون اینطور در نظر
گرفته شده که در مدارات عملی حتماً از آنها استفاده میشود و صرف اتصال یک کلید به
یک تک پین ورودی مطرح نخواهد بود ولی اگر از پینهای دیگر ورودی استفاده نکردید، به
عنوان پیشنهاد و یک عادت پسندیده دیجیتالی، آن ورودی ها را به سری پایه های صفر ولت
که با علامت GND مشخص شده اند وصل کنید. (البته ورودی های پورت LPT به صورت داخلی دارای مقاومت هایی هستند که از ناپایداری جلوگیری
میکند ولی داشتن آن عادت پسندیده دیجیتالی (و شاید عادت واجب) بد نیست!)
توجه:
X به معنای آن است که صفر یا یک بودن اهمیتی ندارد
برای گرفتن تصاویر با کیفیت تر روی عکس ها کلیک کنید.
چند مدار نمونه جهت ورودی |
|
این مدار نمونه اصلی است و نیاز به یک منبع تغذیه خارجی 5 ولت
دارد.
خازن موجود در مدار برای حذف نواسانات ناشی از کلید است و مقاومت
موجود هم دو وظیفه بر اهده دارد:
اول خالی کردن تدریجی خازن بعد از قطع کلید و همکاری با خازن در
ساخت فیلتر پایین گذر.
دوم اتصال پین ورودی به خط صفر ولت در زمان قطع بودن کلید، به زبان
آمیانه میتوان گفت وقتی کلید وصل است ولتاژ مستقیم 5 ولت را که همان
"یک" منطقی میشود به ورودی تزریق میکند و ولتاژ صفر ولت رد شده از
مقاومت که به شدت ضعیف شده توان مقابله با ولتاژ 5 ولت مستقم را که
از کلید رد شده ندارد و در عمل حذف میشود! ولی وقتی کلید باز است
و قطع است دیگر خبری از ولتاژ مستقیم و قوی 5 ولت نیست و ولتاژ صفر
ولت عبور کرده از مقاومت حرف اول را میزند و ورودی را در "صفر" منطقی
نگاه میدارد!
در اصل کار دوم این مقاومت آن است که هیچ گاه ورودی به امان خدا
رها نشود و همیشه و به طور قطع یا به "صفر" و یا به "یک" منطقی وصل
باشد.
ضمناً هر چه قدر فاصله کلید از رایانه بیشتر شود، این مطلب باعث
افزایش طول سیم و در نتیجه افزایش مقاومت، افزایش ظرفیت خازنی،
افزایش پارازیت وهوم و... میشود و کار کرد صحیح مدار را به خطر می
اندازد، کاهش مقاومت در مدار فوق ساده ترین راه کاهش امپدانس خط انتقال است که
پایداری را به همراه می آورد و در عوض مصرف جریان را بالا میبرد،
به بیان ساده تر در این مدار خاص امپدانس خط انتقال به همین تک مقاومت موجود بستگی دارد، پس در صورت افزایش طول سیم باید مقاومت موجود کمتر شود
و چون زوج مقاومت و خازن با هم مسئول حذف نوسانات ناشی از کلید
هستند (همان بحث 20 میلی ثانیه در فرمول سرانگشتی
0.7RC) در نتیجه برای ثابت
نگه داشتن زمان مورد نظر در فیلتر ساخته شده، باید ظرفیت خازن
افزایش پیدا کند، که این امر از فرمول هم به وضوح مشخص است. (دو
مقدار در هم ضرب شده اند، پس برای ثابت بودن نتیجه باید اگر یکی را
کم میکنید دیگری را افزایش دهید و بلعکس).
در نتیجه:
اگر (Inp(&H379) AND &H10)
صفر باشد یعین کلید قطع است و اگر غیر صفر باشد یعنی کلید فشرده
شده. |
|
این مدار هم صرفاً برای ادامه بحث مدارات ساده بدون منبع تغذیه
بیان شده، در این نمونه نیازی به منبع خارجی نیست و در عوض همواره
باید پایه 2 در گاه LPT که همان پین صفرام پورت
&H378 است، "یک" باشد! یعنی مدار ولتاژ ناچیز مثبت
خود را از "یک" بودن این پین خروجی تامین میکند و آن را صرف ثابت نگه
داشتن ورودی در زمان قطع کلید میکند.
البته در این مدار جای قطب ها هم عوض شده یعنی برخلاف مدار قبلی
وقتی کلید وصل شود، صفر ولت را به ورودی وصل میکند و ورودی "صفر"
میشود و وقتی کلید قطع باشد، ورودی پورت از طریق مقاومت موجود به
خط 5 ولت وصل شده و "یک" میشود.
در این نمونه به علت فقدان منبع تغذیه قوی، شما نمیتوانید کلید را
زیاد دور کنید.
در نتیجه:
اگر (Inp(&H379) AND &H10)
صفر باشد یعنی کلید فشرده شده و اگر غیر صفر باشد یعنی کلید قطع است.
("یک" کردن پایه 2 درگاه برای تأمین ولتاژ اندک مثبت مورد نیاز به
کمک دستوری مثل Out(&H378,1) فراموش نشود) |
مجدداً تاکید میکنم که مدارت فوق بسیار ساده و قابل گسترش هستند و در اصل هیچ چیز خاصی ندارند و با کمی اطلاعات الکترونیکی به راحتی میتوان مدار مورد نظر را طراحی کرد.
امید است مطالب فوق برای دوستان مفید واقع شود.
شنبه 26 خردادماه 1386