امتیاز موضوع:
  • 19 رأی - میانگین امتیازات: 4.16
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش AVR از صفر تا بي نهايت !
نویسنده پیام
saeed450 آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 599
موضوع‌ها: 57
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 736
( 2929 تشکر در 511 ارسال )
ارسال: #12
RE: اموزش AVR از صفر تا بي نهايت
سلام قسمت یازدهم نثار شما عزیزان :


1- سلام خوبي
2- سلام ممنون
1- خوب امروز مي خاي چه مبحثي رو شروع كني
2- امروز مي خام در مورد كانتر يا همون شمارنده بگم
1- حالا اين كانتر چكار مي كنه؟
2- كانتر پالس ها رو ميشماره مثلا شما مي خاي يك پاسي رو كه از يك جا توليد شده رو بشماري از كانتر استفاده مي كني كانتر يعني شمارنده .
1- كاربردش چيه؟
2- اولين كاربردي كه به ذهن من ميرسه فركانس متر هستش . به اين صورت كه ما مقدار پالس هايي كه در مدت زمان يك ثانيه توليد ميشه رو اندازه گيري مي كنيم بعد روي LCD نمايش مي ديم
1- پس مي تونيم مثلا از اين كانتر در خط توليد يك كارخانه هم استفاده كنيم كه توليدات يك خط توليد رو بشماره
2- اره ميشه ولي وقتي كه با دستور INCR مي توني اين كار رو بكني چرا با كانتر اين كار رو انجام بدي
1- راست ميگي يا . گفتي كه يكي از كاربرداش فركانس متر هستش ميشه يكم بيشتر توضيح بدي
2- تعريف فركانس تعداد پالس هايي كه در مدت زمان يك ثانيه توليد ميشه هستش . يعني اگه ما بتونيم تعداد پالس هايي روكه در مدت زمان يك ثانيه توليد ميشه رو اندازه گيري كنيم ميشه گفت كه فركانس متر درست كرديم . به طور كلي براي اين كار ميايم كانتر و تايمر رو همزمان با هم راه اندازي مي كنيم تايمر رو روي يك ثانيه مي زاريم كه هر يك ثانيه بره و مقدار كانتر رو بخونه و روي LCD نمايش بده به اين صورت كه ما پالس ها رو به پايه كانتر مي ديم اين پالس ها در مدت زمان يك ثانيه توسط كانتر شمرده مي شه . بعد از يك ثانيه تايمر و كانتر STOP ميشن و مقدار كانتر در مدت زمان يك ثانيه روي ال سي دي نمايش مي ديم .
من اينجا نحوه كار با كانتر يك رو برات مي گم :
پالس هايي رو كه ما مي خاهيم توسط كانتر يك بشماريم رو بايد به پايه T1 بديم .
يك نكته مهم اين كه كانتر يك با 65535 تا پر ميشه و با 65536 تا سرريز ميشه يا به عبارتي صفر ميشه . به زبان ساده تر اگه ما به پايه T1 كه مربوط به كانتر يك هستش 65535 تا پالس بديم كانتر پر ميشه و اگه 65536 تا پالس بديم كانتر سرريز ميشه و دوباره از صفر شروع ميشه.
2- خوب حالا بريم سر دستورات و پيكره بندي كانتر ( counterSad ما در اينجا از تايمر يك به عنوان كانتر استفاده كرده ايم
Config Timer1 = Counter , Edge = Rising
Config Timer1 = Counter : ما در اين جا به ميكرو دستور داديم كه مي خواهيم از تايمر يك به عنوان كانتر استفاده كنيم
, Edge = Rising : ما در اين جا به ميكرو دستور داديم كه مي خواهيم لبه بالا رونده رو بشماريم . اگه خواسته باشيم كه لبه پايين رونده رو بشماريم به جاي RISING مي نويسم FALLING

ENABLE INTERUPTS : اين دستور رو هر بار كه از تايمر كانتر ميكرو استفاده مي كني بايد بنويسي با اين كار وقفه ها رو فعال مي كنيم
ENABLE COUNTER1 : با اين دستور كانتر يك رو فعال كرديم كه هميشه بايد بنويسيش .
ON COUNTER1 SHOW : با اين دستور به ميكرو دستور مي ديم كه هر وقت كه وقفه كانتر 1 خورد برو توي زيربرنامه SHOW يا به عبارت ديگه با اين دستور به ميكرو دستور مي ديم كه هر وقت كانتر سرريز شد ( با همان مقدار 65536 تا ) برو توي زير برنامه SHOW
COUNTER1= X : با اين دستور مي تونيم به كانتر يك مقدار بديم و يعني به جاي X عدد بزاريم مثلا COUNTER = 65530 با اين كار ما كانتر يك رو با مقدار 65530 تا پر كرديم و كانتر از اين مقدار شروع به شمردن مي كند يعني اگه يك پالس به پايه T1 بدم مقدار كانتر ميشه 65531 اگه 6 تا پالس به پايه T1 بديم كانتر سرريز مي كنه و صفر ميشه .
STOP TIMER1 : با اين دستور مي تونيم عمليات شمردن كانتر رو متوقف كنيم . توجه كن كه اگه با اين دستور عمليات شمردن كانتر رو متوقف كنيم مقدار كانتر صفر نمي شه بلكه روي همون مقداري كه تا الان شمرده استپ مي شه .
START TIMER1 : اين دستور عكس STOP TIMER1 هستش يعني هر جا كه ما عمليات شمارش رو توسط دستورSTOP TIMER1 متوقف كرده باشيم با دستور START TIMER1 مي تونيم شمردن رو اغاز كنيم .

بزار يك مثال بزنم كه بهتر بفهمي :
برنامه زير به ازاي هر پالسي كه به پايه T1 ميكروكنترلر مي خوره يك متغيير رو يك واحد اضافه مي كنه

کد:
Config Timer1 = Counter , Edge = Rising
Enable Interrupts
Enable Counter1
On Counter1 Show
Counter1 = 65535
Dim A As WORD
Do
Loop
End
SHOW:
Counter1 = 65535
Incr A
Cls : Lcd A
Return

حالا تحليل برنامه :
در خط اول ما تايمر يك رو در مد كانتر پيكره بندي كرديم يعني به ميكرو گفتيم كه از تايمر يك مي خواهيم به عنوان كانتر (شمارنده) استفاده كنيم و در ادامه همين خط نوشتيم Edge = Rising كه با اين دستور به ميكرو فهمونديم كه لبه بالا رونده رو مي خايم بشماريم اگه ما به جاي RISING مي نوشتيم FALLING ميكرو فقط لبه پايين رونده پالس رو ميشمرد .
خط دوم Enable Interrupts : كه با اين دستور وقفه سراسري رو فعال مي كنيم اين دستور رو هر وقت كه از كانتر يا تايمر استفاده مي كني بايد بزاري .
خط سوم Enable Counter1 : با اين دستور كانتريك رو فعال مي كنيم اين دستور رو هم هر وقت كه از كانتر استفاده مي كني بايد بنويسي.
خط چهارم On Counter1 Show2 : با اين دستور به ميكرو دستور مي ديم كه هر وقت كانتر سرريز شد ( با همان مقدار 65536 تا ) بپر برو توي زير برنامه SHOW ( SHOW اسم زيربرنامه است كه هر اسم دلخواه ديگر مي تواند باشد مثلا AHMAD ).
خط پنجم Counter1 = 65535 : به كانتريك مقدار 65535 داديم يعني كانتر از ادامه اين عدد شروع به شمردن مي كند به جاي اين عدد هر عدد دخواه ديگر هم مي توانيم بدهيم.
خط ششم Dim A As WORD: ما با اين دستور يك متغيير به اسم A و از نوع WORD تعريف كرديم كه در ادامه مي گم كه چه كاري رو انجام ميده.
خط هفتم DO : با نوشتن اين دستور ابتداي حلقه رو مشخص كرديم.
خط هشتم LOOP : با اين دستور انتهاي حلقه رو مشخص كرديم.
خط نهم END : اين دستور يعني انتهاي برنامه كه برنامه هيچ وقت به اين دستور نمي رسه .
خط دهم SHOW : در اينجا يك زير برنامه به اسم SHOW تعريف كرديم كه داخل اين زير برنامه دستورات زير نوشته شده :
خط يازدهم Counter1 = 65535 : اولين دستور داخل زيربرنامه SHOW است كه در اين جا به كانتريك مقدار 65535 داديم يعني كانتر از ادامه اين عدد شروع به شمردن مي كند به جاي اين عدد هر عدد دخواه ديگر هم مي توانيم بدهيم.
خط دوازدهم INCR A : دومين دستور داخل زير برنامه SHOW است كه وقتي ميكرو اين خط رو مي خونه مقدار متغيير A رو يك واحد اضافه ميكنه.
خط سيزدهم Cls : Lcd A : سومين دستور داخل زيربرنامه SHOW است كه با اين دستور ميكرو مقدار متغيير A رو روي LCD نمايش مي ده .
خط چهاردهم RETURN : چهارمين دستور داخل زيربرنامه SHOW است كه با اين دستور ميكرو بر مي گرده اول برنامه .

تحليل دوم :
برنامه از ابتدا توسط ميكرو خونده ميشه :
خط اول ما اومديم تايمر يك رو در مد كانتر استفاده كرديم
خط دوم Enable Interrupts : ما در اين جا وقفه سراسري رو فعال كرديم توجه كن كه هر وقت از تايمر يا كانتر استفاده مي كني اين دستور رو حتما بنويسي تا وقفه سراسري فعال بشه.
خط سوم Enable Counter1 : با اين دستور ميكرو كانتر يك رو فعال مي كنه و ميره سر خط بعدي
خط چهارم On Counter1 Show : ميكرو اين دستور رو مي خونه ولي فعلا تا زماني اين دستور رو اجرا نمي كنه يعني به زير برنامه SHOW پرش نمي كنه تا زماني كه وقتش برسه
1- وقتش چه وقت مي رسه
2- هر وقت كه كانتر يك با مقدار 65536 تا سرريز كنه بدون درنگ اين دستور توسط ميكرو خونده و ميپره توي زير برنامه SHOW
خط پنجم Counter1 = 65535 : با اين دستور ميكرو ميكرو كانتر يك رو تا مقدار 65535 تا پر مي كنه . اين دستور مثل اين هستش كه ما 65535 تا پالس به پايه T1 ميكرو داده باشيم و كانتر هم به اندازه همين مقدار پر شده باشه.
خط ششم DIM A AS WORD : ميكرو وقتي كه به اين خط از برنامه مي رسه مي فهمه كه ما يك متغيير از نوع WORD به اسم A انتخاب كرده ايم و ميره خط بعدي رو مي خونه .
توي خط هفتم و هشتم ما يك حلقه DO - LOOP گذاشتيم ميكرو به محض اين كه اين دستور رو ميخونه ميوفته توي اين حلقه و از اين حلقه بيرون نمياد . خوب حالا رسيديم به قسمت جذاب ماجرا. توي اين گيروداري كه ميكروي بيچاره افتاده توي حلقه ما تنها كمكي كه به اين ميكروي بيچاره ميتونيم بكنيم اينه كه يك پالس ناقابل بديم به پايه T1 ميكرو .
1- خوب چه اتفاقي ميوفته
2- اها يادت مياد كه ما مقدار كانتر رو تا 65535 تا پر كرديم و بهتم گفتم كه مقدار كانتر اگه به 65536 تا برسه كانتر سرريز ميشه و از اونجايي هم كه ما توسط دستور On Counter1 Show به ميكرو دستور داديم كه اگه سرريز كردي بپر برو و توي زير برنامه SHOW
1- خوب اره چه ربطي داره ؟
2- ربطش به اينه كه ما با دادن يك پالس به پايه T1 يك واحد به مقدار كانتر يك اضافه كرديم يعني 65535 + 1 = 65536 فهميدي حالا
1- اها حالا فهميدم
2- پس بزار بقيه ماجرا رو بگم. بعد ازا ين كه ما با دادن يك پالس به پايه T1 مقدار كانتر رو به 65536 رسونديم طبيعتا كانتر سرريز ميشه و چون قبلا بهش دستور داده بوديم كه اگه كانتر سرريز شد بپر توي زير برنامه SHOW ميكرو هم بدون استخاره ميپره ميره توي زير برنامه SHOW و دستوراتي رو كه ما داخل زيربرنامه SHOW نوشتيم رو اجرا ميكنه . حالا فرض رو بر اين ميزاريم كه ما يك پالس به پايه T1 داديم و ميكرو سرريز شده و پريده توي زيربرنام SHOW و بحث رو از اونجا دوباره پي ميگيرم.
بعد از اين كه ميكرو پريد توي زيربرنامه SHOW مياد دستورات داخل اين زيربرنامه رو اجرا ميكنه به ترتيب زير :
اولين دستور داخل زيربرنامه SHOW هست Counter1 = 65535 : چون كه كانتر يك قبلا سرريز شده و مقدارش صفر شده ما بايد دوباره بيايم مقدار كانتر يك رو برگردونيم به حالت قبل يعني 65535 .
دومين دستور داخل زيربرنامه SHOW هست INCR A يعني يك واحد به مقدار متغيير A اضافه كن .
سومين دستور داخل زير برنامه SHOW هست CLS:LCD A به اين معني كه مقدار متغير A رو روي LCD نمايش بده
چهارمين يا به عبارت ديگه اخرين دستور داخل زيربرنامه SHOW هست REUTURN كه با اين دستور ميكرو دوباره ميره توي زير برنامه SHOW و دوباره منتظر يك پالس ديگه ميمونه تا دوباره سرريز بشه و دوباره بپره بره توي زيربرنامه SHOW و دستورات زيربرنامه SHOW رو دوباره اجرا كنه.
1- يك سوال اگه ما خواستيم كه كانتر به جاي اين كه به ازاي هر يك پالس بپره توي زيربرنامه SHOW بياد و به ازاي هر دوتا پالس اين عمل رو انجام بده بايد چه كار كنيم ؟
2- براي اين كار ما بايد يك كاري انجام بديم كه مقدار كانتر به ازاي هر دوتا پالس سرريز بشه يعني بعد از اين كه دوتا پالس به پايه T1 خورد سرريز بشه . پس بايد به جاي Counter1 = 65535 بنويسيم Counter1 = 65534 يعني ما مقدار كانتر رو با 65534 تا پر كرديم و براي سرريز شدن كانتر تا 65536 به دو تا پالس نياز داريم . اينطوري پالس اولي كه به پايه T1 بخوره مقدار كانتر يك واحد افزايش پيدا مي كنه و از 65534 ميرسه به 65535 و هيچ اتفاق خاصي نميوفته ولي با دادن پالس دومي مقدار كانتر يك واحد ديگه افزايش پيدا مي كنه يعني از 65535 ميرسه به 65536 و اينجاست كه كانتر سر ريز ميكنه و ميپره توي زيربرنامه SHOW
1- يك سوال ديگه از كجا بفهميم كه پايه T1 ميكرو كجاست ؟
2- از روي ديتاشيت يا برگه مشخصات ميكرو يك كار ديگه هم مي توني انجام بدي و اون اين كه بري توي سايت www.atmel.com و اونجا مي توني برگه مشخصات اون نوع ميكرويي كه باهاش كار مي كني رو دانلود كني.
1- بازم سوال چرا توي از دستور Counter1 = 65535 دوبار توي برنامه استفاده كردي
2- ببين وقتي كه ما تغذيه ميكرو رو وصل مي كنيم ميكروكنترلر يك بار برنامه رو از اول شروع ميكنه به خوندن و براي اولين بار دستور Counter1 = 65535 رو كه ما در خط پنجم نوشتيم رو مي خونه و با اين دستور كانتر رو با مقدار 65535 تا پر مي كنه و بعدش مي يوفته توي حلقه DO-LOOP بعدش اونقدر توي اين حلقه مي مونه تا ما يك پالس به پايه T1 بديم تا اين كه سرريز بشه و بره توي زير برنامه SHOW . حالا بيا فرض رو بر اين بزاريم كه ما دستور Counter1 = 65535 رو در خط يازدهم ننوشته باشيم . خوب اگه ما اين دستور رو درخط يازدهم ننويسيم ميكرو مياد و تمام دستورات داخل زيربرنامه رو انجام مي ده و با دستور RETURN كه ما در اخر برنامه نوشته بوديم برمي گرده ميره تو حلقه DO-LOOP و از اونجايي كه كانتر يك بار سرريز شده يعني مقدارش صفر شده ديگه با پالس بعدي نميره توي زير برنامه چون الان مقدار كانتر صفر هستش و ما بايد 65536 تا پالس به پايه T1 بديم تا بره توي زير برنامه . حالا ما براي جلوگيري از اين كار اومديم دوبار دستور Counter1 = 65535 رو نوشتيم تا هر بار كه دستورات زير برنامه رو انجام داد مقدار كانتر رو برگردونه به 65535 و دوباره اماده يك پالس بعدي باشه .
پايان

آدمی ساخته ی افکار خویش است فردا همان خواهی شد که امروز اندیشیده ای 038
(آخرین ویرایش در این ارسال: ۲۰-بهمن-۱۳۸۷, ۲۳:۰۴:۴۸، توسط 1nafar.)
۱۶-بهمن-۱۳۸۷, ۲۱:۰۸:۲۱
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, sita_rampail, lord_viper, alaska, godvb, sararobo, joker, sara.ee, WhiteNoise, electrometal, nik118, kamiatash, Pixar, coloop, soham 313, nooshzad, saber.k, jamalmusic
saeed450 آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 599
موضوع‌ها: 57
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 736
( 2929 تشکر در 511 ارسال )
ارسال: #13
RE: اموزش AVR از صفر تا بي نهايت
قسمت دوازدهم

1- سلام خوبی
2- سلام ممنون تو چطوری
1- این بد نیستم . خوب برو سر اصل مطلب امروز می خای چیرو بهم باد بدی
2- امروز می خام برات از INT0 یا وقفه خارجی میکرو برات بگم
1- حالا چی هست کارش چیه ؟
2- کارش فقط و فقط اشکار کردن هستش . یعنی شما در هر جای برنامه که باشی با تحریک کردن این پایه INT0 می تونی به یک زیر برنامه بپری و ...
کاربردش کجا هستش کاربردش توی جا که بخای . به عنوان مثال شما یک برنامه برای یک دستگاه پرس پیشرفته نوشتی که قرار میکروکنترلر روی این دستگاه نصب بشه که توی این برنامه هم کیبرد هستش هم اندازه گیری دما هم تایمر و چندتا کار دیگه . یکی از کارهایی که این دستگاه پرس باید انجام بده اینه که وقتی که پرس داره به سمت پایین میاد یک سنسور فعال میشه و با فعال شدن یا سنسور یک تایمر شروع به شمارش کنه و بعد از مثلا پنج ثانیه پرس برمیگرده به حالت اول . با این اوصاف ما باید برنامه رو طوری طراحی کنیم که برنامه ما در هر وضعیتی که بود بره وتایمر رو فعال کنه . حالا تو اگه باشی برای این قسمت از برنامه چه کار میکنی
1- میام و سنسور رو وصل می کنم به یکی از پایه های میکرو بعد برنامه رو به از همون دستوری بود که ورودی برای میکرو تعریف میکردیم یعنی این دسترو:
DEBOUNCE PINB.0 , 1 , STAR
بعد میکرو میپره میره توی زیر برنامه STAR و کاری رو که گفتی یعنی تایمر رو فعال میکنه
2- بخش سخت افزاری رو خوب اومدی ولی این دستور DEBOUNCE که گفتی کاملا توی این قسمت اشتباه بود می دونی چرا
1- نه چرا ؟؟؟؟
2- مگه ما نگفتیم که این میکروکنترلر قراره بهش کیبرد ماتریسی – سنسور دما و چنتا چیز دیگه وصل بشه . خوب با این اوصاف میکرو یکسره در حال خوندن این کیبرد و اندازه گیری دما هستش کی وقت میکنه بیاد دستور DEBOUNCE رو بخونه البته نه اینکه دستور DEBOUNCE رو نخونه منظورم اینه که ممکنه که موقعی که سنسور فعال شد میکرو در حال خوندن یک قسمت دیگه از برنامه باشه . پس ما باید یک ترتیبی بدیم که برنامه میکرو در هر قسمتی از برنامه که باشه بره اون کاری رو که ما ازش خاستیم رو انجام بده و این کار رو با استفاده از INT0 انجام میده . حالا بزار چند تا مثال میزنم می فهمی که چی به چیه
CONFIG INT0 = X
گفتیم که برای استفاده از بعض امکانات میکرو نیاز به پیکره بندی ان داریم که ما با نوشتن دستور بالا این کار رو انجام دادیم . و به میکرو فهماندیم که می خاهیم از امکان INT0 ان استفاده کنیم بعد از علامت مساوی نوشتیم X که به جای X باید یکی از گزینه های زیر رو بنویسی :
RISING : برای اشکار کردن لبه بالا رونده از RISING استفاده می کنیم .
FALLING : برای اشکار کردن لبه پایین رونده از FALLING استفاده میکنیم.
LOW LEVEL : برای اشکار کردن سطح صفر از LOW LEVEL استفاده می کنیم.
1- والا ما که نمیدونیم این لبه بالا رونده – لبه پایین رونده و سطح صفر چی هستش؟؟
2- الان میگم برات میگم . به این شکل موج توجه کن ( برای دیدن شکل روی لینک زیرکلیک کنید)
http://www.4shared.com/file/21102873/ca6...ISING.html

این یک پالس می تونه توسط یک شسی یا یک سنسور یا هر چیز دیگه ایجاد شده باشه . حالا اون قسمتی از شکل موج رو که قرمز هستش رو میگن سطح صفر یا LOW LELEL اون قسمت ابی رنگ رو بهش میگن لبه بالا رونده یا RISING اون قسمت سیاه رنگ رو بهش میگن سطح یک یا HIGH LEVEL و اون قسمتی که سبز رنگ هستش رو هم می گن لبه پایین رونده یا FALLING
1- فهمیدم ادامه بده . راستی کاربردهای دیگه ای هم داره
2- اره یکی از این کاربرد ها در دیمر دیجیتال هستش که برای اینکه ما بفهمیم شکل موج AC از صفر عبور کرده یا نه از INT استفاده می کنیم .
1- این پایه int0 کدوم یکی از پایه های میکرو هستش ؟
2- در هر میکرو فرق میکنه کافیه به دیتاشیت یا همون برگه مشخصاتش مراجعه کنی
یک مثال ساده برات می زنم بعد میریم سر مثال های دیگه .
در برنامه زیر به ازای هر بار که شسی رو فشار بدی خروجی TOGGLE میشه :
کد:
Config int0 = rising
Config portb = output
Enable Interrupts
Enable Int0
On Int0 eca
Reset portb
Do
Loop
End
eca:
Toggle Portb
Return
خوب حالا بریم سر تحلیل برنامه :
در خط اول ما با دستور Config int0 = rising پیکره بندی int0 رو انجام دادیم یعنی به میکرو گفتیم که ما می خاهیم از int0 استفاده کنیم. راستی ما بعد از علامت مساوی نوشتیم rising و به معنی این هستش که ما می خاهیم پایه int0 نسبت به لبه بالا رونده حساس باشه
در خط دوم با دستور config portb = output ما پورت b رو به عنوان خروجی تعریف کردیم .
در خط سوم با دستور enabe interrupts وقفه سراسری رو فعال کردیم . راستی اینو یادم رفت که بگم هر وقت که خاستی از int0 استفاده کنی باید این وقفه سراسری رو فعال کنی .
در خط چهارم با دستور enable int0 ما int0 رو فعال کردیم . در ضمن اگر خاستی که در هر جای برنامه int0 رو غیر فعال کنی می تونی به جای enable از disble استفاده کنی
در خط پنجم نوشتیم On Int0 eca این دستور این مطلب رو می رسونه که اگر پایه int0 با یک لبه بالا رونده تحریک شد میکرو بپره بره توی زیر برنامه eca
خط ششم نوشتیم reset portb به این معنی که پورت b رو صفر کن
خط هفتم و هشتم هم به ترتیب do-loop هستش که یک حلقه بینهایت هستش ما این حلقه رو برای این گذاشتیم که میکرو اول برنامه که همه دستورات پیکره بندی رو خوند و رسید به این حلقه بیوفته توی این حلقه و تا زمانی که وقفه int0 نخورد توی این حلقه گرفتار باشه حالا وقفه کی می خوره الان بهت می گم وقفه زمانی می خوره که پایه int0 توسط یک لبه بالا رونده تحریک بشه.
خط نهم نوشتیم end که خودت می دونی چی هستش در ضمن برنامه ما هیچ وقت به end نمی رسه.
خط دهم نوشتیم ahmad: که یک زیر برنامه هستش که توی تحلیل دوم می گم که چرا نوشتمش .
خط یازدهم نوشتیم toggle portb به این معنی که حالت پورت b رو در هر وضعیتی که هست ( منظورم صفر یا یک ) معکوسش کن یعنی اگر یک بوده حالا صفرش کن و اگر صفر بوده حالا یکش کن .
خط دوازدهم نوشتیم return به این معنی که برگرد برو سر جای اولت یعنی دوباره برو توی حلقه .


خوب حالا بریم سر تحلیل دوم: میکروکنترلر میاد برنامه رو از خط اول شروع میکنه به خوندن
خط اول نوشتیم config int0 = rising در اینجا میکرو میفهمه که ما int0 رو پیکره بندی کردیم .
در ادامه میاد خط دوم رو میخونه یعنی config portb = output در اینجا ما پورت b رو به عنوان خروجی تعریف کردیم که به این پورت b میتونی هر چیزی وصل کنی مثلا LED .
در خط سوم نوشتیم enable interrupts و با این کار به میکرو فرمان فعال کردن وقفه سراسری رو دادیم . راستی اینو بگم که هر وقت از int0 خاستی استفاده کنی این وقفه سراسری رو هم با همین دستوری که نوشتم یعنی enable interrupts فعال کن .
خط چهارم نوشتیم enable int0 میکرو با خوندن این دستور int0 رو برای ما فعال میکنه بعد میره به خط پنجم.
خط پنجم ما نوشتیم on int0 eca میکرو با خوندن این دستور می فهمه که هر وقت که به پایه int0 یک پالس با لبه بالا رونده خورد باید بپره بره توی زیر برنامه eca و دستورات داخل این زیر برنامه رو اجرا کنه .
1- یک سوال میکرو از کجا میفهمه که وقتی که پالس با لبه بالا رونده به پایه int0 خورد باید بره توی زیر برنامه چرا بالبه پایین رونده نره توی زیر برنامه
2- از اونجایی که ما در اول برنامه براش با دستور config int0 = rising مشخص کردیم که باید به لبه بالا رونده حساس باشه و میکروهم تابع دستوری هستش که ما بهش میدیم در مورد این که چرا با لبه پایین رونده این کار رو نکنه باید بگم که کافیه به جای rising بدیم falling اون وقته که به لبه پایین رونده حساس میشه . خوب حال بریم سر ادامه تحلیل برنامه
خط ششم ما نوشتیم reset portb به این معنی که کل پورت b رو صفر کن . میکرو این خط رو میخونه و میره سراغ خط بعدی
خط هفتم و هشتم ما یک حلقه بینهایت یعنی do –loop نوشتم که بدبختی میکرو اینجا شروع میشه میکرو با رسیدن به این دستورات میوفته توی یک حلقه بینهایت و اگه قسمت باشه تا ابد اونجا گرفتار میشه . مگر اینکه یک پالس فداکار بیاد و نجاتش بده .
1- منظورت رو نفهمیدم تا کی توی این حلقه do – loop هستش
2- تا زمانی که ما به پایه int0 یک پالس با لبه بالا رونده بدیم . به محض اینکه ما این عمل رو انجام بدیم میکرو میفهمه که وقفه خورد و باید بره توی اون زیر برنامه eca که ما از قبل تعیین کرده بودیم. حالا بیا فرض رو بر این بگیریم که ما یک پالس با لبه بالا رونده به پایه int0 دادیم و میکرو هم رفت توی زیر برنامه eca . پس تحلیل برنامه رو از زیر برنامه eca که در خط دهم هستش پی می گیریم .
در خط دهم ما زیر برنامه eca رو داریم که میکرو الان پریده توی این زیر برنامه و می خاد دستورات داخل این زیربرنامه رو انجام بده :
اولین دستور داخل این زیربرنامه هستش toggle portb میکرو با خوندن این دستور پورت b رو toggle میکنه . چون در اول برنامه ما با دستور reset portb پورت b رو صفر کرده بودیم حالا که میکرو دستور toggle portb رو انجم میده پورت b میشه یک یا به عبارتی عکس حالت قبل . در اینجا اگه که یک led رو به یک از پایه های پورت b وصل کرده باشی می بینی که led روشن میشه.
دومین یا به عبارتی اخرین دستور داخل این زیربرنامه هستش return میکرو با خوندن این دستور بر می گرده توی حلقه do –loop و مثل دفعه قبل توی این حلقه اونقدر میمونه تا دوباره یک پالس با لبه بالا رونده به پایه int0 بخوره تا دوباره بره توی زیربرنامه eca و دوباره دستورات داخل این زیر برنامه رو اجرا کنه اگه این میره دوباره portb رو toggle کنه پورت b این دفعه صفر میشه به عبارتی عکس حالت قبل. یعنی اگه شما یک led به یکی از پایه های پورت b وصل کرده باشی led خاموش میشه.
اینم عکس سخت افزار مداری

http://www.4shared.com/file/21102971/e36a084c/no1.html
خوب حاضری بریم سر مثال بعدی
1- اره ولی بزار این دفعه من یک مدار بگم تو برنامه شو بنویس
2- فکر خوبیه بگو
1- من یک مداری میخام به این صورت کار کنه . وقتی که تغذیه میکروکنترلر رو وصل میکنیم یک led روشن خاموش بشه به عبارت دیگر چشمک بزنه و یک led دیگه هم توی مدار باشه که در حالت اول خاموش باشه . یک میکروسوییچ هم توی مدارمون باشه که باید وصل بشه به پایه int0 این میکروسوییچ رو هر بار که میزنیم led دوم toggle بشه یعنی برای بار اول که میکروسوییچ رو زدیم led روشن بشه و برای بار بعدی که زدیم led خاموش بشه و این سیکل ادامه داشته باشه .
2- خوب من توی این مداری که گفتی led اولی که قرار یکسره چشمک بزنه رو وصل میکنم به پایه b.0 و led دومی که قراره به ازای هر بار که ما میکروسوییچ رو میزنیم toggle بشه رو وصل کردم به پایه b.1 میکروسوییچ رو هم که قراره به پایه int0 وصل بشه رو هم وصل کردم به پایه int.0
حالا بریم سر برنامه :
کد:
Config Int0 = Rising
Config Portb = Output
Enable Interrupts
Enable Int0
On Int0 led
Do
Toggle Portb.0
Waitms 100
Loop
End
Led:
Toggle Portb.1
Return

تحلیل اول برنامه :
خط اول config int0 = rising با این دستور پایه int0 رو برای پالس با لبه بالارونده پیکره بندی کردیم
خط دوم config portb = output در این دستور ما پورت b رو به عنوان خروجی پیکره بندی کردیم
خط سوم enable interrupts در این دستور ما وقفه سراسری رو فعال کردیم که در هر جا که خاسته باشیم از int0 استفاده کنیم باید این وقفه سراسری رو هم فعال کنیم
خط چهارم enable int0 در این دستور ما int0 رو فعال کردیم
خط پنجم on int0 led این دستور به این معنی هستش که هر وقت وقفه int0 خورد بپر برو توی زیر برنامه led . در ضمن وقفه int0 موقعی می خوره که ما یک پالس با لبه بالارونده به پایه int0 بدیم.
خط ششم do این دستور اول یک حلقه بی نهایت هستش
خط هفتم Toggle Portb.0 این دستور پایه b.0 رو toggle میکنه
خط هشتم Waitms 100 این دستور یک تاخیر 100 میلی ثانیه ای در اجرای برنامه ایجاد میکنه
خط نهم loop انتهای حلقه بینهایت رو مشخص میکنه
خط دهم end به معنی انتهای برنامه هستش که میکرو هیچ وقت این دستور رو نمی تونه بخونه
خط یازدهم led: ما در اینجا یک زیر برنامه با اسم led مشخص کردیم که درون این زیر برنامه دو دستور وجود داره که در خط دوازدهم و سیزدهم هستش
خط دوازدهم toggle portb.1 اولین دستور داخل زیربرنامه هستش و همونطور که از اسمش پیداست پایه b.1 رو toggle میکنه
خط سیزدهم return دومین و اخرین دستور داخل زیربرنامه هستش میکرو با خوندن این دستور برمیگرده توی حلقه بینهایت.

تحلیل دوم :
ببین نمی خوام زیاد کشش بدم برای همین خیلی خلاصه می گم.
میکرو میاد از اول برنامه شروع میکنه به خوندن خط اول تا پنجم رو می خونه و به این نتیجه می رسه که ما یک از int0 می خاهیم استفاده کنیم و در ضمن می خواهیم از پورت b به عنوان خروجی استفاده کنیم .
در خط ششم یعنی do که اول حلقه هستش میوفته توی حلقه و اولین دستور داخل این حلقه رو که هست toggle portb.0 رو اجرا میکنه یعنی وضعیت پایه b.0 رو عکس حالت قبلش میکنه از اونجایی که حالت قبل یا حالت فعلی هستش صفر این دفعه میاد پایه b.0 رو یک میکنه و شما محلاحضه میکنی که اون led ی که به این پایه وصل هستش روشن میشه .
بعد میره خط هفتم رو می خونه waitms 100 این دستور 100 میلی ثانیه توی اجرای برنامه تاخیر ایجاد میکنه توی این 100 میلی ثانیه تاخیر پایه b.0 در همون حالت یک بودن هستش . البته اینو بگم که در عمل از 100 میلی ثانیه بیشتر طول میکشه . بعد میره خط هشتم رو می خونه
خط هشتم هستش loop این دستور اخر حلقه رو مشخص کرده میکرو به محض اینکه این دستور رو می خونه می فهمه که باید بره از خط ششم دوباره شروع به خوندن کنه یعنی از دستور do این دستور رو می خونه و دوباره میوفته توی این حلقه و دستورات داخل این حلقه رو انجام میده و دوباره portb.0 رو toggle می کنه و سپس 100 میلی ثانیه تاخیر ایجاد می کنه و می رسه به loop و با خوندن این دستور loop همانند قبل دوباره می ره به خط ششم یعنی do و این سیکل همینطور ادامه داره . این قسمت از برنامه که داخل حلقه هستش مربوط به قسمت چشمک زن هست اگه توجه کنی portb.0 یکسره داره toggle میشه البته با تاخیر 100 میلی ثانیه ای و با این کارش اون led که به پایهb.0 وصل هستش رو روشن خاموش می کنه .
1- سوال دارم . این تاخیر 100 میلی ثانیه ای رو برای چی گذاشتی ؟
2- برای اینکه سرعت toggle شدن رو کم کنه یا به عبارت دیگه سرعت چشمک زدن led رو کم کنه
تا ما بتونیم اونو ببینیم .
1- یعنی ما میتونیم با کم و زیاد کردنش سرعت چشمک زدن led رو کنترل کنیم ؟
2- اره مثلا میتونی به جای waitms 100 بنویسی waitms 50 اینطوری سرعت چشمک زدن led زیاد میشه یا اکر عددش رو زیادتر کنی مثلا 200 یا 300 میتونی سرعت چشمک زدن led رو کم کنی . حالا بریم سر ادامه تحلیل برنامه
خب اونجایی بودیم که برنامه ما توی حلقه بی نهایت do-loop گیر کرده بود و با این کارش یک led رو برای ما روشن خاموش میکرد . حالا با فرض کنیم ما میکروسوییچ رو فشار دادیم و با این کارمون یک پالس با لبه بالا رونده ایجاد کرده ایم که در این حالت وقفه int0 میخوره و میکرو میپره میره توی اون زیربرنامه ای که ما براش مشخص کردیم یعنی زیر برنامه led و دستورات داخل این زیربرنامه رو اجرا میکنه . حاالا بیا فرض کنیم که این اتفاق هم افتاده و میکرو میخاد بره توی زیربرنامهled
اولین دستور داخل زیر برنامه led هستش toggle porb.1 میکرو با خوندن این دستور پایه b.1 رو toggle میکنه یعنی عکس وضعیت فعلی و از انجایی که در وضعیت فعلی پایه b.1 صفر بوده این دفعه توسط دستور toggle portb.1 یک میشه و میبینی که اون led که به این پایه وصل شده روشن میشه . سپس میکرو میره خط بعدی رو اجرا میکنه یعنی دستور return و با خوندن این دستور اونو اجرا میکنه و برمیگرده داخل همون حلقه do –loop و دوباره شروع میکنه به انجام دادن دستورات داخل همون حلقه do –loop . اگه دوباره میکروسوییچ رو فشار بدی میکرو باز وقفش میخوره و میاد توی زیر برنامه led و دوباره پایه b.1 رو toggle میکنه و چون در وضعیت فعلی پایه b.1 یک هستش این دفعه با با دستور toggle portb.1 این پایه صفر میشه و میبینی که اون led که به این پایه وصل هستش خاموش می شه.
اینم شکل سخت افزاری مدار:
http://www.4shared.com/file/21103003/f548a34d/no2.html
2-حالا اگه سوالی هستش بپرس
1- سوالم اینه که ایا ما توی این مدار با فشاردادن میکروسوییچ یک لبه بالا رونده ایجاد میکردیم یا نه؟
2- اره ببین ما تا وقتی که کاری به میکروسوییچ نداشته باشیم وضعییت در حالت سطح صفر هستش . به محض اینکه میکرو سوییچ رو فشار دادیم یک لبه بالا رونده اینجاد میشه . و اگر همچنان دستموم رو روی میکرو سوییچ نگه داریم وضعیت در حالت سطح یک قرار داره . به محض اینکه ما دستمون رو از روی میکرو سوییچ برداریم یک لبه پایین رونده ایجاد میشه که و دوباره به سطح منطقی صفر بر میگرده .
2- خوب حالا که سوالات تموم شد بزار یک چیز رو دوباره یاداوری کنم و اون اینکه از int0 در مواقعی استفاده میشه که ما خاسته باشیم هر وقت که پایه int0 تحریک شد میکرو درهر وضعیتی که باشه بره و اون کاری رو که ما ازش خاستیم رو انجام بده که توی این دوتا مثالی که برات زدم کاملا مشخص هستش. یعنی میکرو اب دستشه بزاره و بره اون کاری رو که ما میگیم انجام بده .
فعلا خدانگهدار

آدمی ساخته ی افکار خویش است فردا همان خواهی شد که امروز اندیشیده ای 038
(آخرین ویرایش در این ارسال: ۲۰-بهمن-۱۳۸۷, ۲۳:۰۶:۲۸، توسط 1nafar.)
۱۹-بهمن-۱۳۸۷, ۱۴:۱۱:۱۸
ارسال‌ها
پاسخ
تشکر شده توسط : Rink8, lord_viper, t3r!p3000, 1nafar, pavandpoor, alaska, WhiteNoise, kamiatash, Pixar, coloop, soham 313, jamalmusic
saeed450 آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 599
موضوع‌ها: 57
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 736
( 2929 تشکر در 511 ارسال )
ارسال: #14
RE: اموزش AVR از صفر تا بي نهايت
قسمت سيزدهم نثار شما عزیزان

سلام

2- سلام امروز می خام در مورد تایمر 2 برای ایجاد زمان خیلی دقیق برات بگم که اگه یک موقع خاستی یک زمان دقیق رو ایجاد کنی بتونی با تایمر کانتر دو این زمان رو ایجاد کنی از تایمر دقیق می تونی مثلا توی یک ساعت دقیق استفاده کنی .
1- بگو سرو پا گوشم
2- برای اینکه بتونی از تایمر کانتر 2 برای زمان دقیق استفاده کنی نیاز به یک RTC داری که مقدارش هم باید 32768 هرتز
باشه . این RTC یک قطعه دو پایه هستش که باید به پایه های TOC1 و TOC2 وصل بشه . شکل زیر رو نگاه کن :
http://www.4shared.com/file/22309579/4f8...d=c95a46aa
1- مدار خاص دیگه نیاز نداره ؟
2- نه هیچی نیاز نداره فقط کافیه این RTC رو به اون پایه هایی که گفتم وصل کنی
1- این RTC پایه مثبت یا منفی یا پایه تغذیه ای نداره ؟
2- نه فقط دوتا پایه داره که باید وصل کنی به پایه های TOC1 و TOC2 و هیچ جیز خاص دیگه ای نداره
1- این پایه های TOC1 و TOC2 کدوم یکی از پایه های میکرو هستن ؟
2- اینو دیگه باید از توی برگه مشخصاتش در بیاری ببینی که کجا هستش مثالا توی MEGA8 این دوتا پایه پایه های 9 و 10 هستن یا مثلا توی MEGA32 پایه های 28 و 29 هستن
2- خوب این شد از سخت افزار مدار حالا بریم سر برنامه ای که باید نوشت:
برنامه رو با یک مثال ساده برات شروع می کنم برنامه به این صورت هستش که PORTD رو توی زمان دقیق یک ثانیه TOGGLE کنیم
مثال اول :
کد:
CONFOG TIMER2 = TIMER , ASYNC = ON , PRESCALE = 128
CONFIG PORTD = OUTPUT
ENABLE INTERRUPTS
ENABLE TIMER2
ON TIMER2 NEX
DO
LOOP
END
NEX:
TOGGLE PORTD
RETURN
برنامه همینی هستش که می بینی دیدی که چقدر راحت هستش . خوب حالا بریم سر تحلیل برنامه :
توی خط اول که ما نوشتیم CONFOG TIMER2 = TIMER , ASYNC = ON , PRESCALE = 128 با این کار ما تایمر دو رو توی مد تایمر انتخاب کردیم ASYNC = ON این دستور که توی همین خط اول نوشتیم رو حتما باید بنویسی تا تایمر به صورت اسنکرون پیکره بندی بشه و کلاک رو از RTC دریافت کنه . PRESCALE = 128 این دستور رو که قبلا توی بحث تایمر کانتر یک برسی کردیم این 128 رو هم که نوشتیم برای این هستش که بتونیم زمان یک ثانیه رو بدست بیاریم وگرنه میتونی یکی از اعداد 1/ 8/ 64/ 128/ 256/ 1024 رو هم بنویسی تا زمان های کمتر یا بیشتری به دست بیاری
خط دوم CONFIG PORTD = OUTPUT در اینجا ما PORTD رو به عنوان خروجی تعریف کردیم
خط سوم ENABLE INTERRUPTS در این جا ما وقفه سراسری رو فعال کردیم که توی همه تایمرهایی که ما استفاده می کنیم باید این وقفه رو فعال کنیم.
خط چهارم ENABLE TIMER2 چون که ما از تایمر شماره 2 میکرو میخایم استفاده کنیم باید خود TIMER2 رو توسط این دستور فعال کنیم
خط پنجم ON TIMER2 NEX این دستور رو هم به این خاطر نوشتم که زمانی که وقفه تایمر خورد بپره بره توی زیر برنامه NEX
1- حالا این وقفه کی می خوره
2- صبر داشته باش بهت می گم. وقفه زمانی میخوره که زمان یک ثانیه رسیده باشه
2- خط ششم و هفتم ما یک حلقه DO -LOOP گذاشتیم که در ادامه می گم برای چه کاری هستش
خط هشتم END که میکرو هیچوقت این دستور رو نمی خونه یعنی نباید هم بخونه
خط نهم NEX: این یک زیر برنامه هستش که اینم در ادامه توضیح میدم
خط دهم TOGGLE PORTD این دستور به این معنی هستش که پورت D رو TOGGLE کن یا به عبارتی وضعیت پورت D رو از نظر صفر یا یک بودن معکوس کن یعنی اگه پورت صفر هستش حالا یکش کن یا اگه یک هستش حالا صفرش کن
خط یازدهم RETURN با این دستور بر می گردیم تو حلقه DO-LOOP

حالا بریم سر تحلیل دوم راستی قبل از این که تحلیل دوم رو شروع کنم اینو بهت بگم که این برنامه رو نمی تونی با شبیه ساز BASCOM و نه با پروتوس به طور دقیق تست کنی و باید حتما روی یک بردبرد ببندیش اینو گفتم که یک موقع نری با این شبیه سازا تستش کنی بعد که زمان های غیر عادی به دست اوردی تو دلت به ما فحش بدی.
تحلیل دوم برنامه :
میکرو میاد برنامه رو از خط اول شروع می کنه به خوندن خط اول رو می خونه و می فهمه که ما تایمر 2 را اون هم در حالت اسنکرون پیکره بندی کردیم بعد می ره خط دوم.
توی خط دوم میکرو می فهمه که ما PORTD رو به عنوان خروجی تعریف کردیم بعد می ره خط سوم
توی خط سوم که ENABLE INTERRUPTS هستش میکرو وقفه سراسری رو فعال میکنه بعد میره خط چهارم
توی خط چهارم که ENABLE TIMER2 هستش میکرو تایمر 2 رو هم فعال میکنه بعد میره خط پنجم
توی خط پنجم که ON TIMER2 NEX هستش میکرو می فهمه که هر وقت وقفه تایمر 2 خورد باید بپره بره توی زیر برنامه NEX که به جای NEX هر اسم دلخاه دیگه ای هم می تونی بزاری . در ضمن وقفه تایمر دو توی این برنامه زمانی می خوره که به زمان یک ثانیه رسیده باشیم .بعد میکرو میره به خط ششم.
توی خط ششم و هفتم ما یک حلقه بی نهایت DO-LOOP گذاشتیم این حلقه رو به این به دو دلیل گذاشتیم اول به خاطر این که ما شاید برنامه های دیگه این هم داشته باشیم مثال خوندن دما یا خوندن کیبرد ماتریسی یا ... دلیل دوم اینه که میکرو اونقدر توی این حلقه بمونه تا وقفه تایمر 2 بخوره . خوب حالا بیا فرض رو بر این بگیریم که زمان یک ثانیه ایجاد شده و وقفه تایمر 2 خورده که در این جا میکرو می فهمه که وقفه خورده و زمان یک ثانیه سررسیده و باید بپره بره توی زیربرنامه NEX و دستورات داخل این زیر برنامه رو انجام بده . پس ادامه برنامه رو از خط زیربرنامه NEX یا همون خط نهم ادامه میدم:
اولین دستور داخل زیربرنامه NEX هستش TOGGLE PORTD در این جا میکرو میاد وضعیت پورت D رو معکوس میکنه چون وضعیت قبلی صفر بوده اینجا میاد پورت D رو یکش می کنه . اگه یک LED به یکی از پایه های PORTD وصل کنی می بینی که LED روشن میشه.
دومین دستور داخل زیربرنامه NEX هستش RETURN که میکرو وقتی به این دستور رسید میپره میره توی اون حلقه ی DO-LOOP
اینم از برنامه دیدی که چقدر راحت بود
1- اره
2- خوب حالا که راحت بود یک دستور هستش که دیگه از این هم راحت تره حجم برنامه رو از اینی هم که هستش راحت تر می کنه تازه یک سری امکانات هم داره
خوب بزار همین مثالی رو که بالا برات زدم رو توسط این دستور برات بنویسیم در ضمن توی سخت افزار هیچ تغییری انجام نمیشه
کد:
CONFIG CLOCK = SOFT , GOSUB = SECTIC
CONFIG PORTD = OUTPUT
ENABLE INTERRUPTS
DO
LOOP
END
SECTIC:
TOGGLE PORTD
RETURN
همین . دیدی چقدر برنامه راحتی هستش
برنامه ساده هستش و به جز خط اول بقیه نیاز به توضیح نیست
توی خط اول ما نوشتیم CONFIG CLOCK = SOFT , GOSUB = SECTIC این دستور میاد تایمر رو در مد سنکرون پیکره بندی میکنه اونجایی هم که نوشتیم GOSUB = SECTIC این معنی رو میده که وقتی که به یک ثانیه رسیدیم بپر برو توی زیر برنامه SECTIC و دستورات داخل این زیر برنامه رو انجام بده یک نکته مهم رو هم بگم که اون زیر برنامه که ما اسمش SECTIC هستش رو یک موقع عوض نکنی اسمشو ها که برنامه EROR میده . راستی این دستوراتی که نوشتیم فقط مخصوص یک ثانیه هستش و این این دستور بیشتر برای ساخت ساعت استفاده می شه .
یکی از امکاناتی که این دستور CONFIG CLOCK = SOFT در اختیار ما قرار می ده ساخت ساعت همراه با تاریخ هستش که با نوشتن دو دستور زیر می تونیم این کار رو انجام بدیم
DATE$ = "21/05/86"
TIME$ = "10:35:58"
توسط دو دستور بالا می توان توسط یک برنامه ای که الان می نویسم یک ساعت همراه با تاریخ درست کرد :
کد:
CONFIG CLOCK = SOFT , GOSUB = SECTIC
ENABLE INTERRUPTS
DATE$ = "21/05/86"
TIME$ = "10:35:58"
DO
LOOP
END
SECTIC:
LCD TIME$
LOCATE 2,1
LCD DATE$
RETURN
برنامه بالا زیاد نیاز به توضیح نداره
خط اول که ما تایمر رو در مد سنکرون پیکره بندی کردیم و به میکرو فهموندیم که فرکانس مورد نیاز تایمر رو باید از از RTC دریافت کنه
خط دوم که وقفه سراسری رو فعال کردیم
خط سوم هم مقدار اولیه تاریخ رو دادیم که هر مقدار دیگه ای هم به غیر از اون هم می تونی بدی
خط چهارم هم مقدار اولیه ساعت رو دادیم که هر مقدار دیگه ای هم می تونی بدی
خط پنجم و ششم هم یک حلقه DO-LOOP گذاشتیم که میکرو اونتو بمونه تا وقتی که وقفه تایمر بخوره در ضمن وقفه تایمر راس یک ثانیه می خوره. حالا فرض کن که وقفه تایمر خورده و پریده توی زیربرنامه SECTIC . پس بریم که از میکرو عقب نمونیم بریم ببینیم که میکرو توی این زیربرنامه چکار می خاد انجام بده.
اولین دستور داخل زیر برنامه SECTIC هستش LCD TIME$ میکرو باخوندن این دستور یک ثانیه به مقدار پیش فرضی که ما در خط های سه و چهار گذاشتیم اضافه می کنه وساعت رو به اصطلاح به روز می کنه مثلا ما در پیش فرض ساعت 10 : 35 : 58 رو نوشتیم ولی بعد از این که وقتی که وقفه تایمر خورد و اومد توی زیر برنامه ساعت میشه 10 : 35 : 59
دومین دستور داخل زیر برنامه SECTIC هستش LOCATE 2,1 این دستور مکان نمای LCD رو به خط دوم یعنی خط پایینی میاره و ادامه نوشتن رو از این خط ادامه میده در مورد این دستور در جلسات قبلی توضیحات کافی دادم
سومین دستور داخل زیربرنامه SECTIC هستش LCD DATE$ این دستور هم تاریخ رو البته به صورت اتومات به روز می کنه البته از ادامه پیش فرضی که بهش دادیم عملکرد این دستور هم مثل دستور LCD TIME$ هستش .
اخرین دستور داخل زیربرنامه SECTIC هستش RETURN میکرو به محض خوندن این دستور بر میگره به داخل حلقه DO-LOOP
1- همه اینایی که گفتی درست ولی من یک چیز مهم رو نفهمیدم و اون اینکه توی مثال اولی که زدی توی برنامه رو نوشتی بعد گفتی که این برنامه هر یک ثانیه می ره توی زیر برنامه و دستورات داخل این زیر برنامه رو انجام می ده حالا سوالی که برای من پیش اومده اینه که تو چطوری یک کاری کردی که هر یک ثانیه میکرو بره توی زیر برنامه ایا فرمول خاصی داره زود بگو که همین مشکل داره گیجم میکنه؟؟؟؟؟؟؟؟
2- اره فرمول داره فرمولش هم اینه 128 * 256 / 32768 = 1 S فرمولش همینیه که می بینی چیز خاص دیگه ای نداره حالا بریم سر اینکه اصلا این عدد ها چی هستش تا گیج نشی :
من گفتم که یک RTC به مقدار 32768 هرتز وصل کن به پایه های TOC1 و TOC2 بعد یک دستوری داشتیم توی خط اول ASYNC=ON
که با نوشتن این دستور تایمر2 کلاکش رو دیگه از کریستال داخلی میکرو نمی گیره بلکه RTC که مقدارش هست 32768 هرتز دریافت می کنه . حالا فکر میکنی که تایمر 2 با این فرکانسی که از RTC دریافت می کنه چکار می کنه الان بهت می گم . ما توی خط اول یک دستوری داشتیم به نام
PRESCALE و مقداری که بهش دادیم این بود PRESCALE = 128 ما با نوشتن این دستور به میکرو دستور دادیم که اقای AVR عزیز این فرکانسی رو که داری از RTC دریافت میکنی که مقدارش هم هست 32768 تقسیم بر عدد 128 کن . و میکرو هم این کار رو می کنه طبق این محاسبه : 32768 / 128 = 256 یعنی در هر ثانیه دقیقا 256 هرتز به تایمر میرسه یا به عبارت دیگه در هر ثانیه 256 تا کلاک به
تایمر2 می خوره و تایمر این مقدار رو توی خودش می ریزه حالا از اونجایی که تایمر2 با 255 تا کلاک پر و با 256 تا کلاک سرریز میشه وقتی که 256 تا کلاک بهش خورد سرریز میشه و وقفه می خوره و می ره توی اون زیر برنامه ای که براش تعریف کرده بودیم. در ضمن این 256 تا کلاک توی یک ثانیه ایجاد میشه یا به عبارت دیگه در هر ثانیه 256 تا کلاک به تایمر2 می خوره طبق همون رابطه ای که نوشتم منظورم
رابطه ی 32768 / 128 = 256 هستش.
1- تو نوشتی که PRESCALE = 128 به جای عدد 128 هر عدد دیگه ای هم می تونیم بزاریم
2- هر عددی نه فقط اعداد 1 یا 8 یا 64 یا 128 یا 256 یا 1024 رو می تونیم بزاریم مثلا اگه به جای 128 عدد 64 رو بزاری تایمر2 هر
0.5 ثانیه سرریز میشه طبق این رابطه 64 * 256 / 32768 = 0.5 که در این رابطه 64 عدد PRESCALE هستش 256 مقدار گنجایش تایمر هستش که به ازای این مقدار تایمر سرریز میشه عدد 32768 هم که مقدار فرکانس یا کلاک RTC هستش. یا مثلا اگه عدد 256 رو بزاری تایمر2 هر 2 ثانیه سرریز میشه
طبق این رابطه 256 * 256 / 32768 = 2
1- پس مثال اگه عدد PRESCALE = 1024 باشه طبق این رابطه ای که گفتی 1024 * 256 / 32768 = 8 یعنی تایمر هر هشت ثانیه سرریز میشه درست گفتم یا نه ؟؟
2- اره کاملا درسته درسته . دوباره تاکید می کنم که این برنامه رو توی پروتوس یک موقع تست نکنی که تاخیرش زیاد هستش و حتما روی بردبرد مدارشو ببند.
فعلا

آدمی ساخته ی افکار خویش است فردا همان خواهی شد که امروز اندیشیده ای 038
(آخرین ویرایش در این ارسال: ۲۳-بهمن-۱۳۸۷, ۱۶:۲۸:۳۹، توسط saeed450.)
۲۳-بهمن-۱۳۸۷, ۰۰:۰۴:۰۸
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, pavandpoor, alaska, test2, WhiteNoise, kamiatash, Pixar, coloop, soham 313, saber.k, jamalmusic
saeed450 آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 599
موضوع‌ها: 57
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 736
( 2929 تشکر در 511 ارسال )
ارسال: #15
RE: اموزش AVR از صفر تا بي نهايت
نا گفته نمونه که آموزش های فوق که ارائه شد در 13 قسمت بوده و نوشته احمد فهیمی می باشد ..

آموزش avr به زبان ساده

آدمی ساخته ی افکار خویش است فردا همان خواهی شد که امروز اندیشیده ای 038
۲۳-بهمن-۱۳۸۷, ۱۶:۳۱:۳۳
ارسال‌ها
پاسخ
تشکر شده توسط : 1nafar, pavandpoor, t3r!p3000, alaska, sara.ee, WhiteNoise, Pixar, soham 313, saber.k, jamalmusic
mehrdadgh آفلاین
کاربر با تجربه
****

ارسال‌ها: 830
موضوع‌ها: 58
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 654
( 1904 تشکر در 596 ارسال )
ارسال: #16
RE: اموزش AVR از صفر تا بي نهايت
سلام
حالا که اینا رو تموم کردی یه سر به کتاب اقای 1nafar تو سایت بزن

وبلاگ من : Azarrobot.blogfa.com

ISAplast.ir
۰۳-فروردین-۱۳۸۸, ۱۱:۳۱:۵۷
ارسال‌ها
پاسخ
تشکر شده توسط : ehsan65, WhiteNoise, Pixar, soham 313, jamalmusic
saeed450 آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 599
موضوع‌ها: 57
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 736
( 2929 تشکر در 511 ارسال )
ارسال: #17
RE: آموزش AVR از صفر تا بي نهايت !
تمامي اموزش هاي گفته شده در تاپيك زير بصورت pdf موجود است

http://forum.iranled.com/showthread.php?tid=12117

آدمی ساخته ی افکار خویش است فردا همان خواهی شد که امروز اندیشیده ای 038
۳۱-شهریور-۱۳۸۸, ۲۱:۴۲:۲۹
ارسال‌ها
پاسخ
تشکر شده توسط : WhiteNoise, Pixar, aliaallii, jamalmusic
80740 آفلاین
تازه وارد

ارسال‌ها: 1
موضوع‌ها: 0
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 0
( 3 تشکر در 1 ارسال )
ارسال: #18
RE: آموزش AVR از صفر تا بي نهايت !
SALAM.
MAN TAZE EMROOZ TO SITE SABTNAM KARDAM.
MATALEBETOON ALIY VA GHABELE FAHME DONBALE YEKI MIGASHTAM KE avr RO KAMEL VA RAHAT BAYAN KONE KE EMROOZ BA MATALEBE KHOOBE SHOMA ROOBEROO SHODAM
ye soal dashtam man chon taze ba avr daram barname minvisam age khaste bashim ekhtelaf phase do signale morabbaee ya sinoosi ro ba avr benvisam bayad chekar konam mamnoon misham baram barname ro email koni
ایمیل: jt.mre2008@gmail.com
amoozeshe AVR ro edame bedin
ba tashakor az shoma
۲۹-آذر-۱۳۸۸, ۱۴:۴۴:۰۵
ارسال‌ها
پاسخ
تشکر شده توسط : WhiteNoise, Pixar, jamalmusic
t3r!p3000 آفلاین
         
*****

ارسال‌ها: 5,050
موضوع‌ها: 83
تاریخ عضویت: اردیبهشت ۱۳۸۵

تشکرها : 34447
( 17423 تشکر در 5116 ارسال )
ارسال: #19
RE: آموزش AVR از صفر تا بي نهايت !
مهندس لطفا فقط و فقط فارسی بنویس !
چون هیچکی حوصله خوندن متن فینگیلیش نمی کنه ( به ضرر خودته )

و نکته مهم اینکه اینجاهیچکی واسه کسی برنامه بنویسه !

شما خودتون شروع بکنین و هر جاشو مشکل داشتین بیان کنین تا بچه ها در حد توان کمکتون کنن !

قدم اولو خودتون باید بردارین !!!!!
۲۹-آذر-۱۳۸۸, ۱۵:۱۴:۳۸
ارسال‌ها
پاسخ
تشکر شده توسط : WhiteNoise, jamalmusic
nex2004 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 201
موضوع‌ها: 27
تاریخ عضویت: اسفند ۱۳۸۵

تشکرها : 54
( 422 تشکر در 76 ارسال )
ارسال: #20
RE: آموزش AVR از صفر تا بي نهايت !
سلام
لطفا فارسی بنویسید
اموزش ها ادامه داره قسمت جدید با عنوان ( pwm و کنترل دور موتور dc) به زودی حاضر میشه .
اگه منظورتون اینه که می خاین محاسبه کنین چه مقدار زمان طول میکشه تا شکل موج بعدی نسبت به اولی شروع میشه میتونین هردو شکل موج سینوسی رو بدین به یک اشکار ساز عبور از صفر اولین و هر کدوم رو بدین به یکی از int ها زمانی که اولین سیکل اومد و مثلا int0 تحریک شد تایمر رو راه بندازین و بعد از اینکه سیکل دوم اومد و مثلا int1 تحریک شد تایمر رو stop کنین و مقدار زمان رو بخونین و محاسبات بعدی که خودتون بهتر می دونین
۳۰-آذر-۱۳۸۸, ۱۴:۰۶:۲۷
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, 337405, alaska, WhiteNoise, Pixar, ali.taghizadehh, jamalmusic
sararobo آفلاین
کاربر مهندس
**

ارسال‌ها: 100
موضوع‌ها: 8
تاریخ عضویت: بهمن ۱۳۸۸

تشکرها : 349
( 319 تشکر در 85 ارسال )
ارسال: #21
RE: آموزش AVR از صفر تا بي نهايت !
خسته نباشید !
میتونید واسه ی نوشتن برنامه با کد ویژن avrهم اموزشی داشته باشین ممنون!

الهی بمیرم اگه باز ببینم غمی توی چشمات
الهی که باشه برای دل من تمومی دردات


۰۴-بهمن-۱۳۸۸, ۰۲:۲۰:۵۲
ارسال‌ها
پاسخ
تشکر شده توسط : WhiteNoise, Pixar
arshia.shams آفلاین
تازه وارد

ارسال‌ها: 1
موضوع‌ها: 0
تاریخ عضویت: بهمن ۱۳۸۸

تشکرها : 0
( 2 تشکر در 1 ارسال )
ارسال: #22
RE: آموزش AVR از صفر تا بي نهايت !
آقا نوکرتم به مولا
قسمتهای بعدیشم بده ما تشنه کارهای شماییم
۲۸-بهمن-۱۳۸۸, ۰۱:۲۴:۱۳
ارسال‌ها
پاسخ
تشکر شده توسط : WhiteNoise, Pixar


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS