آموزش کامل بسکام به همراه مثال - نسخه قابل چاپ +- Parsi Coders (http://parsicoders.com) +-- انجمن: Electronics and Robotics (http://parsicoders.com/forumdisplay.php?fid=149) +--- انجمن: micro (http://parsicoders.com/forumdisplay.php?fid=154) +---- انجمن: AVR (http://parsicoders.com/forumdisplay.php?fid=155) +---- موضوع: آموزش کامل بسکام به همراه مثال (/showthread.php?tid=3685) صفحات
1
2
|
RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 نقل قول: فصل چهارم : راه اندازي امکانات جانبي RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 اتصال کي پد : ابتدا در مورد چگونگي کار کي پد بحث کنيم . در زير شکل اين وسيله را مشاهده مي کنيد . 'گاهي به تعداد زيادي کليد نياز داريم ، ما بايد اين کليد ها را به ميکرو متصل کنيم و مدام آنها را چک نماييم . براي اين کار دو راه وجود دارد که روش اول اتصال هر کليد به يک پايه و روش دوم استفاده از صفحه کليد ماتريسي است . روش اول، چون تعداد زيادي از پايه هاي ميکرو اشغال مي شود،کمتر مورد استفاده قرار مي گيرد .دستور بسکام براي استفاده از صفحه کليد ماتريسي که از اين به بعد به آن 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 در برنامه بالا براي اينکه حجم کمتري اشغال شود دستورات به صورت سطري نوشته شده اند ، شما ميتوانيد با قرار دادن علامت دونقطه ( در بين دو دستور آنها را در يک خط بنويسيد ، هعمچنين با قرار دادن علامت ويرگول ( چندين علامت را روي 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 RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 اتصال به عنوان کيبرد کامپيوتر : نکته مهم : اتصال 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 RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 اتصال به عنوان موس به کامپيوتر : نکته مهم : اتصال 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 متصل شده است ، ( شما همچنين ميتوانيد مقدار مقاومت را نيز اندازه گيري کنيد ، به شرطي که مقدار خازن را بدانيد) مدار مثال بالا را در زير مشاهده مي کنيد : RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 فصل پنجم : ورودی آنالوگ و وقفه مبدل آنالوگ به ديجتال(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 ميلي ثانيه ريست مي شود. RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 فصل ششم : تایمر و کانتر ميکرو هاي 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 واحد افزايش مي يابد ، .... RE: آموزش کامل بسکام به همراه مثال - a.mehran - 09-26-2014 راه اندازي تايمر 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 نمايش داده مي شود . مدار استفاده شده براي مثال بالا و ساير مثال هاي اين بخش را مشاهده مي فرماييد |