• ¡Welcome to Square Theme!
  • This news are in header template.
  • Please ignore this message.
مهمان عزیز خوش‌آمدید. ورود عضــویت


امتیاز موضوع:
  • 17 رای - 2.12 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Title: آموزش کامل بسکام به همراه مثال
حالت موضوعی
#11
نقل قول: فصل چهارم : راه اندازي امکانات جانبي
Shiftin :
با اين دستور ميتوان تعداد بيت را درون يک متغير شيفت داد ، بيت ها بصورت سريال به يکي از پايه اي ميکرو اعمال ميشوند . اين دستور به فرم کلي زير است :
Shiftin Pin , Pclock , Var , Option [, Bits , Delay ]
Pin : نام پايه اي است که اطلاعات سريال به آن وارد مي شوند .
Pclock : نام پايه اي است که خط کلاک دستگاه ديگر به آن متصل مي شود .
Var: نام متغيري است که اطلاعات در آن ذخيره ميشوند .
Option: نوع شيفت دادن و کلاک را معين ميکند و يکي از اعداد زير است :
1 : هنگامي که فرکانس کلاک کم باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
2 : هنگامي که فرکانس کلاک زياد باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
3 : هنگامي که فرکانس کلاک کم باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
4 : هنگامي که فرکانس کلاک زياد باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
Bits : مشخص کننده تعداد بيت است که وارد متغير مي شود و نهايتا مي تواند 255 باشد (اين گزينه اختياري است)
Delay : تاخير زماني برحسب ميکرو ثانيه مي باشد که در بين دريافت هر بيت رخ مي دهد ( استفاده از اين گزينه اختياري است) (درصورت بالا بودن کلاک از اين گزينه استفاده نکنيد).
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config PORTA =input
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Word
Shiftin PINA.0 , PINA.1 , A , 0
End
در مثال بالا پايه کلاک پين A.1 و پايه ديتا پايه A.0 ميباشد ، که از ميکرو ديگر که برنامه آن را در دستور بعدي مشاهده مي فرمايد ، گرفته شده است .

Shiftout:
با اين دستور ميتوان يک متغير را بصورت سريال از يک پايه به بيرون داد . اين دستور به فرم کلي زير است:
Shiftout Pin , Pclock , Var , Option [, Bits , Delay ]
Pin : نام پايه اي است که اطلاعات سريال از آن خارج ميشوند.
Pclock : نام پايه اي است که خط کلاک دستگاه ديگر به آن متصل مي شود.(خروجي کلاک است)
Var: نام متغيري است که اطلاعات در آن وجود دارد و بايد ارسال شود.
Option: نوع شيفت دادن و کلاک را معين ميکند و يکي از اعداد زير است:
1 : هنگامي که فرکانس کلاک کم باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
2 : هنگامي که فرکانس کلاک زياد باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
3 : هنگامي که فرکانس کلاک کم باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
4 : هنگامي که فرکانس کلاک زياد باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
Bits : مشخص کننده تعداد بيت از متغير است که به بيرون شيفت داده مي شود و نهايتا مي تواند 255 باشد (اين گزينه اختياري است)
Delay: تاخير زماني برحسب ميکرو ثانيه ميباشد که دربين ارسال هر بيت رخ مي دهد ( استفاده از اين گزينه اختياري است) (درصورت بالا بودن کلاک از اين گزينه استفاده نکنيد).
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Dim A As Word
A = &B11001000 '200
Shiftout PINA.0 , PINA.1 , A , 0
End

نکته : در بعضي از کتاب ها از دستورات Shift In/Out ، با نام SPI نرم افزاري ياد شده است که اشتباه است !

Pulseout :
فرم کلي اين دستور به شکل زير است:
Pulseout PORTX , Y , Period
با اين دستور ميتوان يک پالس بر روي پورت PORTX و پايه Y دلخواه با زمان تناوب Period دلخواه بر حسب ميکرو ثانيه ايجاد کرد ( پایه ای که پالس بر روي آن ايجاد مي شود بايد به عنوان خروجي تعريف شود)
در صورتي که از حلقه استفاده نکنيد ، دستور فقط يک با اجرا مي شود ، اين پالس مربعي است ( در واقع و ضعيت پايه از صفر به يک يا بلعکس تغيير مي کند) .
مثال : ( در مسیر Example\4 - Puls موجود است . )
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTC.0 = Output
Do
Pulseout PORTC , 0 , 1000
Pulseout PORTC , 1 , 1000
Loop
و خروجی برنامه فوق در تست پروتئوس :




Pulsein:
توسط اين دستور ميتوان زمان تناوب يک پالس مربعي را اندازه گرفت ، فرم کلي اين دستور به شکل زير است:
Pulsein Var , PINX , Y , State
اين دستورزمان تناوب پالس اعمال شده به پورت PINX و پين Y دلخواه را در متغير Var که بايد از جنس Word باشد قرار مي دهد .
شما ميتوانيد مشخص کنيد که زمان بين از صفر به يک رفتن يا از يک به صفر رفتن پالس اندازه گرفته شود ، براي حالت اول به جاي STATE صفر و براي حالت دوم به جاي STATE يک قرار دهيد .
مثال : ( در مسیر Example\5 - Time Puls موجود است )

$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cursor Off
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Word
Config PORTC.0 = Input
Do
Bitwait PINC.0 , Reset
Pulsein X , PINC , 0 , 1
Locate 1 , 1 : Lcd "1 = " ; X ; " "
Bitwait PINC.0 , Set
Pulsein X , PINC , 0 , 0
Locate 2 , 1 : Lcd "0 = " ; X ; " "
Loop
End
در مثال بالا زمان تناوب پالس مثبت و منفی که به پين C.0 اعمال شده اندازه گرفته مي شود و سپس بر روي LCD نمايش داده مي شود . (زمان تناوب نبايد از 65535 ميلي ثانيه بيشتر باشد ، اين دستور از تايمر هاي ميکرو استفاده نمي کند .)

Sound :
توسط اين دستور ميتوان پالسي را بر روي يکي از پايه هاي ميکرو ظاهر کرد ، فرم کلي دستور به شکل زير است:
Sound PORTX.Y , Duration , Pulses
PORTX.Y نام پايه دلخواهي است که پالس از آن خارج مي شود ، Durationمشخص کننده تعداد پالس هاي خروجي است و Pulses زمان تناوب پالس برحسب ميکرو ثانيه است که حداکثر مقدار آن 65535 است.
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTC.0 = Output
Do
Sound PINC.0 , 10 , 60000
Loop
End
در مثال بالا پالس از پين c.0 خارج مي شود ، زمان تناوب آن 60 ميلي ثانيه است و 10 بار تکرار مي شود . از اين دستور معمولا براي راه اندازيBUZZER استفاده مي شود.

استفاده از کليد وکيبرد و کي پد و ...
استفاده از کليد :
براي اتصال کليد به avr در محيط بسکام روش هاي مختلفي وجود دارد که در زير به بيان هر يک ميپردازيم .
نکته ، پيني که کليد به آن متصل مي شود بايد به عنوان ورودي تعريف شود .

استفاده از دستور شرطي If:
با دستور IF قبلا آشنا شديد اکنون يکي از قابليت هاي را بررسي مي کنيم :
کليد ها داراي دو پايه مي باشد که يک پايه آن به يکي از پايه هاي ميکرو و ديگري به VCC يا GND متصل مي شود با استفاده از دستور شرطي If ميتوان فشرده شدن کليد را چک کرد ، هنگامي که کليد فشرده مي شود پايه اي که کليد به آن متصبل است صفر (به گراند متصل مي شود) يا يک (به 5 ولت متصل مي شود) مي شود.
مثال : در اين مثال يک سرکليد به VCC و سر ديگر به پورت C پايه 4 متصل شده است
If Portc.4 = 1 Then
Set Porta.0
end IF
در مثال بالا ، اگر کليد فشرده شودPORTC.4 به VCC متصل ميگردد(1مي شود) . شرط به اين قرار است که اگر PORTC.4 يک شد PORTA.0 نيز يک شود در غير اين صورت PORTA.0 صفر بماند .
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Portc = Input
Debounce Pinc.0 , 1 , A
If Portc.1 = 1 Then
Lcd "qwer"
End If
End
A:
Lcd "12345"
Return
در برنامه بالا اگر پين C.0 يک شود روي LCD عبارت 12345 نشان داده مي شود و اگر پين C.1 يک شود روي LCD عبارت QWER نشان داده مي شود.

