برنامه بعدی که می خواهیم بنویسیم و اجرا کنیم، led راه رونده است، یعنی led ها پشت سر هم روشن می شوند و با روشن شدن هر led ، led قبلی خاموش شود.
TRISB=0
SYMBOL B=PORTB
B0 VAR BYTE
MAIN:
B0=1
B=B0
PAUSE 100
SUB:
B0=B0*2
B=B0
PAUSE 100
IF B0=%10000000 THEN MAIN
GOTO SUB
END
خط اول: مشخص می کند که تمام پایه های پورت B به عنوان خروجی استفاده می شود.
خط دوم: از دستور symbol استفاده شده، با استفاده از این دستور می توان مثلا برای پورت B یک کلمه ی دیگر قرار داد کرد. که ما دراینجا از B به جای پورت B استفاده کردیم. یعنی هرجا در برنامه از کلمه B استفاده کردیم ، منظورمان همان PORTB است.
برنامه اصلی : برای این که منظورمان را پیاده کنیم می توانیم از راه حل زیر استفاده کنیم: بدین صورت که ابتدا خروجی پورت B، یک شود، سپس 10 شود، و پس از آن 100 و همینطور تا 10000000 ادامه دهیم و دوباره به حالت اول برگردیم. یکی از ساده ترین راه ها برای تحقق این راه حل استفاده از دستور فوق در برنامه است:
1
10×1=10
10×10=100
10×100=1000
.
.
عدد 10 اول در مبنای ده همان 2 می باشد که در برنامه استفاده کردیم. بعد از رسیدن به 10000000 باید برنامه به حالتی برگردد که خروجی 1 شود که برای این منظور از یک حلقه استفاده می کنیم.
شماتیک مدار:

اکنون مانند قسمت قبل این آموزش(قسمت اول)، فایل hex را ساخته و در میکرو LOAD می کنیم و برای اجرای برنامه روی گزینه run کلیک می کنیم.
در اینجا لازم می دانم چند نکته را هم در پایان این قسمت قرار دهم.
نکته 1) به جای استفاده از دستور PORTB=B0 می توانیم از دستور POKE PORTB,B0 استفاده کنیم.
نکته 2) برای تعریف یک متغیر جدید از دستور VAR استفاده می کنیم. اگر بعد از آن BYTE استفاده کنیم، متغیرمان یک بایتی در نظر گرفته می شود. بهتر است از B0,B1,…,B51 برای متغیر بایتی استفاده کنیم. و برای متغیرهای دوبایتی از W0,W1,…,W52 استفاده کنیم. W0 از B0,B1 تشکیل شده است.
نکته3) یک بایت از 0 تا 255 می تواند بشمارد.(یعنی 2 به توان 8)
نکته 4) یک کلمه از دو بایت تشکیل شده است.
از امروز قصد دارم آموزش کار با میکروکنترلر PIC را به صورت مثال شروع کنم. برای این منظور از مثال های بسیار ساده شروع می کنیم و کم کم سطح پروژه ها را بالا می بریم. همچنین برای کم کردن هزینه و ... ، فعلا به صورت عملی کار نمی کنیم و فقط آن ها را شبیه سازی می کنیم.
ابتدا لازم است نرم افزارهای مورد نیاز را برای تمرین فراهم کنید که لیست آن ها به قرار زیر می باشد:
1- Micro Code Studio (برای نوشتن برنامه ها و کامپایل کردن – من خودم از ورژن 2.1 استفاده می کنم)
2- نرم افزار شبیه ساز proteus (بهترین نرم افزار برای شبیه ساز میکروها می باشد – هم اکنون آخرین ورژن آن 7.4 می باشد)
بعد از نصب این دو نرم افزار کار را شروع می کنیم.
همانطور که گفتم این آموزش بر اساس مثال می باشد تا خستگی کمتری به دنبال داشته باشد.
مثال 1) می خواهیم یک LED با فاصله زمانی 1 ثانیه چشمک بزند.
اول باید برنامه مربوطه را بنویسیم.
می خواهیم این مثال را روی میکروی 16F84A اجرا کنیم. این میکرو دارای دو پورت A و B (پورت A چهار پایه و پورت B 8 پایه دارد) به عنوان پایه های خروجی یا ورودی است. منظور از خروجی این است که داده از پردازشگر میکرو به پایه های آن ارسال می شود و منظور از ورودی این است که داده از محیط خارج از میکرو و توسط این پایه ها به پردازشگر میکرو می رسد.

