1 معرفی
هدف از این آموزش راهنمایی کاربر در تهیه، ساخت و رفع اشکال یک برنامه نمونه سی “C” با استفاده از Atmel Studio برای CodeVisionAVR است.
در این آموزش برای مثال یک برنامه ساده برای میکروکنترلر ATmega328 Atmel می نویسیم که از برد UNO آردوینو استفاده شده است.
2 آماده سازی
CodeVisionAVR را دانلود و نصب کنید.
هنگامی که از شما خواسته شد، از دایرکتوری نصب پیش فرض پیشنهاد شده توسط نصب کننده استفاده کنید.
لطفاً توجه داشته باشید که برای نصب و استفاده از CodeVisionAVR در ویندوز به دسترسی Administrator نیاز است.
آماده سازی سخت افزاری زیر را انجام دهید:
• اگر قبلًا نصب نشده است، یک هدر 6 پین را به محل مشخص شده ICSP در برد آردوینو UNO لحیم کنید.
• کاتدهای 8 ال ای دی را به خروجی هایی که روی برد 0..7 DIGITAL مشخص شده است وصل کنید. این خروجی ها با پین های PD0..PD7 PORTD میکروکنترلر مطابقت دارند.
• آند هر LED را با استفاده از یک مقاومت k1 به پین 5 ولت هدر کانکتور پاور برد وصل کنید.
• کانکتور USB برد آردوینو را به پورت USB کامپیوتر خود وصل کنید. این کار منبع تغذیه و ارتباط را برای برد فراهم می کند.
3 ایجاد پروژه جدید
اتمل استودیو IDE را اجرا کنید.
پروژه جدیدی را به وسیله منو File|New|Project ایجاد کنید.
در پنجره باز شده اجازه دهید تا کدویزارد اجرا شود تا پروژه جدید برای خانواده تراشه AVR ایجاد شود.

گزینه ATmega ATtiny, AT90, را انتخاب کنید و OK را بزنید.
CodeWizardAVR اجرا می شود و پنجره زیر نمایش داده می شود.

در پنل تنظیمات چیپ، نوع چیپ: ATmega328P و فرکانس ساعت: 16 مگاهرتز را انتخاب کنید.
مرحله بعدی پیکربندی پین های PD0 PORTD تا PD7 به عنوان خروجی است. برای رسیدن به این هدف، روی گره Ports درخت CodeWizard کلیک کنید. یک پانل پیکربندی جدید برای Setting Port نمایش داده می شود


برای انتخاب پیکربندی PORTD روی تب D Port کلیک کنید:
همانطور که مشاهده می شود،Port D Data Directionبرای تمام پین هایI/Oبه طور پیشفرض به عنوان ورودی(In)تنظیم شده
است

روی هر دکمه بیت0تا بیت7کلیک کنید تا پین های ورودی/خروجی را به عنوان خروجی تنظیم کنید:
از آنجایی کهLEDها پس از تنظیم مجدد چیپ باید خاموش باشند، پتانسیل کاتدهای آنها باید5+ ولت باشد، بنابراین مقادیر خروجی برای پورتDبیت0تا بیت7باید با کلیک بر روی دکمه های مربوطه روی1تنظیم شود:

مرحله بعدی پیکربندی یک تایمر/ شمارنده برای ایجاد وقفه پس از هر200میلی ثانیه است. روی گرهTimers/Countersدرخت
CodeWizardکلیک کنید.
یک پانلTimers/Counters Settingsنمایش داده می شود


Timer1استفاده خواهد شد، بنابراین روی تب مربوطه کلیک کنید:
از آنجایی که پس از هر200میلی ثانیه به یک وقفهمچمقایسه تایمر1نیاز داریم، باید حالت عملیاتیModeرا به این صورت انتخاب کنیم
:
CTC top=OCR1A، مقدارPeriod: 200 msرا در پنلRequirementsمشخص کرده وچک باکسInterrupt on Compare A
Matchرا عالمت بزنید

در این حالت عملیاتی، تایمر1پالس های ساعت سیستم را ازPre Scaledمی شمارد تا زمانی که رجیسترTCNT1با مقدار رجیستر
OCR1Aبرابر شود. هنگامی که این اتفاق می افتد، رجیسترTCNT1به طور خودکار به0بازنشانی می شودو تایمر1در مقایسه باCR1Aوقفه مطابقت ایجاد میشود.
با کلیک بر روی دکمهApplyدر پنلRequirements،CodeWizardAVRمقادیر مورد نیاز را برای ثبات های پیکربندیTimer 1
ایجاد می کند:

