قسمت نرمافزار و برنامه نويسي ميكروكنترولر
مختصري راجع به آيسي درايور ULN2003A :
اين آي به منظور تامين جريان مورد نياز براي موتورهاي پلهاي به كار برده ميشود.
مشخصات اين آي سي:
o هفت ترانزيستور دارينگتون در هر پكيج
o جريان خروجي هر درايور 500mA (جريان پيك 600mA)
o ولتاژ خروجي تا حد 50 ولت
o ديود خفه كننده براي بارهاي سلفي
o امكان موازي كردن خروجيها به منظور افزايش جريان خروجي
o ورودي سازگار با منطقهاي TTL/PMOS/DTL
o قرار گرفتن پينهاي ورودي و خروجي متناظر به هم رو بروي يكديگر بمنظور ساده كردن سيم كشي در فيبر مدار چاپي
در اين پروژه به علت بالا بودن جريان مصرفي موتور پلهاي مجبور بوديم كه هر 2 خروجي را به منظور افزايش جريان دهي آي سي به هم متصل كنيم كه نهايتا 2 آي سي مصرف ميشد.
در ضمن آي سي بصورت داخل داراي ديودهاي حذف اثات القايي است كه جهت استفاده از آن بايد پايه 9 آي سي به ولتاژ تغذيه وصل شود.
همچنين آي سي فاقد تغذيه است. زيرا آي سي تنها شامل هفت ترانزيستور دارلينگتون كلكتور باز است كه فقط پايه هاي اميتر آن به هم وصل شده و از پايه 8 قابل دسترس هستند و بايد به زمين متصل گردد.
قسمت نرمافزار و برنامه نويسي ميكروكنترولر :
همانطور كه ذكر شد در اين پروژه از ميكروكنترولر Atmega16 محصول شركت Atmel استفاده شده.
اين ميكروكنترولر بخاطر ويژگيهاي خاص خو طرفداران زيادي دارد و روز به روز به شمار استفاده كنندگان آن افزوده ميشود.
با توجه به اينكه زبانهاي سطح بالا از انعطاف پذيري بالايي برخوردارند و همچنين سرعت برنامه نويسي را به طور چشمگيري افزايش ميدهند در ميكروكنترولرها نيز زبانهاي سطح بالا نفوذ كرد و در حال حاظر كامپايلرهاي متعددي از زبان سطح بالا مثل C ، Basic ، Pascal و … براي انواع ميكروكنترولر توليد شده و همچنين هر روز به تعداد آنها اضافه ميشود.
لازم به ذكر است كه دستورات اسمبلي AVR به گونهاي طراحي شده تا سازگاري بسيار زيادي با زبانهاي سطح بالا داشته باشد. در اصل دستورات اسمبلي AVR براي برنامه نويسي به زبان اسمبلي و C بهينه شده است. و با داشتن رجيسترهاي همه منظوره زياد (32 عدد) هم باعث بالا رفتن سرعت برنامه و افزايش كارايي در زبانهاي سطح بالا مانند C ميشود و هم نوشتن كدهاي اسمبلي را به دليل نياز كمتر به حافظه RAM و جابجاييهاي متعدد متغييرها، بيش از پيش آسان ميكند.
بهر حال AVR هم مانند ميكروكنترولرهاي ديگر كامپايلرهاي زبان سطح بالا متعددي دارد.
از بهترين كامپايلرهاي زبان C، AVR ميتوان از IAR ، CodeVisin AVR ، AVR GCC و … نام برد.
كامپايلر AVR GCC محصول خود Atmel است كه بطور رايگان در اختيار كاربران AVR قرار دارد.
از بهترين كامپايلرهاي زبان بيسيك نيز ميتوان Bascom AVR را نام برد.
اين كامپايلر همچنين حاوي تعداد زيادي لايبرري آماده براي كارهاي متعدد و به منظور كار با تجهيزات داخلي AVR و يا راه اندازي سخت افزارهاي خارجي مرسوم ميباشد. كه همين امر كاربران زيادي را به خود جذب كرده.
همانطور كه ذكر شد، اين كامپايلر به زبان بيسيك است. زبان بيسيك به دليل سادگي و آساني كه دارد كار برنامه نويسي را خيلي آسان كرده است.
در اين پروژه برنامه به زبان بيسيك Bascom AVR نوشته شده و توسط كامپايلر آن ترجمه و در ميكرو ذخيره شده است.
در پايان، برنامه پروژه به همراه الگوريتم آن و مختصري توضيحات ارائه خواهد شد. همچنين تعدادي از برگههاي اطلاعاتي نيز به عنوان ضميمه در پايان ارائه شده است.
شماتيك و پشت فيبر مدار نيز بعد از پايان قسمت نرم افزار آورده شده است.
برنامه به زبان بيسيك
كامپايلر :
Bascom AVR 1.11.7.4
$crystal = 8000000
$regfile = “m16def.dat”
Config Pinc.0 = Input ‘Sensor Port
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinb.1 = Input ‘Keyboard Port
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.5 = Output ‘LED key Port
Config Pinb.6 = Output
Config Pinb.7 = Output
Config Pinc.5 = Output ‘LED-Door Port
Config Pinc.6 = Output
Config Pinc.7 = Output
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
Config Pind.0 = Output ‘Step Motor Port
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Portd.0 = 1
Portd.1 = 1
Portd.2 = 0
Portd.3 = 0
Config Pina.0 = Output ‘7-Seg Port
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Pina.5 = Output
Config Pina.6 = Output
Dim Direction As Bit
Dim K As Byte , I As Byte , E As Byte , C As Byte
Dim Temp As Byte , Temp_1 As Byte
Dim A(3) As Byte
Dim T As Long
A(1) = 0
A(2) = 0
A(3) = 0
E = 1
C = 0
Gosub Position
‘**********************************************************
Main:
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
If A(1) = 0 Then Goto Main
If C = 0 Then
Select Case E
Case 1 : Portb.5 = 0
Case 2 : Portb.6 = 0
Case 3 : Portb.7 = 0
End Select
If A(1) = E Then
Gosub Door
A(1) = A(2)
A(2) = A(3)
A(3) = 0
C = 0
Goto Main
End If
If A(2) = E Then
Gosub Door
A(2) = A(3)
A(3) = 0
End If
If A(3) = E Then
Gosub Door
A(3) = 0
End If
End If
Gosub Motion
Gosub Position
Goto Main
End ‘end program
‘***************************************************************************
Key_scan:
K = 0
If Pinb.1 = 0 Then
K = 1
Gosub Insert
End If
If Pinb.2 = 0 Then
K = 2
Gosub Insert
End If
If Pinb.3 = 0 Then
K = 3
Gosub Insert
End If
Return
‘^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Insert:
I = 1
Do
If A(i) = 0 Then
A(i) = K
Select Case K
Case 1 : Portb.5 = 1
Case 2 : Portb.6 = 1
Case 3 : Portb.7 = 1
End Select
End If
If A(i) = K Then Exit Do
Incr I
Loop
Return
‘####################################################
Motion:
Gosub Direction
Temp_1 = Portd And &B11110000
Temp = Portd And &B1111
For I = 1 To 10
Select Case Direction
Case 1
Select Case Temp
Case &B1100 : Portd = Temp_1 Or &B1001
Case &B0110 : Portd = Temp_1 Or &B1100
Case &B0011 : Portd = Temp_1 Or &B0110
Case &B1001 : Portd = Temp_1 Or &B0011
End Select
Case 0
Select Case Temp
Case &B0011 : Portd = Temp_1 Or &B1001
Case &B1001 : Portd = Temp_1 Or &B1100
Case &B0110 : Portd = Temp_1 Or &B0011
Case &B1100 : Portd = Temp_1 Or &B0110
End Select
End Select
Waitus 800
Next I
Return
‘####################################################
Direction:
Select Case E
Case Is < A(1) : Direction = 1
Case Is > A(1) : Direction = 0
End Select
Return
‘####################################################
Position:
C = 0
Temp = Pinc And &B111
Select Case Temp
Case &B110 : E = 1
Case &B101 : E = 2
Case &B011 : E = 3
Case Else : C = 1
End Select
Porta = Lookup(e , 7seg)
Return
‘####################################################
Door:
Portc.5 = 0
For T = 1 To 80000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next T
Portc.6 = 0
For T = 1 To 80000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next T
Portc.7 = 0
For T = 1 To 80000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next T
For T = 1 To 400000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next
Portc.7 = 1
For T = 1 To 80000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next T
Portc.6 = 1
For T = 1 To 80000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next T
Portc.5 = 1
For T = 1 To 80000
Temp = Pinb And &B1110
If Temp < 14 Then Gosub Key_scan
Next T
Return
‘####################################################
7seg:
Data 0 , &B110 , &B1011011 , &B1001111
الگوریتم