حال برنامه Micro Code Studio را اجرا می کنیم و شروع می کنیم به نوشتن برنامه چراغ چشمکزن.
ابتدا باید تعریف کنیم که می خواهیم کدام یک از پایه های پورت ها خروجی هستند و کدامیک ورودی. صفر نشان دهنده خروجی بودن و یک نشان دهنده ورودی بودن پایه را دارد. حال به دستور زیر توجه کنید:
TRISB=%00000000
این دستور تمام 8 پایه پورت B را به عنوان خروجی تعریف می کند. علامت % نشان دهنده باینری بودن این عدد می باشد.
برنامه Micro Code Studio پورت ها را به این صورت می شناسد: مثلا برای پورت B0، portb.0
حالا باید به میکرو بگوییم پورت b0 را یک کند، یعنی روشن کند:
portb.0=1
سپس می خواهیم این پورت 1 ثانیه روشن بماند:( عدد جلوی دستور PAUSE تاخیر بر حسب میلی ثانیه می باشد)
pause 1000
پورت b.0 خاموش شود:
portb.0=0
دوباره یک ثانیه تاخیر و بعد دوباره به دستور portb.0=1 برگردد، پس کل برنامه به صورت زیر شد:
TRISB=%00000000
MAIN:
portb.0=1
pause 1000
portb.0=0
pause 1000
goto main
end
(باید در انتهای هر برنامه از دستور end استفاده شود.)
حال از منوی کشویی بالای برنامه Micro Code Studio میکروی 16F84A را انتخاب می کنیم. سپس روی دکمه save کلیک می کنیم و در انتها روی گزینه compile only کلیک می کنیم. حال در جایی که save کردیم می بینیم که یک فایل با پسوند hex وجود دارد. از این فایل برای شبیه سازی در پروتئوس استفاده می کنیم.
برنامه پروتئوس را باز کرده و شماتیک را مثل زیر می بندیم:

نکته) در تنظیمات میکرو فرکانس را روی 4 مگاهرتز (برابر با کریستال خارجی) انتخاب می کنیم. در همین پنجره یعنی تنظیمات میکرو آدرس فایل hex را وارد می کنیم و روی ok کلیک می کنیم.
منظور از VDD همان ولتاژ 5 ولتی منبع تغذیه می باشد.
سپس روی دکمه Run کلیک کرده و نتیجه را مشاهده کنید.
فرق میکرو پروسسور و میکرو کنترلر:
یک میکرو پروسسور در واقع یک (Central Processor Unit)CPU یا همان بخش مرکزی پردازش می باشد. همانطور که از نام آن بر می آید وظیفه پردازش اطلاعات را بر عهده دارد.میکروپروسسور برای انجام این وظیفه نیاز به ثبت دستور العملها (ROM)، محلی برای اجرای فرامین (RAM) و ارتباط با محیط خارج (پورتهای I/O) دارد.که باعث افزایش هزینه و کندی سرعت می شوند. از معروفترین میکروپروسسورها می توان از میکروپروسسور Z80 یاد کرد.
با توسعه علم الکترونیک آی سی های به نام میکروکنترلر به بازار عرضه شد که نه تنها دارای بخش مرکزی پردازش بود که تمامی نیازهای یک میکروپروسسور و فراتر از آن را در خود جمع کرده بود.
یک میکرو کنترلر عموما شامل موارد زیر است:
1.CPU
2.حافظه ثبت دستور العملها ROM
3.حافظه اجراء فرامین RAM
4.پورتهای ورودی و خروجی I/O
5.شمارنده و تایمر
6.باس داده،باس کنترل
7. مبدل آنالوگ به دیجیتال
8.پورت سریال
و .............
از میکروکنترلر های معروف میتوان به خانواده 8051 ،AVR ،PIC اشاره کرد.
ساختار یک میکروکنترلر
تاریخچه میکروکنترلر های PIC
شرکت General Instrument مبتکر اصلی ساخت و استفاده از CPU 16 بیتی با نام CP1600 بود.در حالی که این CPU بطور کلی از نظر عملکرد از عملکرد خوبی برخوردار بود اما به سبب ضعف در کارایی پورتهای ورودی و خروجی این شرکت PIC هشت بیتی را در سال 1975 برای بهبود کلی در سرتا سر سیستم بوسیله حذف وظایف پورتهای ورودی و خروجی از CPU بوجود آورد. این کار با استفاده از یک ذخیره سازی ساده Microcode در ROM انجام پذیرفت اگر چه هم اکنون از این تکنولوژی در ساخت PIC استفاده نمی شود.
در حال حاضر علامت تجاری PIC و PICmicro برای شرکت MICROCHIP Technology ثبت شده و میکروکنترلر های PIC توسط این شرکت تولید می شود.
PIC ابتدایی از سر کلمات "Peripheral Interface Controller" توسط شرکت General Instrument گرفته شده بود.برای PIC پیشرفته تر همچون PIC1640 و PIC1650 از سر کلمات "Programmable Interface Controller" استفاده شده است.
.
انواع خانواده PIC از نظر ساختار هسته
" 12 هسته ای Baseline Core
" 14 هسته ای Mid-Range Core
" 16 هسته ای High End Core
در حال حاظر با توجه به قدرتمندی این میکروکنترلر ، PIC از سرکلمات با معنی واقعی "Programmable Intelligent Computer" به معنای کامپیوتر هوشمند قابل برنامه ریزی نشات گرفته شده است.
سالها پیش شرکت general یک تراشه با نام pic1650 تولید کرد که به صورت کامپیوتر هوشمند قابل برنامه ریزی مطرح شد.
این تراشه مادر پیک بود و از لحاظ کارکرد با pic16c54 موجود مشابه است که عمدتا بعنوان سخت افزار جانبی میکروپروسسور cp1600 بکار برده می شود و شاید به همین خاطر است که عده زیادی بر این اعتقادند که پیک از سر کلمات کنترلر مدار واسط جانبی گرفته شده است اخیرا کمپانی microchip که سازنده میکرو کنترلرهای پیک می باشد این میکرو کنترلرها را با عبارت PICmicro MCUS معرفی کرده است.