همانطور که در پنجره باال مشاهده می شود، ساعت سیستم16مگاهرتز بر64تقسیم می شود تا مقدارClock Value1برابر با250
کیلوهرتز به دست آید و رجیسترOCR1Aبا مقدارxC34F0مقداردهی اولیه می شود.
بازه زمانی بهدستآمده بین دو وقفه0.2ثانیه خواهد بود که با خطای0% مطابقت دارد.
توجه: پیکربندی تایمر خودکار در نسخهCodeVisionAVR Evaluationغیرفعال است. بنابراین با کلیک روی دکمهApply، یک پیغام
خطا توسط نسخهEvaluationصادر می شود.
کاربر باید به صورت دستیClock Value: 250.000 kHzرا انتخاب کند و مقدارC34Fرا درComp A وارد کند
مرحله بعدی، قبل از ایجاد کد برنامه واقعی، این است که با کلیک بر روی گرهProject Informationو تکمیلcommentsدر پنل
مربوطه، نظراتی را در مورد برنامه خود مشخص کنیم

با استفاده از منویProgram|Generateیا کلیک بر روی دکمهtoolbar، برنامهCایجاد می شود که در پنجرهProgram
Previewبرنامه قابل مشاهده است

با کلیک بر روی یک گره محیطی در درختCodeWizard، مکان نما در پنجرهProgram Previewبرنامه در دنباله کد اولیه مربوط به
آن ابزار جانبی قرار می گیرد.
توجه: بهطورپیشفرضCodeWizardAVRحتی برای وسایل جانبی که استفاده نمیشوند (غیرفعال) کد اولیه تولید میکند.
اگر بازنشانی نرمافزار با پرش به آدرس0انجام شود، این یک اقدام ایمنی برای پیکربندی صحیح تراشه است. به منظور کاهش اندازه
برنامه تولید شده، میتوان با برداشتن تیک گزینه منویProgram|Generate Code for Disabled Peripheralsغیرفعال کرد.
وقتی از کداولیهتولید شد، باید برنامه جدید را با استفاده ازمنوProgram|Generate, Save and Exit،یا در تولبار ذخیره
کنیم.
ابتدا نام اولین فایل منبع.cپروژه از ما خواسته می شود:

و در نهایت باید پیکربندی محیطی پروژه خود را در فایلcwp.پروژهCodeWizardAVRذخیره کنیم:

این به ما این امکان را می دهد که فقط با بارگذاری مجدد فایلcwp.درCodeWizardAVR.از همان پیکربندی محیطی برای پروژه های دیگر استفاده کنیم.
هنگامی که همه این فایلها ذخیره شدند،Atmel Studioاز ما میخواهدsolutionجدیدی برای پروژه نمایشی”led demo”ایجاد کنیم

ما روی دکمهYesکلیک می کنیم و نامسلوشناز شما خواسته می شود:

پس از انجام این کار،سلوشنو پروژه جدید درAtmel Studioبارگذاری می شود و اطالعات مربوطه درSolution Explorerنمایش دادهمی شود

ویرایش کد منبع
CodeWizardAVRتمام کدهای مورد نیاز برای مقداردهی اولیه ابزارهای جانبی را برای برنامه ما ایجاد کرده است، اکنون باید بخشی
از کد مورد نیاز برای اجرای وظیفه خود را اضافه کنیم: به طور متوالی با تأخیر200میلی ثانیه، هر یک از8LEDمتصل بهPORTD،
روشن می شود.
برای باز کردن فایل منبعCپروژه در ویرایشگر، باید روی گرهled demo.cدرSolution Explorerدوبار کلیک کنیم.
هنگامی که فایل در پنجره ویرایشگر بارگذاری شد، می توانیم تغییراتی را در آن اعمال کنیم

تمام عملکرد برنامه توسط تایمر1در مقایسه با روال سرویس وقفهtimer1_compa_isr(Timer 1 compare with OCR1A
match interrupt service routine)OCR1Aانجام می شودکه هر200میلی ثانیه فراخوانی می شود.
کد مورد نیاز با متن پررنگ در آنجا اضافه می شود:
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
// If all LEDs are off, light the first one
if (PORTD == 0xFF) PORTD = 0xFE;
// One of the LEDs is already lighted, turn it off and light the next one
else PORTD = (PORTD << 1) | 1;
}
وجه: از آنجایی که آندهایLEDتوسط یک مقاومت به +5ولت و کاتدها به خروجی هایPORTDمتصل می شوند، برای روشن شدن آنها بایدخروجی مربوطه را روی سطح منطقی0تنظیم کرد.
1.پیکربندی پروژه
2.هنگامی که تغییرات مورد نیاز در کد منبع برنامه ایجاد شد، مرحله بعدی پیکربندی گزینه های ساخت پروژه با استفاده از منوی
Project|Configureاست.
3.پنجره محاوره ای نمایش داده می شود