Debounce:
فرم کلي اين دستور به شکل زير است:
Debounce PX.Y , State , Label [,Sub]
توسط اين دستور پينX.Y چک مي شود و هنگامي که مقدار آن برابر با State شد CPU ميکرو به Label پرش ميکند ، گزينه Sub اختياري است ، شما ميتوانيد از اين گزينه براي پرش به يک زير برنامه استفاده کنيد.
به جاي گزينه State ميتوانيد 0 يا 1 قرار دهيد ، در صورتي که State صفر باشد ، هنگامي که پايه مورد نظر از یک به صفر تغییر وضعیت داد ، به برچسب مورد نظر پرش مي شود و هنگامي که State يک باشد هنگامي که پايه به ولتاژ 5 ولت متصل شد پرش صورت مي گيرد (پيني که کليد به آن متصل است بايد به عنوان ورودي تعريف شود) .
این دستور برای دریافت از کلیدها می باشد و مدت زمان 20 میلی ثانیه را به عنوان حداقل زمان فشار دادن کلید برای لرزش گیری در نظر می گیرد )
مانند :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Config PORTC = Input

W:
Locate 1 , 1
Lcd "pinc.0 ro 1 kon"
Debounce PINC.0 , 1 , Q
Goto W

Q:
Locate 1 , 1
Lcd "pinc.1 ro 1 kon"
Debounce PINC.1 , 1 , W
Goto Q
پیشنهاد می شود برای تشخیص فشردن کلید از دستور فوق استفاده شود .
هنگامي که کليد فشرده مي شود ، براثر لرزش دست چندين با دو کنتاکت آن به هم برخورد مي کنند و در نهايت ثابت ميشوند اگر از دستور Debounce استفاده نشود لرزش به منزله فشردن کليد است