میکرو کنترلرها همانطور که از نامشان بر می آید جهت کنترل انواع وسایل مورد نیاز روی کار آمدند و هدف از بکار گیری آنها ساده سازی کار کنترل و همچنین کاستن از حجم مدار می باشد زیرا میکروپروسسورها علاوه بر اینکه مدار سنگینی را بر استفاده کننده تحمیل می کنند برنامه نویسی سختی نیز دارند و براحتی قابل استفاده نیستند در واقع مدارهای جانبی مختلفی که ممکن است برای انجام یک پروژه بکار آید در داخل میکرو کنترلر قرار گرفته است تا ضمن کاهش حجم مدار استفاده از این مداهای جانبی نیز راحت تر گردد.
اولین معیاری که می تواند در انتخاب یک میکروکنترلر بسیار موثر باشد موجود بودن در بازار است
دومین ملاک ساده بودن میکروکنترلر است
کیفیت و قیمت نیز از ملاکهای بارز دیگر آن می باشد.
میکروکنترلری که دارای سرعت عمل مناسب باشد و در شرایط مختلف پایدار باشد می تواند یک میکروکنترلر خوب به حساب آید و البته قیمت آن هم هر چه پایین تر باشد برای کاربرد در حجم انبوه مناسب تر است.
پشتیبانی خوب از محصول توسط شرکت تولید کننده می تواند کاربر را در رسیدن به اهداف خود نزدیکتر کند منظور از پشتیبانی انتشار کتابها ایجاد سایتهای اینترنتی راهنما مراجع مختلف و همچنین پشتیبانی از نرم افزارهایی است که تولید می شوند و جهت دادن به آنها به سمتی که قابلیتها را افزایش می دهند و نوشتن برنامه را آسان می کند ارتقای میکروکنترلر متناسب با نیاز روز می تواند نشان دهنده پشتیبانی خوب شرکت از این محصولات باشد.
نکته دیگر این که به ساختار و یا معماری تراشه بکار برده شده نیز باید توجه کرد عملکرد آن در چه حدی است؟ قابلیتهایی که در اختیار کاربر قرار می دهند چیست؟ و سرعت اجرایی آن چقدر است؟
چرا میکروکنترلر های پیک؟
میکروکنترلر های پیک دارای ساختار و معماری پیشرفته تری هستند عملکرد بالاتری دارند و از تنوع زیادتری برخوردار هستند تنوع در اندازه امکانات ، قابلیتها و هزینه از مزایای عمده در این دسته از میکروکنترلرهاست.
این میکروکنترلرها قابلیت سازگاری بالا دارند اگر برگه اطلاعات آنها را مشاهده کنید خواهید دید که یکی از ویژگیهای ذکر شده این است که با کد برنامه میکروکنترلرهای قدیمی تر از خود براحتی کار می کنند، این میکروکنترلر ها نسبت به نوع عملکرد امکانات و قابلیتهایی که ارائه می دهند پایین ترین قیمت را دارند استفاده از آنها بسیار ساده است، مدار راه انداز ساده ای داشته و براحتی از طریق دو پایه برنامه ریزی می شوند تعداد دستورات برای آن کم است و با استفاده از یک زبان سطح بالا کار نوشتن برنامه فوق العاده ساده می باشد به جرات می توان گفت بدون اطلاع نداشتن از ثباتهای این میکروکنترلر براحتی با یک زبان سطح بالا می توان برای آن برنامه نوشت و جواب گرفت.برای استفاده آسان از این میکروکنترها از زبان سطح بالایی نظیر c نیز استفاده می شود.
برگرفته از سایت تبیان