ما باید تراشه را پس ازبیلدموفقیت آمیز به طور خودکار برنامه ریزی کنیم.
این کار را می توان با انتخاب تبAfter Buildو فعال کردن گزینهAction: Upload to Arduinoانجام داد

در تنظیمات آپلود آردوینو”Arduino Upload Settings”، گزینه های زیر باید تنظیم شوند:
•نوع برد آردوینو”Arduino Board Type”:Arduino Uno ATmega328P
•COM Port: پورت سریالی که برای ارتباط با برد توسعه استفاده می شود.
نکته: پورت ارتباط سریال مجازی است و در هنگام اتصال برد آردوینوUNOبه کامپیوتر توسط درایورUSB FTDIارائه می
شود.توسط افزونهCodeVisionAVRشناسایی می شود و درلیستCOM Portظاهر می شود( .اگر بردArduino UNOبه
رایانه متصل باشد)
اگر رایانه شما دارای چندین پورت سریال است، مطمئن شوید که یک پورت صحیح مرتبط با بردArduino UNOرا انتخاب کنید.
شماره پورت سریال را می توان با استفاده ازمنو زیر فهمید:
Windows Control Panel > Hardware and Sound > Device Manager > Ports (COM & LPT) > Arduino UNO.
همچنین تراشه را می توان با استفاده از برنامه نویسUSB Atmel AVRISP MkIIکه به هدرISPبرد آردوینوUNOمتصل است،
برنامه ریزی کرد.
در این حالتAction: ProgramگزینهChipبایدانتخاب شود:

گزینه های زیر باید تنظیم شوند:
•Programmer: AVRISP MKII
•SCK Freq: 125000 Hz
•Program Fuse Bit(s) : enabled
•همه فیوز بیت ها =0حالت برنامه ریزی نشده (not checked) به جزBODLEVEL1=0که باید در حالت برنامه ریزی شده
باشد (checked).
توجه:اگرAVRISP MkIIبرای برنامه نویسی بردArduino UNOاستفاده شود، بوت لودر از پیش برنامه ریزی شده توسط سازنده در
تراشهATmega328Pپاک می شود.
این از هر گونه آپلود آینده با استفاده از درگاهCOMمجازی در گذرگاهUSBجلوگیری می کند، مگر اینکه بوت لودر و فیوز بیت ها دوباره
به درستی برنامه ریزی شوند
تغییرات پیکربندی پروژه باید با کلیک بر روی دکمهOKتایید شود.
.1ساخت پروژه و برنامه نویسی تراشه
مرحله آخر کامپایل و پیوند دادن برنامه ما با استفاده از دستورBuild|Build led demo menuاست. پس از ساخت موفق، پنجره
Informationزیر نمایش داده می شود

با کلیک بر روی دکمه chip the Program برنامه کامپایل شده را به FLASH تراشه منتقل می کند و فیوز بیت ها را برنامه ریزی می
کند.
پس از انجام این عملیات، برنامه شروع به اجرا می کند.
1 اشکال زدایی برنامه
هنگامی که برنامه با موفقیت ساخته شد، می توان آن را در فرم سورس لول با استفاده از شبیه ساز Studio Atmel اشکال زدایی کرد.
یک سشن اشکال زدایی را می توان با استفاده از دستورBreak and Debugging Debug|Start در منو، فشار دادن کلیدهای Alt+F5 شروع کرد.
اگر فایلهای منبع از آخرین Build تغییر کرده باشند، قبل از شروع اشکالزدایی، یک Rebuild بهطور خودکار انجام میشود. Studio Atmel از فایل شی .cof تولید شده توسط CodeVisionAVR برای اشکال زدایی استفاده می کند. هنگامی که سشن اشکال زدایی برای اولین بار شروع می شود، از کاربر خواسته می شود تا ابزاری را که برای ردیابی اجرای برنامه استفاده می کند انتخاب کند

برای مثال ما شبیه ساز Simulator را انتخاب کرده و روی دکمه OK کلیک می کنیم
پس از انتخاب ابزار اشکال زدایی، سشن اشکال زدایی شروع می شود