Encoder :
ENCODER نوعي کليد دوطرفه مي باشند که تصوير آن را در شکل روبرو مشاهده مي کنيد :
از اين قطعه در کيبردها و لوازم صوتي تصويري و ... براي کم و زياد کردن صدا و نور و ... استفاده مي شود.در واقع اين قطعه از دو کليد تشکيل شده است ، هنگامي که شما سري را به سمت راست مي چرخانيد ، کليد سمت راست (که يک پايه آن به پايه وسط و پايه ديگر به پايه سمت راست متصل است) قطع و وصل مي شود ، و هنگامي که سري را به سمت چپ مي چرخانيد کليد سمت چپ ( که يک پايه آن به سر وسط و پايه ديگر به پين سمت چپ متصل است ) قطع و وصل مي شود ، با استفاده از دستور زير ميتوان عمليات مناسب با جهت چرخش ( قطع و وصل شدن هر کليد ) را انجام داد:
Var = Encoder (PIN1 , PIN2 , Leftlabel , Rightlabel , Wait(
Var : يک متغيير از جنس دلخواه ميباشد که به ازاي پالس هاي فرد مقدار آن صفر و به ازاي پالس هاي زوج مقدار آن يک است (مقدار آن حول صفر ويک تغيير مي کند)
PIN1 : نشان دهنده پايه اي است که پين 1 (چپ يا راست ) انکدر به آن متصل مي شود.
PIN2 : نشان دهنده پايه اي است که پين 2 (چپ يا راست ) انکدر به آن متصل مي شود.
Leftlabel : نام برچسبي است که در هنگام به چپ چرخيدن انکودر به آن پرش مي شود . باز گشت از برچسب با دستور Return انجام مي شود.
Rightlabel : نام برچسبي است که در هنگام به راست چرخيدن انکودر به آن پرش مي شود. باز گشت از برچسب با دستور Return انجام مي شود.
Wait : در صورتي که شما به جاي اين کلمه 1 بگذاريد CPU ميکرو بر روي اين دستور متوقف مي شود ، هنگامي که انکدور چرخيد CPU به زير برنامه مي رود و بعد از انجام دستورات موجود در زير برنامه دوباره روي اين دستور متوقف شده و منتظر مي ماند تا پالسي اعمال شود و درصورتي که 0 قرار دهيد CPU مدام در حلقه گردش ميکند و اگر دستور انکودر در حلقه باشد آن را چک مي کند و اگر نباشد که هيچ .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Config PORTB = Input
Dim C As Word , A As Byte : Lcd C
Do
A = Encoder(PINB.0 , PINB.1 , Q , W , 0)
Home L : Lcd A ; " "
Loop
End

Q:
Decr C
Home : Lcd C ; " "
Return

W:
Incr C
Home : Lcd C ; " "
Return
در مثال بالا پايه مشترک انکدر به گراند و پايه چپ آن به پين B.0 و پايه راست آن به پين B.1 متصل شده است .
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
#12
اتصال کي پد :
ابتدا در مورد چگونگي کار کي پد بحث کنيم .
در زير شکل اين وسيله را مشاهده مي کنيد .
'گاهي به تعداد زيادي کليد نياز داريم ، ما بايد اين کليد ها را به ميکرو متصل کنيم و مدام آنها را چک نماييم . براي اين کار دو راه وجود دارد که روش اول اتصال هر کليد به يک پايه و روش دوم استفاده از صفحه کليد ماتريسي است .
روش اول، چون تعداد زيادي از پايه هاي ميکرو اشغال مي شود،کمتر مورد استفاده قرار مي گيرد .دستور بسکام براي استفاده از صفحه کليد ماتريسي که از اين به بعد به آن KBD مي گوييم به شرح زير است :
Config Kbd = PORTX [, Debounce = Value , Delay = Value]
که PORTX ، پورتي است که KBD به آن متصل مي شود .
Debounce تاخير کليد است که بين 1 تا 255 ميلي ثانيه است . (اگر تعریف نشود 20 میلی ثانیه در نظر گرفته می شود )
Delay هم تاخیر بین هر فشردن کلید است که در بین 1 تا 255 میلی ثانیه قابل تنظیم است . (اگر تعریف نشود 100 میلی ثانیه در نظر گرفته می شود )
بعد از تعريف KBD در برنامه نوبت به استفاده از آن است براي اين کار از دستور زير استفاده مي شود
Var = Getkbd()
که Var يک متغيير از جنس بايت است که عدد گرفته شده از KBD در آن گذاشته مي شود و در صورتي که کليدي فشرده نشود عدد 16 در داخل آن گذاشته مي شود ، براي حذف عدد 16 مي توان از دستور شرطي If استفاده کرد.
مانند :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb,DEBOUNCE = 50
Dim A As Byte
Q:
A = Getkbd()
If A > 15 Then
Goto Q
End If
Locate 1 , 1
Lcd A
Goto Q
End
دو خط اول برنامه مثل هميشه معرفي ميکرو و کريستال است (که در اينجا از ميکرو مگا 16 و کريستال 8 مگاهرتز استفاده شده است) .
در خط سوم و چهارم و پنجم LCD راه اندازي شده است ( که در اينجا از LCD 6*2 استفاده شده وLCD به پورتD متصل است) .
در خط ششم KBD معرفي شده (که در اينجا KBD به پورت B متصل شده وDebounce پنجاه ميلي ثانيه گرفته شده است ) .
در خط هفتم يک متغيير از جنس بايت معرفي گرديده .
در خط هشتم يک برجسب به نام Q قرار داده شده است .
در خط نهم عدد گرفته شده از KBD در متغيير A قرار مي گيرد (در صورتي که هيچ کليدي فشرده نشود مقدار 16 (A=16) در A ريخته مي شود ) .
در خط ده ويازده و دوازده يک دستور شرطي قرار گرفته که اين دستور شرطي ميگويد : اگر A بزرگتر از 15 شد به برچسب Q پرش کن (در صورتي که شرط درست باشد دستورات بين If و Endif اجرا مي شود و اگر شرط درست نباشد برنامه از خط بعد از Endif ادامه مي يابد ).
در خط سيزده و چهارده مقدار A در سطر اول و ستون اول LCD نمايش داده مي شود .
و در خط پانزده برنامه به برچسب Q پرش ميکند و مراحل قبل دوباره تکرار ميگردد .
خط اخر برنامه هميشه End است . مدار مورد استفاده :

مثال : در اين مثال به ازاي هر کليد در LCD يک نام نوشته مي شود :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20
Dim A As Byte
Q:
A = Getkbd()
If A > 15 Then : Goto Q : End If
If A = 0 Then : Locate 1 , 1 : Lcd "qwer" : End If
If A = 1 Then : Locate 1 , 1 : Lcd "asdf" : End If
If A = 3 Then : Locate 1 , 1 : Lcd "FDFD" : End If
If A = 4 Then : Locate 1 , 1 : Lcd "aFDf" : End If
If A = 5 Then : Locate 1 , 1 : Lcd "SAKr" : End If
If A = 6 Then : Locate 1 , 1 : Lcd "1234" : End If
If A = 7 Then : Locate 1 , 1 : Lcd "5687" : End If
If A = 8 Then : Locate 1 , 1 : Lcd "7541" : End If
If A = 9 Then : Locate 1 , 1 : Lcd "IO12" : End If
If A = 10 Then : Locate 1 , 1 : Lcd "wqsf" : End If
If A = 11 Then : Locate 1 , 1 : Lcd "1l2k" : End If
If A = 12 Then : Locate 1 , 1 : Lcd "3,m5" : End If
If A = 13 Then : Locate 1 , 1 : Lcd ")(*(" : End If
If A = 14 Then : Locate 1 , 1 : Lcd "****" : End If
If A = 15 Then : Locate 1 , 1 : Lcd "++++" : End If
Locate 2 , 1 : Lcd A : Goto Q
End

در برنامه بالا براي اينکه حجم کمتري اشغال شود دستورات به صورت سطري نوشته شده اند ، شما ميتوانيد با قرار دادن علامت دونقطه ([عکس: smile.gif] در بين دو دستور آنها را در يک خط بنويسيد ، هعمچنين با قرار دادن علامت ويرگول ([عکس: wink.gif] چندين علامت را روي LCD در يک خط نمايش دهيد ، همچنين با دستور کما (,) چندين متغيير را در يک خط معرفي کنيد .
برنامه بالا را با استفاده از جدول lookupstr مي نويسيم :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20
Dim A As Byte
Dim B As String * 5
Q:
A = Getkbd()
If A > 15 Then
Goto Q
End If
B = Lookupstr(a , W)
Locate 1 , 1: Lcd B
Locate 2 , 1: Lcd A
Goto Q
End
W:
Data "qwer" , "asdf" , "gdfh" , "jlhl" , "hkn," , "yryh" , "bmn4" , "2452" , "jkym" , "jytj" , "njhf" , "uyjn" , "dyr4" , "e5yh" , "9768" , "hnbh"
جدولLookupstr نيز مانند جدول Lookup است اما جدول Lookup براي باز گرداني اعداد و جدول Lookupstr براي بازگرداني حروف به کار مي رود .
شما جاي پايه هاي KBD که به پايه ميکرو متصل است را تغيير دهيد ونتيجه راببينيد. هميشه نياز نيست که ورودي يک کليد باشد بعضي وقت ها مي توان صفر يا يک شدن يک پين را هم چک کرد.
بعضي وقت ها به کيپد با تعداد کليد بيشتر نياز است شما با دستور زير 2 سطر ديگر به تعدا سطر هاي کيپد اضافه کنيد (در مجموع 24 کليد)
Config Kbd = Portx , Debounce = Value , Rows = 6 , Row5 = PINA.B, Row6 = PINA.B
X نام پورتي است که کيپد به آن متصل شده است (4سطر و4ستون اصلي).
Value مقدار تاخير در فشردن کليد براي گرفتن لرزش است.
A.B نام پورت و پيني است که دوسطر ديگر به آن متصل شده اند.
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20 , Rows = 6 , Row5 = Pina.0 , Row6 = Pina.1
Dim A As Byte
Q:
A = Getkbd()
If A > 16 Then : Goto Q : End If
Locate 1 , 1 : Lcd A : Goto Q
End

اتصال کيبرد کامپيوتر :
اتصال کيبرد به avr در بسکام کار ساده اي مي باشد ، چون تمامي توابع تعريف شده هستند ونياز به نوشتن برنامه اضافه نمي باشد.
کيبرد کامپيوتر داراي 4 سيم ميباشد که دوتا از آنها مربوط به تغذيه کيبرد و يکي ديتا کيبرد و ديگري کلاک (پالس همزماني ) مي باشد .
پيکربندي کيبرد به صورت زير است :
Config Keyboard = PINX.Y , Data = PINX.Y , Keydata = Table
که PINX.Yيکي از پايه هاي دلخواه ميکرو مي باشد وTable نام جدول کد هاي کيبرد است (از آنجا که کدهاي گرفته شده از کيبرد هگز ميباشد ،بايد به وسيله يک جدول آنها را به کد اسکي براي نمايش تبديل کرد) .
مقدار گرفته شده از کيبرد بعد از تبديل به کد اسکي بايد در يک متغيير (مثلا B) ريخته شود که اين کار با دستور زير انجام مي شود .
B = Getatkbd()
اگر کليدي فشرده نشود مقدار صفر در B ريخته مي شود .
به همين سبب در برنامه يک دستور شرط (If) قرار داده مي شود تا موقعي که کليد فشرده نشود مقدار صفر در B قرار نگيرد.
براي درک بيشتر موضوع به مثال زير توجه کنيد :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Keyboard = Pind.2 , Data = Pind.4 , Keydata = Keydata
Dim B As Byte
Do
B = Getatkbd()
If B > 0 Then
Loacate 1,1
Lcd, B
End If
Loop
End
Keydata:
'normal keys lower case
Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
'shifted keys UPPER case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
#13
اتصال به عنوان کيبرد کامپيوتر :
نکته مهم : اتصال AVR به عنوان کيبرد به کامپيوتر، که در بسکام به نام ATEMU نام گذاري شده رايگان نبوده و کامپايلر در هنگام کامپايل کردن برنامه هاي مربوطه ( که در زير دو مورد آن موجود است ) از شما خطاي عدم وجود لايبري را مي گيرد ، شما بايد در HELP بسکام گزينه ي AT_EMULATOR را جستجو کنيد ، در صفحه پيدا شده طريقه تهيه لايبري امده است.
شما ميتوانيد بر عکس حالات بالا را با چند دستور ساده زير انجام دهيد ، يعني يک ميکروAVR را به پورت کيبرد که در پشت کامپيوتر قرار دارد ، متصل کنيد و اطلاعات مورد نياز را براي کامپيوتر ارسال کنيد ، راه اندازي اين مورد به صورت زير است :
Config Atemu = Int , Data = Data , Clock=Clock
Int : شما ميتوانيد از وقفه صفر يا يک براي اين مورد استفاده کنيد (INT0 يا INT1)
Data : نام پايه اي از ميکرو است که سيم ديتاي پورت کيبرد کامپيوتر (که شکل آن را در مبحث قبل مشاهده کرديد) به آن متصل مي شود (سيم ديتاي سوکت کيبرد بايد به پايه ورودي وقفه متصل شود (شما مجازيد از دوپايه INT0 و INT1 ( پايه 16 و 17 ميکرو مگا 16 )استفاده کنيد ))
Clock :نام پايه اي از ميکرو است که سيم کلاک پورت کيبرد کامپيوتر به آن متصل مي شود. با دستور زير ميتوانيد کد هاي دلخواه را به کيبرد را به کامپيوتر ارسال کنيد
Sendscankbd Label | Var
Label نام برچسبي است که کد در آن قرار دارد ( شما ميتوانيد چند کد را مانند مثال پشت سر هم نوشته و آنها را به کامپيوتر بفرستيد )
Var :
شما همچنين ميتوانيد يک متغيير را به کامپيوتر بفرستيد .در زير نام کليد هاي صفحه کليد و کدي که هر يک مي سازند را مشاهده مي فرماييد :

در مثال زير ميخواهيم عبارت "1nafar " را به کامپيوتر بفرستيم ، بعد از ساخت سخت افزار و اتصال آن به کامپيوتر در صورتي که برنامه Notepad يا Word را باز کنيد ، عبارت مذکور در آن نوشته مي شود.
مانند تمامي برنامه ها ابتدا ميکرو و کريستال را معرفي ميکنيم:
$regfile = "m16def.dat"
$crystal = 8000000
قدمي بعدي فعال سازي وقفه سراسري (هنگامي که ميخواهيم از وقفه استفاده کنيم بايد آن را فعال کنيم ، با دستور که نام برده مي شود تمامي وقفه ها فعال مي شوند) است :
Enable Interrupts
مرحله بعدي معرفي پايه هاي ميکرو است که بايد به پورت کيبرد موجود در پشت کامپيوتر متصل شود:
Config Atemu = Int1 , Data = PIND.3 , Clock = PINB.0
در حالت بالا پايه کلاک پورت کيبرد به پورت B.0 و پايه ديتا آن به ورودي وقفه 1 (پورت D.3) متصل است ، (در صوتي که از وقفه 0 استفاده شود ، پايه ديتا بايد به پورت D.2 متصل شود)
در مرحله بعد يک حلقه ايجاد مي کنيم تا ميکرو مدام عبارت را به کامپيوتر ارسال کند :
Do
و در نهايت با دستور زير برچسبي که در آن عبارت "1nafar" وجود دارد به کامپيوتر ارسال مي شود:
Sendscankbd data1
يک تاخير زماني ، براي اينکه صفحه مدام پر نشود :
Wait 2
پايان حلقه و پايان برنامه :
Loop
End
و در نهايت ايجاد برچسب :
Data1:
Data 18 , &H16 , &HF0 , &H16 , &H31 , &HF0 , &H31 , &H1C , &HF0 , &H1C , &H2B , &HF0 , &H2B , &H1C , &HF0 , &H1C , &H2D , &HF0 , &H2D
اولين داده جدول تعداد بايت ارسالي است ، در اينجا تمامي بايت ها ( که تعداد آنها 18 تاست) با هم ارسال شده اند (منظور پشت سرهم است ) ، شما ميتوانيد مانند جدول lookup ، جدول را آدرس دهي کنيد و داده هاي مورد نظر را بفرستيد ، توجه داشته باشيد که تعداد بايد نبايد از 3 کمتر باشد ، در اين صورت داده کامل منتقل نمي شود .داده هاي بعدي ، اعداد و حروف مي باشند ، مثلا براي عدد 1 بايد ، مطابق جدول بالا (نام کليد هاي صفحه کليد و کدي که هر يک ميسازند) کد &H16 , &HF0 , &H16 ارسال شود و براي کليد DELETE بايد کد &HE0 , &H71 , &HE0 , &HF0 &H71 ارسال شود
و .... در زير کد مربوط به کليد هاي مدياپلير و ديگر کليد هاي موجود بر روي صفحه کليد را مشاهده مي فرماييد:

ميخواهيم با يک کليد صدا را کم و با کليد ديگر صدا را زياد کنيم براي اين کار چند روش وجود دارد که يکي از آنها در زير امده است :
$regfile = "m16def.dat"
$crystal = 8000000
Enable Interrupts
Config Atemu = Int1 , Data = Pind.3 , Clock = Pinb.0
Waitms 500
Config Porta = Input
Q:
Debounce Pina.0 , 1 , Vup
Debounce Pina.0 , 1 , Vdown
Goto Q
Vup:
Sendscankbd Data1
Waitms 500
Goto Q
Vdown:
Sendscankbd Data2
Waitms 500
Goto Q
End
Data 5 , &HE0 , &H32 , &HE0 , &HF0 , &H32
Data2:
Data 5 , &HE0 , &H21 , &HE0 , &HF0 , &H21
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
#14
اتصال به عنوان موس به کامپيوتر :
نکته مهم : اتصال AVR به عنوان موس به کامپيوتر، که در بسکام به نام PS2EMU نام گذاري شده رايگان نبوده و کامپايلر در هنگام کامپايل کردن برنامه هاي مربوطه ( که در زير دو مورد آن موجود است ) از شما خطاي عدم وجود لايبري را ميگيرد ، شما بايد در HELP بسکام گزينه ي AT_EMULATOR را جستجو کنيد ، در صفحه پيدا شده طريقه تهيه لايبري امده است.
راه اندازي اين مورد با دستور زير انجام مي شود:
Config Ps2emu= Int , Data = Data , Clock = Clock
Int : شما ميتوالنيد از وقفه صفر يا يک براي اين مورد استفاده کنيد ( int0 يا int1)
Data : نام پايه اي از ميکرو است که سيم ديتاي پورت موس کامپيوتر (که شکل آن را در بالا مشاهده فرموديد ) به آن متصل مي شود. (سيم ديتاي سوکت موس بايد به پايه ورودي وقفه متصل شود (شما مجازيد از دوپايه INT0 و INT1 ( پايه 16 و 17 ميکرو مگا 16 )استفاده کنيد)) .
Clock : نام پايه اي از ميکرو است که سيم کلاک پورت موس کامپيوتر به آن متصل مي شود.
با دستور زير ميتوانيد کد هاي دلخواه را به کامپيوتر ارسال کنيد
Ps2mou***y X , Y, Button
X و Y مختصات مکان توقف اشاره گر موس است که از -255 تا 255 مي باشد.
Button : عدد معادل کليد فشرده شده ميباشد ( در روي موس 3 کليد اصلي وجود دارد : کليد راست ، کليد چپ، کليد وسط ) که رقم معادل هر کليد در زير امده است
0 – no buttons pressed
صفر : هيچ کليدي فشرده نشده است
1- left button pressed
يک : کليد سمت چپ فشرده شده است
2- right button pressed
دو : کليد سمت راست فشرده شده است
4- middle button pressed
چهار : کليد وسط فشرده شده است
با دستور زير نيز مي توانيد کد هاي مربوط به موس را از جدول بخوانيد و به کامپيوتر ارسال کنيد
Sendscan Lable
Lable : نام برچسبي است که کد ها در آن و جود دارد .
مانند:
$regfile = "m16def.dat"
$crystal = 8000000
Enable Interrupts
Config Ps2emu = Int0 , Data = Pind.2 , Clock = Pind.1
Config Porta = Input
Dim X As Integer , Y As Integer , Button As Byte
Q:
Debounce Pina.0 , 1 , Mright
Debounce Pina.1 , 1 , Mleft
Debounce Pina.2 , 1 , Mup
Debounce Pina.3 , 1 , Mdown
Debounce Pina.4 , 1 , Rpressed
Debounce Pina.5 , 1 , Lpressed
Debounce Pina.6 , 1 , Mpressed
Ps2mou***y X , Y , Button
Goto Q
Mright:
Incr X : Waitms 500 : Goto Q
Mleft:
Decr X : Waitms 500 : Goto Q
Mup:
Incr Y : Waitms 500 : Goto Q
Mdown:
Decr Y : Waitms 500 : Goto Q
Rpressed:
If Button = 2 Then : Button = 0 : Else : Button = 2 : End If
Waitms 500 : Goto Q
Lpressed:
If Button = 1 Then : Button = 0 : Else : Button = 1 : End If
Waitms 500 : Goto Q
Mpressed:
If Button = 4 Then : Button = 0 : Else : Button = 4 : End If
Waitms 500 : Goto Q
End
مثال:
$regfile = "m16def.dat"
$crystal = 8000000
Enable Interrupts
Config Ps2emu = Int0 , Data = Pind.2 , Clock = Pind.1
Dim A As Byte
Q:
Incr A
Wait 1
Select Case A
Case 1 : Ps2mou***y 0 , 10 , 0 ' up
Case 2 : Ps2mou***y 0 , -10 , 0 ' down
Case 3 : Ps2mou***y -10 , 0 , 0 ' left
Case 4 : Ps2mou***y 10 , 0 , 0 ' right
Case 5 : Ps2mou***y 0 , 0 , 1 ' left button pressed
Ps2mou***y 0 , 0 , 0 ' left button released
Case 6 : Sendscan W
End Select
Goto Q
W:
Data 3 , &H08 , &H00 , &H01
نکته : شما مجازيد فقط يک موس يا کيبرد به کامپيوتر خود متصل کنيد ، اتصال سخت افزار بيشتر ممکن است به کامپيوتر شما اسيب بزند .


اندازه گيري يک خازن يا مقاومت :
شما با استفاده از دستور زير ميتوانيد مقدار ثابت زماني مقاومت و خازني که به پايه دلخواه ميکرو AVR متصل شده است را بدست اوريد :
Var = Getrc ( Pin , number)
Var: يک متغيير از جنس Word ميباشد که مقدار ثابت زماني در آن ريخته مي شود.
PIN : نام پورتي است که خازن و مقاومت به آن متصل است ( مانند PORTA يا PORTD).
Number : شماره پايه اي است که مقاومت و خازن به آن متصل شده است (مانند 1 يا 2 ) ( اين مقدار نميتواند از 7 بيشتر شود )).
در مدارات مقاومت يا خازن که به اختصار به آن RC مي گويند ، خازن بعد از 5 ثابت زماني شارژ مي شود ( بعد از 5t ) مقدار دقيق اين ثابت زماني به مقدار خازن و مقدار مقاومت بستگي دارد و فرمول آن به شکل t = R * C است ، ميکرو مقدار ثابت زماني را اندازه مي گيرد ، شما با داشتن مقدار يکي از المانها ميتوانيد مقدار ديگر را بدست آوريد ،
مانند :
$regfile = "M16DEF.DAT"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Pinc.1 , Db5 = Pinc.2 , Db6 = Pinc.3 , Db7 = Pinc.4 , E = Pind.2 , Rs = Pind.3
Config Lcd = 16 * 2
Config Porta = Output
Dim W As Word
Do
W = Getrc(pina , 7) : W = W / 1000 : Locate 1 , 1 : Lcd W : Wait 2
Loop
end
در مثال بالا مقدار يک خازن اندازه گرفته شده است ، خازن مجهول با يک مقاومت 1 کيلو اهم سري شده و PORTA.7 متصل شده است ، ( شما همچنين ميتوانيد مقدار مقاومت را نيز اندازه گيري کنيد ، به شرطي که مقدار خازن را بدانيد) مدار مثال بالا را در زير مشاهده مي کنيد :
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
#15
فصل پنجم : ورودی آنالوگ و وقفه
مبدل آنالوگ به ديجتال(ADC) :
گاهي نياز است که يک کميت بيروني (مانند دما و شدت صدا و شدت نور و... ) اندازه گيري شود ، براي اينکار از وسيله اي به نام سنسور استفاده مي شود. سنسور ها مقدار يک کميت آنالوگ را به ولتاژ يا جريان تبديل مي کند ، سپس اين ولتاژ انالوگ به مبدل انالوگ به ديجتال ميکرو داده مي شود و مبدل انالوگ به ديجتال مقدار ولتاژ را به کميت ديجتال متناظر تبديل ميکند ، سپس اين مقدار ديجتال با اعمال رياضي به مقدارعددي متناظر تبديل مي شود و روي LCD يا سون سگمنت نمايش داده مي شود .
حداکثر ولتاژي که مبدل انالوگ به ديجتال ،که از اين به بعد به آن Adcمي گوييم ميتواند اندازه بگيرد برابر با VCC است و اگر ولتاژ اعمالي از VCC بيشتر شود ممکن است مبدل انالوگ به ديجتال آسيب ببيند (معمولا بيشرين ولتاژ ورودي که به ADC اعمال ميکنند 4.5 ولت است) و کمترين ولتاژ اعمالي برابر با GND است .ADC به ازاي ولتاژ 5 ولت عدد 1023 و به ازاي صفر ولت عدد صفر را در متغيير مربوطه قرارمي دهد .
Adcبا دستور زير راه اندازي مي شود :
Config Adc = Single/Free , Prescaler = Auto , Reference = Opt
گزينه هاي single/free : در حالتي که Single انتخاب شود مقدار ديجتال سيگنال انالوگ توسط دستور Getadc در يک متغيير از جنس Word ريخته مي شودو در حالتي که Free انتخاب شود مقدار ديجتال سيگنال انالوگ کانال صفر در ريجيستر مربوط به Adc ريخته مي شود .
Prescaler : اين گزينه فرکانس ADC را مشخص ميکند و در حالتي که Autoانتخاب شود کامپاير با توجه به کريستال انتخاب شده بهترين کلاک را در نظر مي گيرد ، موارد ديگر براي کلاک عبارتند از 2 و 4 و 8 و 15 و 32 و 64 يا 128 است که يه جاي گزينه Auto نوشته مي شود .
هر چه عدد کمتری وارد شود فرکانس فوق بیشتر است .
Reference : در صورتي که بخواهيد از يک ولتاژ مرجع استفاده کنيد اين گزينه را بنويسيد (در صورت عدم استفاده از اين دستور ولتاژ مرجع زمين است و نيازي به نوشتن اين دستور نيست) .
(اين امکان فقط در بعضي از ميکرو ها وجود دارد ) Opt ميتواند يکي از موارد زير باشد :
Off : در اين حالت ولتاژمرجع داخلي خاموش شده و از ولتاژ مرجع بر روي پايه Aref استفاده مي شود.
Avcc : در اين حالت ولتاژ پايه Avcc به عنوان ولتاژ مرجع در نظر گرفته مي شود .
Internal : در اين حالت از ولتاژ مر جع داخلي 2.65 ولت استفاده مي شود .
بعد از راه اندازي Adc نوبت به استفاده از آن است براي اينکار با دستور Start Adc ، ADC روشن شده و شروع به نمونه برداري از سيگنال انالوگ موجود بر روي پايه اش مي کند و آن را به مقدار ديجتال تغيير مي دهد ، اين مقدار ديجتال با دستور زير در يک متغيير از جنس Word ريخته مي شود
Var = Getadc (Channel)
Var يک متغيير از جنس Word ميباشد
Channel : شماره : شماره Adc است که سيگنال انالوگ به آن اعمال شده . مانند :
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinb.2 , Db5 = Pinb.3 , Db6 = Pinb.4 , Db7 = Pinb.5 , Rs = Pinb.0 , E = Pinb.1
Config Adc = Single , Prescaler = Auto
Dim A As Word
Start adc
Q:
A = Getadc(1)
Locate 1 , 1
Lcd A
Goto Q
End
در خط هاي اول LCD و ADC پيکر بندي شده است در خط دهم مقدار انالوگ داده شده به پايه 24 ميکرو (PORTC.1) بعد از تبديل به مقدار ديجتال در متغيير A ريخته مي شود وسپس اين متغيير در سطر اول وستون اول LCD به نمايش در مي آيد .
مثال :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Adc = Single , Prescaler = Auto
Dim A As Word , B As Word , C As Word , D As Word , E As Word , F As Word , G As Word , H As Word
Cls
Q:
A = Getadc(0) : Locate 1 , 1 : Lcd A
B = Getadc(1) : Locate 1 , 8 : Lcd B
C = Getadc(2) : Locate 2 , 1 : Lcd C
D = Getadc(3) : Locate 2 , 8 : Lcd D
E = Getadc(4) : Locate 3 , 1 : Lcd E
F = Getadc(5) : Locate 3 , 8 : Lcd F
G = Getadc(6) : Locate 4 , 1 : Lcd G
H = Getadc(7) : Locate 4 , 8 : Lcd H
Goto Q
End
در اين مثال از ميکرو مگا 16 و LCD 16*4 استفاده شده است ، ميکرو مگا 16 داراي 8 کانال ADC ميباشد ، که در اين مثال از همه ADC هاي اين ميکرو استفاده شده است .
ممکن است اين سوال براي شما پيش بيايد که : ADC نمي تواند بيشتر از 5 ولت را اندازه گيري کند ، ما ولتاژ هاي بالا تر را چگونه اندازه بگيريم؟ براي اندازه گيري ولتاژ هاي زياد شما بايد آن را با مقاومت کم کنيد ، فرض کنيد يک ولتاژ از 0 تا 200 ولت متغيير داريد و ميخواهيد آن را با ميکرو اندازه بگيريد ، شما بايد اين ولتاژ متغيير را به 0 تا 5 ولت تبديل کنيد ...
اين موارد در بخش پروژه ها آورده شده است.

مقايسه کننده انالوگ :
مقايسه کننده آنالوگ مقادير ولتاژ آنالوگ موجود بر روي دو پايه خود را ( پايه مثبت (AIN0) و پايه منفي (AIN1) ) با هم مقايسه مي کند . (مانند OP-AMP ) زماني که ولتاژ موجود در ورودي مثبت بيشتر از ولتاژ موجود در ورودي منفي باشد ، خروجي مقايسه کننده (AC0) يک مي شود . مقايسه کننده داراي يک پرچم وقفه مجزا است . خروجي مقايسه کننده مي تواند به عنوان تريگر ورودي CAPTURE تايمر/ کانتر يک نيز استفاده شود .
دستور پيکره بندي مقايسه کننده آنالوگ
Config Aci = On/Off , Compare = On/Off , Triggle = Toggle/Rising/Falling
Config Aci = On/Off : در زمان استفاده از مقايسه کننده بايد يک باشد . (در صورت استفاده از صفر مقايسه کننده کار نخواهد کرد).
Compare = On/Off: در صورت انتخاب On ، AC0 مستقيما به ورودي Capture تايمر/کانتر يک وصل مي شود.
Triggle = Toggle/Rising/Fallingl : نحوه روي دادن وقفه مقايسه کننده را نشان مي دهد.
Falling : يک لبه پايين رونده در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
Rising : يک لبه بالا رونده در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
Toggle : يک به صفر يا يک صفر به يک در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
مثال :
$regfile = "m8def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portc.0
Config Portd = Input
Config Aci = On , Compare = On , Trigger = Falling
Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 1024
Enable Interrupts
Enable Icp1
Enable Aci
On Aci Q
Dim A As Byte
Do
Locate 1 , 1
Lcd Timer1
Loop
End
Q:
Locate 2 , 1
Lcd Capture1
Stop Timer1
Return
در مثال بالا تايمر يک در مد Capture راه اندازي شده است ، در اين مد در صورتي که يک لبه به پايه ICP (پايه 14 مگا 8 ) اعمال شود ،مقدار شمرده شده توسط تايمر 1 در ريجستر Capture1 ريخته مي شود و شما ميتوانيد از اين مقدار استفاده کنيد . در مثال به جاي لبه بالا رونده از وقفه مقايسه گر استفاده شده است ، هنگامي مقدار ولتاژ پايه مثبت مقايسه گر از ولتاژ پايه منفي بيشتر شود وقفه فعال شده و مقدار شمرده شده توسط تايمر در ريجستر Capture1 ريخته مي شود و سپس در موقعيت 2و1 روي LCD به نمايش در ميايد ، شما ميتوانيد در زير روال وقفه از هر دستور ديگري نيز استفاده کنيد ، با اسفاده از اين روش ميتوان زمان تناوب پالس رو اندازه گرفت.
کار با تایمر ها را در بخش های بعدی یاد خواهید گرفت .

راه اندازي وقفه هاي خارجي :
با استفاده از دستور زير ميتوان منابع وقفه خارجي را راه اندازي کرد :
Config IntX = State
intX : X نام پايه وقفه است که در اکثر ميکرو ها به نام INT0 و INT1 و در بعضي از ميکرو ها مانند مگا 64 به نام INT0 تا INT7 موجود است .
State : نوع پالس اعمالي براي فعال شده وقفه را معين ميکند ، State ميتواند يکي از موارد زير باشد:
Falling : با اعمال يک پالس پايين روند ( يک به صفر ) به پايه مورد نظر وقفه فعال مي شود .
Rising : با اعمال يک پالس بالا رونده( صفر به يک ) به پايه مورد نظر وقفه فعال مي شود.
Low Level : با اعمال سطح صفر به پايه مورد نظر وقفه فعال مي شود.
سپس با دستور Enable Interrupts وقفه سراسري و بادستور Enable IntX وقفه پيکر بندي شده فعال مي شود.و در نهايت شما ميتوانيد با دستور On IntX Lable ، به هنگام اعمال پالس به Lable مورد نظر پرش کنيد .با فعال شدن وقفه ، پايه هاي ورودي وقفه در همه حالت ها چک مي شود و نيازي به اوردن دستورات در حلقه اصلي وديگر حلقه ها نيست . باز گشت از زير بزنامه با دستور Return انجام مي شود .
مانند:
$regfile = "m16def.dat" : $crystal = 8000000
Config Porta = Output
Config Int0 = Falling
Config Int1 = Rising
Enable Int0
Enable Int1
Enable Interrupts
On Int0 Q
On Int1 W
Do
Set Porta.2 : Waitms 500 : Reset Porta.2 : Waitms 500
Loop
End
Q:
If Porta.0 = 0 Then : Set Porta.0 : Else : Reset Porta.0 : End If
Return
W:
If Porta.1 = 0 Then : Set Porta.1 : Else : Reset Porta.1 : End If
Return

در برنامه بالا از دو منبع وقفه INT0 و INT1 استفاده شده است ، همانگونه که ميبينيد به يکي از پايه ها يک پالس بالا رودنده و به ديگري پالس پايين رونده اعمال مي شود.
در حلقه ي اصلي مدام يکي از پايه ها خاموش وروشن مي شود ، درو منبع وقفه مدام چک ميشوند ، هنگامي که پالس مشخص شده به پايه وقفه اعمل شد به زير برنامه تعريف شده (Q براي منبع وقفه صفر و W براي منبع وقفه یک) پرش مي شود و وضعيت دو LED تغيير ميکند . مدار مورداستفاده را مشاهده مي فرماييد . (اين ميکرو داراي منبع وقفه خارجي سوم نيز ميباشد که در اينجا استفاده نشده (INT2 پايه B.3) ميتوانند واردشود .

WATCHDOG:
WATCHDOG يکي از تايمر هاي ميکرو است که ميتواند تا يک زمان خاص بشمارد و ميکرو را ريست کند ، اين تايمر ميتواند تا 8 زمان 16 ، 32، 64 ، 128 ، 256 ، 512 ، 1024 و 2048 و در بعضي از ميکروها 4096 , 8192 ميلي ثانيه بشمارد ، بعد از سپري شدن زمان ميکرو ريست مي شود و برنامه دوباره از ابتدا اجرا مي شود ، راه اندازي WATCHDOG به فرم زير است :
Config Watchdog = Time
Time : يکي از زمان هاي گفته شده در بالا ميباشد ( 16 ، 32، 64 ، 128 ، 256 ، 512 ، 1024 و 2048 و در بعضي از ميکروها 4096 , 8192 ميلي ثانيه) . با دستور Start Watchdog تايمر شروع به شمارش مي کند و پس از سپري شدن زمان ميکرو ريست مي شود.
مانند :
$regfile = "m16def.dat"
$crystal = 8000000
Config Porta.0 = Input
Config Porta.1 = Output
Config Watchdog = 1024
Do
If Pina.0 = 0 Then
Set Porta.1
Else
Start Watchdog
End If
Loop
End
در مثال بالا پايه A.0 ( که در حالت عادي 1 است) مدام چک مي شود و در صورتي که پايه 0 شود ميکرو بعد از 1024 ميلي ثانيه ريست مي شود.
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
#16
فصل ششم : تایمر و کانتر
ميکرو هاي AVR نهايتا داراي سه تايمر / کانتر هستند (به جز, MEGA64 , MEGA162 MEGA128 وتعداد محدود ديگرکه 4 تايمر یا بیشتر دارند) . اين تايمر / کانتر ها به نام هاي تايمرکانتر 0 و تايمرکانتر1 و تايمرکانتر2 و تايمرکانتر 3 ، نام گذاري مي شوند . کار تايمر ها شمردن تا يک عدد خاص و کار کانتر ها شمردن يک پالس ، که به پايه مخصوص اعمال مي شود است ، از تايمر و کانتر استفاده هاي ديگري نيز مي شود ، مانند ساخت پالس PWM و ...که در ادامه آنها را معرفي مي کنيم .

اولين تايمر /کانتري که معرفي مي شود تايمر صفر است ، در زير مشخات اين مورد را مشاهده ميفرماييد:
1- اين تايمر/ کانتر 8 بيتي است ، و نهايتا ميتواند تا 8^2 (255( بشمارد .
2- کلاک اين تايمر ميتواند تو سط نوسان ساز داخلي يا نوسان ساز خارجي تامين شود (مقدار فرکانس نوسان ساز بر عدد Preacale تقسيم مي شود).
3- اين تايمر داراي چندين منبع وقفه ميباشد که شما ميتوانيد آنها را در هر قسمت از برنامه فعال يا غير فعال کنيد . از اين منابع و قفه ميتوان وقفه سرريزي را نام برد.
4- اين تايمر/کانتر ميتواند در مد تايمر و کانتر راه اندازي شود .
5- ورودي کانتر پايه T0 (در ميکرو مگا 16 پورت B.0 ، پايه شماره1) مي باشد .


راه اندازي تايمر صفر:
تايمر صفر با دستور زير پيکر بندي مي شود:
Config Timer0 = Timer , Preacale = 1 | 8 | 64 | 256 | 1024
عدد Preacale فرکانس (دقت ) تايمر را معيين ميکند .
بعد از دستور بالا، تايمر با دستور Start Timer0 شروع به شمارش ميکند و با دستور Stop Timer0 متوقف مي شود.
تايمر پس از شمردن تا 255 سر ريز مي شود .
شما با استفاده از دستور Enable Ovf0ياEnable Timer0 ميتوانيد و قفه سرريزي تايمر را راه اندازي کنيد . در صورتي که وقفه سرريزي تايمر فعال باشد ، تايمر پس از سرريزي به برچسبي که با يکي از
دستورات On Ovf0 Lable و يا On Timer0 Lable مشخص شده پرش ميکند ، باز گشت از وقفه با دستور Return انجام مي شود.
شما همچنين ميتوانيد با استفاده از دستور Var = Timer0 ، مقدار تايمر را در يک متغير از جنس بايت قرار دهيد و يا با دستور Timer0 = Value ، مقدار اوليه اي در تايمر قرار داد تا تايمر از آن شروع به شمارش کند .
در اين مثال ميخواهيم توسط تايمر صفر زمان 1 ثانيه بسازيم ، طبق فرمول اگر شما از کريستا ل 1 مگا هرتز ( که کمترين مقدار کريستال مورد استفاده براي AVR ميباشد (به جز کريستال ساعت )) و Preacale ، 1024 استفاده نماييد ، بيشترين زماني که ميتوانيد ايجاد کنيد برابر است با :
زمان=1000000/(256*10244)
بنابراين ما بايد از وقفه سريزي تايمر استفاده کنيم ، و در هر بار وقفه به يک متغير عددي يک واحد بيفزاييم ، هنگامي که متغيير برابر4 شد ، متغيير صفر شود و يک واحد به متغير اصلي افزوده شود . بنابراين با ضرب کردن زمان بدست امده در 4 زمان اصلي بدست ميايد که برابر با 1048 ميلي ثانيه است .
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim B As Byte , C As Byte
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
On Timer0 P
Start Timer0
Do
Loop
End
P:
Locate 1 , 8 : Lcd B
Incr B
If B > 3 Then : Incr C : Locate 1 , 1 : Lcd C : B = 0 : End If
return
در اين برنامه ، هنگامي که تايمر سرريز مي شود (تا 255 ميشمارد) به زير برنامه P پرش مي شود و يک واحد به متغيير B افزوده مي شود ، شرط If ميگويد که اگر مقدار متغير B برابر با 4 شد يک واحد به متغير C اضافه کن و آن را در سطر اول ، ستون اول LCD نمايش بده ، بعد متغير B را صفر کن ، از آنجا که مقدار B به 4 نريسيده (در اولين رجوع مقدار B 1 مي شود) اين شرط اجرا نمي شود .
با دستور Return به برنامه تايمر برميگردد . مقدار تايمر صفر شده و دوباره تا 255 شمرده مي شود ... و اين عمل مدام تکرار مي شود. با چند دستور ساده ميتوان از برنامه بالا يک ساعت ساخت .

راه اندازي کانتر صفر :
کانتر صفر در بسکام با دستور زير پيکربندي مي شود:
Config Timer0 = Counter , Edge = Rising / Falling
با انتخاب Edge = Rising کانتر نصبت به لبه ي بالا رونده حساس است
با انتخاب Edge = Falling کانتر نصبت لبه ي پايين رونده حساس است
(لبه هاي بالا رونده يا پايين رونده را ميشمارد (بالا رونده >صفر به يک و پايين رونده< يک به صفر))
شما همچنين ميتوانيد با استفاده از دستور Var = Counter0 ، مقدار کانتر را در يک متغير از جنس بايت قرار دهيد و يا با دستور Counter0 = Value ، مقدار اوليه اي درکانتر قرار دهيد تا کانتر از آن شروع به شمارش کند.کانتر نيز مانند تايمر پس از شمردن تا 255 سر ريز مي شود ، شما با استفاده از دستور Enable Ovf0 ميتوانيد وقفه سر ريزي کانتر را راه اندازي کنيد . در صورتي که وقفه سرريزي کانتر فعال باشد ، کانتر پس از سرريزي به برچسبي که با يکي از دستورات On Ovf0 Lable و يا On Timer0 Lable مشخص شده پرش ميکند ، باز گشت از وقفه با دستور Return انجام مي شود.
مثال :
در اين مثال کانتر صفر تعداد پالسهاي اعمالي به پايه T0 (پايه شماره 1 مگا 16 ) را ميشمارد و پس از شمردن تا مقدار 255 ، به زير برنامه وقفه ميرود ، در آنجا يک واحد به متغيير B افزوده مي شود ، متغيير B تعداد دفعات سرريزي کانتر را نشان ميدهد که ما آن را روي سطر دوم LCD به نمايش ميگذاريم ، برنامه با دستور Return از زير برنامه خارج مي شود و به حلقه اصلي برمي گردد .
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim B As Byte
Config Timer0 = Counter , Edge = Rising
Enable Interrupts
On Counter0 P
Do
Locate 1 , 1 : Lcd Counter0
Loop
End
P:
Incr B : Locate 2 , 1 : Lcd "tedad dafeat sarrizi" ; B
Return
نکته : عملکرد تايمر و کانتر از عملکرد ساير قسمت ها جدا بوده و ديگر اعمال (مانند دستورات تاخير مثل wait و...) بر عملکرد آن اثري ندارد.

تايمر / کانتر يک :
در زير مشخات اين مورد را مشاهده ميفرماييد:
1- اين تايمر کانتر 16 بيتي است ، و نهايتا ميتواند تا 16^2 (65535( بشمارد.
2- کلاک اين تايمر ميتواند تو سط نوسان ساز داخلي يا نوسان ساز خارجي يا از پايه T1 (در مگا 16 پايه شماره2 (PORTB.1) توسط پالس خارجي، تامين شود (مقدار فرکانس نوسان ساز بر عدد Preacale تقسيم مي شود).
3- تايمر / کانتر يک داراي دو خروجي مقايسه اي است که دو رجيستر OCR1A و OCR1B 3مقدار مقايسه اي را در خود جاي مي دهند و با محتواي تايمر/کانتر مقايسه مي شوند .
4- در زمان تساوي محتواي رجيستر مقايسه و محتواي تايمر/کانتر ، وضعيت پايه هاي خروجي مد مقايسه اي OC1A و OC1Bمي تواند تغيير کند.
5- تايمر / کانتر در مد Capture نيز مي تواند به کار رود . با تحريک پايه ICP مي توان محتواي تايمر/ کانتر را در رجيستر ورودي Capture(Icr1) قرار داد.
6- خروجي مقايسه کننده آنالوگ نيز مي تواند به عنوان تريگر ورودي Capture قرار گيرد.
7- اين تايمر داراي چندين منبع وقفه ميباشد که شما ميتوانيد آنها را در هر قسمت از برنامه فعال يا غير فعال کنيد. از اين منابع و قفه ميتوان ، وقفه سرريزي را نام برد.
8- اين تايمر کانتر ميتواند در مد تايمر و کانتر وPWM راه اندازي شود.
9- ورودي کانتر پايه T1 (در ميکرو مگا 16 پورت B.0 ، پايه شماره1) ميباشد و خروجي پالس PWM پايه هاي OC1A و OC1B (در ميکرو مگا 16 به ترتيب پايه هاي 18و19 (PORTD.4 و D.5)است همچنين دو پايه ي فوق ميتوانند به عنوان خروجي مد مقايسه اي تايمر مورد استفاده قرار بگيرند .

راه اندازي تايمر يک :
تايمر 1 با دستور زير پيکربندي مي شود :
Config Timer1 = Timer , Prescale = 1| 8 | 64 | 256 | 1024
عدد Preacale فرکانس تايمر را معيين ميکند .فرکانس و زماني که تايمر ميشمارد از فرمولهاي زير محاسبه ميشوند:
فرکانس = مقدار کریستال/precacle
بعد از دستور بالا، تايمر با دستور Start Timer شروع به شمارش ميکند و با دستور STOP TIMER متوقف مي شود.تايمر پس از شمردن تا 65536 (16^2) سر ريز مي شود ، شما با استفاده از دستور ENABLE OVF1ياENABLE INTRRUPTS ميتوانيد وقفه سر ريزي تايمر را راه اندازي کنيد . در صورتي که وقفه سرريزي تايمر فعال باشد ، تايمر پس از سرريزي به برچسبي که با يکي از دستورات ON OVF1 LABLE و يا ON TIMER1 LABLE مشخص شده پرش ميکند ، باز گشت از وقفه با دستور RETURN انجام مي شود.
شما همچنين ميتوانيد با استفاده از دستور VAR = TIMER1 ، مقدار تايمر را در يک متغير از جنس word قرار دهيد و يا با دستور TIMER1 = VALUE ، مقدار اوليه اي در تايمر قرار دهيد تا تايمر از آن شروع به شمارش کند.
در اين مثال ميخواهيم توسط تايمر 1 يک ساعت بسازيم ، براي اين کار ابتدا بايد يک زمان 1 ثانيه اي ايجاد کنيم طبق فرمول اگر شما از کريستا ل 4 مگا هرتز و PRESCALE ، 64 استفاده نماييد ، ميتوانيد زماني برابر با 1.04 ثانيه ايجاد کنيد ، با مقادير ديگر نيز ميتوانيد زمان هاي دقيق تر بسازيد .(بيشترين زماني که با اين تايمر ميتوانيد بسازيد برابر با 67.108864 ثانيه ميباشد)
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim San As Byte , Da As Byte , Saat As Byte
San = 0 : Da = 0 : Saat = 1
Config Timer1 = Timer , Prescale = 64
Enable Interrupts
Enable Timer1
On Timer1 P
Start Timer1
Do
Locate 1 , 1 : Lcd Saat ; ":" ; Da ; ":" ; San
Loop
End
P:
Incr San
If San > 59 Then : Incr Da : San = 0 : End If
If Da > 59 Then : Incr Saat : Da = 0 : End If
If Saat > 12 Then : San = 1 : End If
Return
در برنامه بالا هنگامي که تايمر سرريز مي شود به زير برنامه p پرش مي شود در آنجا متغيير ثانيه 1 واحد افزايش مي يابد ، ....
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
#17
راه اندازي تايمر 1 در مد مقايسه اي (Compare :
در اين مد شما ميتوانيد مقدار تايمر 1 را با دو عدد دلخواه مقايسه کنيد و درصورت برابري يا نابرابري مقدار تايمر با مقدار دلخواه وضعيت پايه هاي oc1a و oc1b را تغيير دهيد. راه اندازي تايمر يک در مد مقايسه اي با دستورات زير انجام مي شود:
CONFIG TIMER1= TIMER,COMPARE A = CLEAR |SET|TOGGLE|DISCONNECT,COMPARE B = CLEAR |SET|TOGGLE|DISCONNECT, PRESCALE=1|8|64|256|1024,CLEAR TIMER =1|0
COMPARE A = CLEAR |SET|TOGGLE|DISCONNECT : زماني که مقدار شمرده شده توسط تايمر 1 با مقدار COMPARE A ، که بعدا معرفي مي شود ، برابر شد ،پايه خروجي OC1A مي تواند SET(يک) ,(صفر) CLEAR ,(برعکس ) TOGGLE و يا ارتباط پايه با مد مقايسه اي قطع شود (پايه oc1a به يک ورودي خروجي عادي تبديل شود).
COMPARE B = CLEAR |SET|TOGGLE|DISCONNECT : زماني که مقدار شمرده شده توسط تايمر 1 با مقدار COMPARE B ، که بعدا معرفي مي شود ، برابر شد ،پايه خروجي OC1B مي تواند SET(يک) ,(صفر) CLEAR ,(برعکس ) TOGGLE و يا ارتباط پايه با مد مقايسه اي قطع شود (پايه oc1b به يک ورودي خروجي عادي تبديل شود).
PRESCALE=1|8|64|256|1024 : عدد PREACALE فرکانس (دقت ) تايمر را معيين ميکند.
CLEAR TIMER = 1|0 : با انتخاب گزينه 1 ،محتواي تايمر/کانتر در زمان تطابق مقايسه اي RESET ($0000 ) مي شود و در صورت انتخاب 0 مقدار شمرده شده تغييري نميکند.
با دستورات زير ميتوان عددي را که محتواي تايمر بايد با آن مقايسه شود را تعيين کرد
Compare1a = x
Compare1b =x
به جاي x يک عدد ثابت يا يک متغيير قرار ميگيرد ، هنگامي که عدد شمرده شده توسط تايمر يک با اعداد گذاشته شده برابر شد ميکرو وضعيت پايه هاي مربوطه را همانگونه که در پيکربندي مشخص کرديد تغيير ميدهد.
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Compare A = Set , Compare B = Toggle , Prescale = 1024 , Clear Timer = 0
Compare1a = 1000
Compare1b = 5000
Do
Locate 1 , 1
Lcd Timer1
Loop
End
هنگامي که تايمر 1 تا 1000 شمرد پايه OC1A يک مي شود و هنگامي که مقدار شمرده شده به 5000 رسيد پايه OC1B يک مي شود (OC1A پايه 19 و OC1B پايه 18 مگا 16 ميباشد).

استفاده از وقفه مد مقايسه اي تايمر 1 :
مد مقايسه اي داراي 2 منبع وقفه ميباشد که با دستورات زير فعال ميشوند:
Enable Interrupts
Enable Oc1a
Enable Oc1b
با دستور فعال سازي وقفه مقايسه ، هنگامي که مقدار شمرده شده توسط ميکرو با Compare1a برابر شد cpu ميکرو با دستور on oc1a lable به برچسب مورد نظر برش ميکند و در آنجا عمليات دلخواه را انجام ميدهد، هنگامي که مقدار شمرده شده توسط ميکرو با Compare1b برابر شد cpu ميکرو با دستور on oc1b lable به برچسب مورد نظر برش ميکند و در آنجا عمليات دلخواه را انجام ميدهد. در صورتي که در پايان برچسب دستور Return گذاشته شود CPU به حلقه ي اصلي پرش ميکند.
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Compare A = Set , Compare B = Toggle , Prescale = 1024 , Clear Timer = 0
Compare1a = 2120
Compare1b = 63000
Enable Interrupts
Enable Oc1a
Enable Oc1b
On Oc1a Q
On Oc1b W
Do
Locate 1 , 1
Lcd Timer1
Loop
End
Q:
Locate 2 , 1
Lcd Timer1
Return
W:
Locate 2 , 8
Lcd Timer1
Return
در مثال بالا هنگامي که رقم شمرده شده توسط تايمر با مقدار Compare1a (2120) برابر شد cpu به برچسب q پرش ميکند و در آنجا مقدار شمرده شده توسط تايمر را بر روي lcd نمايش داده و با دستور return به حلقه ي اصلي برميگردد ، هنگامي که رقم شمرده شده توسط تايمر با مقدار Compare1b (63000) برابر شد cpu به برچسبw پرش ميکند و در آنجا مقدار شمرده شده توسط تايمر را بر روي lcd نمايش داده و با دستور return به حلقه ي اصلي برميگردد .همچنين در مورد اول پايه oc1a يک مي شود و در مورد دوم وضعيت پايه oc1b تغيير ميکند ( در صورت 0 بودن يک مي شود و بلعکس).

راه اندازي تايمر 1 در مد CAPTURE :
در صورتي که تايمر يک را در اين مد پيکربندي کنيد ، با اعمال يک پالس بالا رونده يا پايين رونده (که نوع آن در هنگام پيکر بندي مشخص مي شود ) به پايه icp (پايه 20 مگا 16 ) ، در همان لحظه مقدار شمرده شده توسط تايمر 1 در ريجيستر CAPTURE قرار ميگيرد ، محتواي رجيستر CAPTURE را مي توان با دستور VAR = CAPTURE در يک متغيير از جنس word قرار داد .
راه اندازي تايمر يک در مد CAPTURE با دستورات زير انجام مي شود:
Config Timer1 = Timer, Capture Edge= Falling | Rising ,Noise Cancel=1|0 , Prescale =1|8|64|256|1024
Capture Edge= Falling | Rising : اين گزينه مشخص ميکند ، پالس اعمالي به پايه icp بالا رونده (Falling) است يا پايين رونده (Rising).( CAPTURE به کدام پالس حساسيت نشان ميدهد)
Noise Cancel=1|0 : در صورت انتخاب يک از نويز هاي موجود بر روي پايه icp چشم پوشي مي شود و هر پالس با لبه ي تعين شده ميتواند CAPTURE را راه اندازي کند ،در صورت انتخاب صفر فقط پالس هاي با دامنه ي 5 ولت قادر به راه اندازي CAPTURE خواهند بود.
Prescale =1|8|64|256|1024 :دقت تايمر را نشان ميدهد (با استفاده از اين مقدار و مقدار کريستال ميتوانيد زمان شمرده شده توسط تايمر تا هنگام سرريزي را با فرمولي که در بالا گفته شد محاسبه کنيد) با دستور Enable Icp1 اين مد فعال مي شود و پايه icp اماده دريافت پالس ميگردد . مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 1024
Do
Locate 1 , 1
Lcd Timer1
Locate 2 , 1
Lcd Capture1
Loop
End

در مثال بالا هنگامي که يک پالس بالا رونده به پايه icp اعمال مي شود مقدار شمرده شده توسط تايمر 1 درون ريجيستر Capture قرار ميگيرد و سپس بر روي lcd نمايش داده مي شود . مدار استفاده شده براي مثال بالا و ساير مثال هاي اين بخش را مشاهده مي فرماييد
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
  


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش اصطلاحات میکرو AVR a.mehran 1 3,491 09-26-2014، 04:45 PM
آخرین ارسال: a.mehran
  مدار فاصله سنج اولتراسونیک با بسکام a.mehran 2 2,484 09-02-2014، 07:56 AM
آخرین ارسال: a.mehran
  pwm با بسکام a.mehran 0 1,626 09-01-2014، 10:02 PM
آخرین ارسال: a.mehran
  راه اندازی سون سگمنت با بسکام a.mehran 0 1,696 09-01-2014، 09:56 PM
آخرین ارسال: a.mehran

پرش به انجمن:


Browsing: 1 مهمان