ماژول قطب نمای CMPS10
این ماژول دارای دو سنسور میدان مغناطیسی و زاویه سنج می باشد که سنسور میدان مغناطیسی آن یک سنسور3 محوره است و سنسور زاویه سنج آن دارای سه محور می باشد.

سه محور نمایشی که هر سه بر هم عمودند و به عنوان زوایای یک سنسور می تواند در نظر گرفته شود
زاویه سنج اجازه می دهد تا زاویه قطب ها را در صورت کجی ماژول نیز با دقت بالا محاسبه کنیم. این سنسور با ولتاژ 3.3 تا 5 ولت کار می کند. ماژول CMPS10اطلاعات خود را به سه روش به خروجی ارسال می کند. 1) 12C 2) Serial 3) PWM به شکل زیر توجه فرمایید.

چگونگی اتصال پایه ماژول در مدهای مختلف
برای استفاده کردن ماژول CMPS10 در هر یک از مدهای بالا باید پایه های mode وselect را به ترتیب نشان داده شده مورد استفاده قرار داده شود. ماژول بافر خروجی خود را هر640 میلی ثانیه، جایگزین می کند یعنی ما می توانیم اطلاعات را در هر640 میلی ثانیه دریافت کنیم [3،7،16]. در این پروژه برای راه اندازی این ماژول از مد 12C استفاده شده است. برای استخراج اطلاعات نیاز به دانستن نوع اطلاعاتی می باشد که در هر رجیستر ذخیره می گردد. به همین منظور به دیتاشیت ماژول مراجعه شده است و در جدول زیرنوع اطلاعات هر رجیستر آورده شده است.

نوع اطلاعات ذخیره شده ی هر یک از رجیسترها cmps10
همانطور که ملاحظه می کنید رجیسترهای 2 و 3 مشخص کننده جهت قطب است که از دو بایت تشکیل شده اند. رجیستر های 4 و 5 هر کدام مشخص کننده زاویه ماژول با سطح زمین میباشند که این عدد بین 0 تا 85 درجه می باشد. رجیستر 4 میزان زاویه "پیتچ"[1] و رجیستر 5 میزان زاویه "رول"[2] ، ماژول را مشخص میکند. [1] PITCH [2] ROLL

مفهوم سه زاویه roll , pitch , yaw بر روی یک هواپیمای فرضی
می توان داده های خام هر یک از سه محور میدان مغناطیسی و شتاب را نیز از رجیسترهای جدول3-11 استخراج نمود. این داده ها را میتوان برای انجام کارهای مختلف مثل سنجش زاویه 3محور، سنجش شتاب در هنگام حرکت ماژول، اندازه گیری میدان های مغناطیسی موجود در اطراف ماژول، اندازه گیری جهت و میزان شدت میدان های مغناطیسی بکار برد. برای انکه مقدار مورد نظر را از رجیستر های ماژول قطب نما استخراج کنیم، از پروتکل ارتباطی I2C استفاده شده است. که این روش برای خواندن رجیستر از E2PROM نیز استفاده میشود[31،8]. این روش به این صورت است که اول رجیستر مورد نظر را فراخوانی کرده و بعد از آن مقدار درون رجیستر را می خوانیم و در یک ثبات قرار می دهیم. برنامه میکروکنترلر برای ارتباط با ماژول قطب نما به فرم زیر می باشد. در این برنامه مقدار زاویه قطب و سپس زاویه های تمایلی ماژول استخراج شده و برروی صفحه نمایش داده می شود.