شبیه ساز ابتدا کد اولیه راهاندازی سطح پایین را اجرا میکند که شامل پر کردن تمام مکانهای RAM با s0، مقداردهی اولیه متغیرهای سراسری، دادهها و نشانگرهای پشته سختافزاری است.
پس از اتمام این عملیات، اجرای برنامه به عملکرد اصلی برنامه منتقل می شود. دیباگر اجرای برنامه را در اولین خط منبع C اصلی متوقف می کند و به کاربر این امکان را می دهد که برنامه را از آنجا تک مرحله ای کند.
رجیسترهای چیپ AVR در پنجره Processor نمایش داده می شوند. بهطور پیشفرض شبیهساز از فرکانس ساعت 1000 مگاهرتز استفاده میکند، اما در مثال ما، تراشه با فرکانس 16.000 مگاهرتز کار میکند، بنابراین باید با کلیک بر روی قسمت Frequency و وارد کردن مقدار صحیح در آنجا، این فرکانس را تغییر دهید

گام بعدی در اشکال زدایی برنامه ما این است که یک نقطه شکست (breakpoint) در ابتدای خروجی تایمر 1 مقایسه روتین سرویس وقفه imer1_compa_isr است.
این کار با قرار دادن مکان نما در اول خط کد در تابع فوق و انتخاب دستور Breakpoint Debug|Toggle یا فشار دادن کلید F9 به دست می آید:

خط با نقطه شکست )breakpoint( های لایت خواهد شد.
پس از گذاشتن بریک پوینت میتوانیم با استفاده از Into Debug|Step در منو یا دگمه در تولبار یا کلید F11 به اندازه یک مرحله در برنامه به جلو برویم.
با انتخاب دستور Debug|Continue در منو، فشردن کلید F5 یا دکمه در تولبار می توانیم اجرای برنامه خود را تا رسیدن به نقطه شکست شروع کنیم.
نکته مهم: شبیه ساز Studio Atmel برنامه را با سرعتی بسیار کمتر از تراشه AVR واقعی اجرا می کند، بنابراین رسیدن به نقطه شکست تنظیم شده در تابع timer1_compa_isr در زمان واقعی پس از 200 میلی ثانیه رخ نمی دهد.
به نظر می رسد بسته به سرعت کامپیوتر میزبان، شبیه ساز به مدت 1 … 2 دقیقه متوقف می شود، اما در نهایت اجرای برنامه در نقطه بریک پوینت متوقف می شود:

هنگامی که اجرای برنامه در تابع timer1_compa_isr متوقف شد، ما مقدار Watch Stop را ms 200776.44 در پنجره .دید خواهیم Processo

این مقدار کمی بزرگتر از 200 میلی ثانیه است که به عنوان دوره وقفه مقایسه خروجی تایمر 1 تعیین کرده ایم.
ms 776.44 اضافی توسط کد راه اندازی اولیه، پس از تنظیم مجدد تراشه و لحظه ای که رجیسترهای تایمر 1 برای اولین بار مقداردهی اولیه می شوند و شمارش شروع می شود، مورد نیاز است.
برای ادامه اجرای برنامه دوباره کلید F5 را فشار می دهیم.
بسته به سرعت کامپیوتر میزبان، شبیه ساز پس از 2…1 دقیقه دوباره در نقطه شکست timer1_compa_isr متوقف می
شود.این بار مقدار Watch Stop در پنجره Processor مقدار ms 400776.38 خواهد بود:

بنابراین فاصله زمانی بین دو وقفه خروجی مقایسه A تایمر 1 مقدار زیر خواهد بود:
400776.38 ms – 200776.44 ms = 199999.94 ms = 199.99994 ms
که برابر با 200 میلی ثانیه با خطای ناچیز است.
هنگام اشکال زدایی می توان از دستورات اضافی زیر استفاده کرد:
· Over Debug|Step، کلید F10 یا دکمه در نوار ابزار برای اجرای یک دستور.
· اگر دستورالعمل حاوی یک فراخوانی تابع باشد، تابع نیز اجرا می شود.
· Out Debug|Step، کلیدهای Shift+F11 یا دکمه در نوار ابزار برای ادامه اجرا تا تابع فعلی کامل شود.
· Cursor To Debug|Run، کلیدهای Ctrl+F10 یا دکمه در نوار ابزار برای ادامه اجرا تا رسیدن به موقعیت مکان نما فعلی در فایل منبع یا رسیدن به دیسمبلی ویو
· Debug|Reset ، کلیدهای Shift+F5 یا دکمه نوار ابزار برای شروع مجدد اجرای برنامه از ابتدا
· Debug|Restartیا دکمه در نوار ابزار برای راه اندازی مجدد دیباگر و بارگیری مجدد برنامه رفع اشکال
· Breakpoint Debug|Toggleیا کلید F9 برای تنظیم بریک پوینت در موقعیت مکان نما فعلی در فایل منبع C یا دیسمبلی ویو
· Function at Breakpoint|Break Debug|Newبرای تنظیم نقطه بریک پوینت در ابتدای یک تابع خاص
شده تنظیم شکست نقاط تمام حذف برای Ctrl+Shift+F9 کلیدهای یا Debug|Delete All Breakpoints ·
· Breakpoints All Debug|Disable غیرفعال کردن همه نقاط شکست برای غیرفعال کردن موقت تمام نقاط شکست تنظیم شده
· Breakpoints Debug|All را فعال کنید تا تمام نقاط شکست تنظیم شده را دوباره فعال کنید
· All Debug|Break، کلیدهای Ctrl+F5 یا دکمه نوار ابزار برای توقف اجرای برنامه
· Debug|Windows امکان نمایش پنجره های خاص برای دیدن متغیرها، ثبات های پردازنده، رجیسترهای ورودی/خروجی و محیطی، محتویات حافظه، کد دیسمبلی و غیره را می دهد.
· Debugging Debug|Stop، کلیدهای Ctrl+Shift+F5 یا دکمه نوار ابزار سشن دیباگینگ را متوقف می کند.
برای کسب اطلاعات بیشتر در مورد استفاده از دیباگر، لطفاً به راهنمای Studio Atmel مراجعه کنید.
توجه: کامپایلر برخی از تکنیک های بهینه سازی را اعمال می کند که ممکن است از دیباگ کردن صحیح برنامه در حال اجرا جلوگیری کند.
Project|Configure|C Compiler|Code Generation|Optimize for:
بنابراین توصیه می شود برای اشکال زدایی کد گزینه
Speed را انتخاب کنید.
اگر برنامه در FLASH تراشه قرار می گیرد، این گزینه باید برای Release نیز فعال بماند، در این حالت برنامه هم سریعتر اجرا می شود.
نتیجه گیری
این مقاله دستورالعمل های لازم را برای شروع سریع توسعه و اشکال زدایی یک برنامه با استفاده از افزونه CodeVisionAVR برای
.دهد می ارائه Studio Atmel
CodeVisionAVR همراه با راهنمای جامع و راهنمای کاربر ارائه شده است که باید به طور کامل مورد مطالعه قرار گیرد تا بتوان از تمام
ویژگیهای کامپایلرC ، کتابخانههای جانبی مرتبط، CodeWizardAVR و ویرایشگر/تبدیل تصویر/فونت Vision LCD برای
نمایشگرهای گرافیکی استفاده کرد.
کامپایلر با تعداد زیادی برنامه نمونه ارائه شده است که شامل موارد زیر است:
- Alphanumeric LCD
- Graphic LCD, TFT and OLED displays
- Resistive touch screen
- SD Memory Cards
- USART
- TWI, I2C
- SPI
- ADC
- Boot loaders
- USB
- Web Server
- XMEGA EBI
- XMEGA Quadrature Encoder
- XMEGA DAC
- DS1820, DS18B20, LM75, DS1621 temperature sensors
این برنامه ها در زیر شاخه های \Examples و ATxmega \Examples دایرکتوری نصب CodeVisionAVR قرار دارند.
Appendix A – The Source Code
/******************************************************* This program was created by the
CodeWizardAVR V3.03 Standard Automatic Program Generator
® Copyright 1998-2013 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
Project : Moving LED demo Version : 1.0
Date : 14/03/2013 Author : Pavel Haiduc Company : HP InfoTech Comments:
This is a simple program
Chip type : ATmega328P
Program type : Application AVR Core Clock frequency: 16.000000 MHz Memory model : Small
External RAM size : 0
Data Stack size : 512
*******************************************************/ #include <mega328p.h>
// Declare your global variables here
// Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
// If all LEDs are off, light the first one if (PORTD == 0xFF) PORTD = 0xFE;
// One of the LEDs is already lighted, turn it off and light the next one else PORTD = (PORTD << 1) | 1;
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1 #pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) |
(0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) |
(1<<DDD0);
// State: Bit7=1 Bit6=1 Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
PORTD=(1<<PORTD7) | (1<<PORTD6) | (1<<PORTD5) | (1<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00; OCR0A=0x00; OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0.2 s
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0xC3; OCR1AL=0x4F;
OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20); TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00; OCR2A=0x01; OCR2B=0x00;
// Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
// Timer/Counter 2 Interrupt(s) initialization TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
// USART initialization
// USART disabled
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On DIDR1=(0<<AIN0D) | (0<<AIN1D);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
// Global enable interrupts #asm("sei")
while (1)
{
// Place your code here
}
}