برنامه میکروکنترلر متصل به ماژول قطب نما
دستورات خط 1 تا 13 برای استخراج رجیسترهای 2 تا 4 می باشد و مقدار هر یک از رجیستر ها را ذخیره کرده و بعد از آنها استفاده خواهیم نمود. هر رجیستر یک بایت است و می توان عددی بین 0 تا 255 داشته باشد. دو رجیستر 2 و3 برای عدد قطب نما اختصاص داده شده است و بایکدیگر عددی بین 0 تا 3599 را تشکیل میدهند. همانطور که در دیتاشیت ماژول آمده است اگر عددی را که دو رجیستر 2 و 3 می سازند را بر 10 تقسیم کنیم به ما زاویه قطب را نمایش خواهد داد. دستورات خط 15 و 17 به همین منظور نوشته شده است. قبل از توضیح در مورد دستورات خط 19 تا 27 باید در مورد رجیستر های 4 و 5 توضیحاتی داده شود. رجیستر های 4 و یا 5 شامل عددی بین 0 تا 85 می باشند که دارای مقدار منفی یا مثبت است. برای اینکه مشخص شود عدد داخل این رجیستر مثبت است و یا منفی باید بیت هفتم از این رجیستر را مورد بررسی قرار داد. به این صورت که اگر بیت هفتم یک باشد مقدار عدد رجیستر منفی و اگر صفر باشد مقدار رجیستر مثبت است. اگر مقدار عدد منفی باشد عدد ثبت شده در داخل رجیستر باید معکوس شود. یعنی تمام بیت های 0 تا 6 باید معکوس شوند و با صفر کردن بیت 7 نیز عدد حاصله همان زاویه ما با مقدار منفی بدست خواهد آمد. در صورتی که عدد رجیسترها مثبت باشد ( یعنی بیت هفتم ما صفر باشد) نیاز به معکوس کردن عدد نخواهد بود و عدد موجود در داخل رجیسترها، عدد زاویه می باشد. دستورات 19 تا 27 و دستورات 30 تا 38 برای همین کار می باشد و مقدار زوایای ماژول را می توان از آن استخراج کرد و برروی صفحه نمایشگر، نمایش داد. برای نمایش مقادیر بدست آمده از دستورات 41 تا 49 استفاده میکنیم. لازم به تذکر است که این ماژول به میدان مغناطیسی اطراف خود بسیار حساس است بنابراین باید از قطعاتی که دارای میدان مغناطیسی می باشند دور شود. حتی باید از سیم های حامل جریان نیز دور گردد [24،63]. این ماژول قابلیت کالیبرشدن را نیز دارد که در دیتاشیت ماژول توضیح داده شده است. تا اینجا توانستیم ماژول قطب نما را درایور کنیم بنابراین جهت قطب را با این ماژول می توانیم تشخیص دهیم.
L293
چپ گرد و راست گرد کردن دور موتور با L293
این ای سی می تواند دو موتور را چپ گرد و راست گرد کند و یا 4 موتور را در یک جهت درایو و راه اندازی نماید.

برای کنترل هر موتور به سه پایه نیاز داریم، یک پایه برای فعال نمودن ای سی و دو پایه برای چپ گرد و راست گر کردن موتور، در صورتی که پایه فعال کننده صفر باشد ای سی نسبت به دو پایه دیگر هیچ عکس العملی را نشان نمی دهد و در حالتی که پایه فعال کننده یک شود، ای سی آماده می شود تا موتور را در حالت چپگرد و یا راستگرد قرار دهد. این ای سی ولتاژ 0 تا 5 ولت را به عنوان ورودی خود دریافت می کند و می تواند موتور را تا 36 ولت درایو کند و جریانی حدود 1.2 آمپر را برای موتور تامین کند.

خروجی های کنترل کننده موتور از میکروکنترلر به این ای سی متصل میشود. در صورتی که هر دو پایه یک و یا هر دو پایه صفر باشد موتور در حالت سکون قرار خواهد گرفت. ولتاژی که ما نیاز داریم به موتور منتقل کنیم به پایه های 8 ای سی متصل می کنیم و به این ترتیب پالس های 0 تا 5 ولتی که میکرو ایجاد می کند به پالس های 0 تا 36 ولت می تواند تبدیل شود و حتی جهت آن نیز تغییر یابد.