بخش دوم آموزش AVR : بررسی و راه اندازی میکرو کنترلر ATMEGA32

بازگشت به آموزشگاه

مقدمه

در بخش قبلی آموزش ، معماری و ساختار کلی میکروکنترلرهای AVR را با هم بررسی کردیم . برای اینکه شما بتوانید بهترین ، مناسب ترین و کم هزینه ترین میکروکنترلر AVR را برای پروژه خاص خود انتخاب کنید ، شرکت Atmel انواع این میکروکنترلرها را در بسته بندی های گوناگون ، با امکانات متغیر و ساختار داخلی کمی متفاوت با آنچه که در فصل قبل گفته شد را تولید می کند ، به طوری که : تمامی میکروکنترلرهای AVR از نظر معماری کلی خصوصا معماری هسته مرکزی (CPU) تقریبا یکسان بوده اما از نظر مقدار حافظه SRAM ، EEPROM ، FLASH و تعداد امکانات جانبی ( نظیر پورت ها ، تایمر/کانتر ، ارتباطات سریال و … ) می توانند با یکدیگر متفاوت باشند . میکرو کنترلر معروف و پرکاربرد ATMEGA32 که به طور کامل با آن آشنا خواهید شد ، تقریبا اکثر امکانات جانبی را داراست . بنابراین علت اینکه این نوع میکرو را برای تشریح ، راه اندازی و آموزش انتخاب کردیم این است که اولا این میکرو پرقدرت و پرکاربرد است و ثانیا کامل بوده و تقریبا تمامی امکانات جانبی را داراست . در نتیجه مسلط بودن به این میکروکنترلر ، باعث خواهد شد که به تمامی میکروکنترلرهای AVR تسلط لازم را داشته باشید .

 


خصوصیات ، ویژگی ها و عملکرد ATMega32

میکروکنترلر ATMega32 یک میکروکنترلر ۸ بیتی کم مصرف از تکنولوژی CMOS و از خانواده MEGA AVR است که بر اساس معماری RISC بهبود یافته می باشد . با اجرای دستورات قدرتمند در یک سیکل کلاک این میکرو سرعتی معادل ( ۱MIPS ( Millions Instruction Per Second در هر MHz ( یعنی زمانی که فرکانس کاری میکرو ۱ مگاهرتز است ، میکرو می تواند یک میلیون دستور العمل در هر ثانیه انجام دهد ) فراهم میکند که به طراح سیستم این اجازه را می دهد تا توان مصرفی میکرو را برحسب سرعت پردازش مورد نیاز پروژه مدیریت کند .

Mega32

خصوصیات و ویژگی های این میکرو که ترجمه صفحه اول دیتاشیت Atmega32 می باشد ، به شرح زیر است :

  • کارایی بالا ، توان مصرفی کم ، یک میکروکنترلر ۸ بیتی از خانواده AVR

  • دارای معماری RISC بهبود یافته

– دارای ۱۳۱ دستورالعمل قدرتمند که اکثر آنها تنها در یک سیکل کلاک اجرا می شوند

– دارای ۳۲ رجیستر عمومی ۸ بیتی همه منظوره

– عملکرد کاملا پایدار

– سرعتی حداکثر تا ۱۶MIPS در فرکانس ۱۶MHz

– دارای ضرب کننده جداگانه داخلی که در دو کلاک سیکل عمل ضرب را انجام می دهد

  • دارای حافظه غیر فرار برای برنامه و دیتا

– ۳۲ کیلوبایت حافظه فلش داخلی قابل برنامه ریزی

پایداری : تا ۱۰,۰۰۰ بار نوشتن و پاک کردن

– ۱۰۲۴ بایت حافظه EEPROM

پایداری : تا ۱۰۰,۰۰۰ بار نوشتن و پاک کردن

– ۲ کیلوبایت حافظه SRAM داخلی

– دارای قفل برنامه برای حفاظت نرم افزاری از حافظه

  • قابلیت ارتباط به صورت JTAG تحت استاندارد (IEEE std. 1149.1)

– قابلیت مشاهده تمامی رجیسترها و متوقف کردن برنامه روی دستور خاص جهت عیب یابی

– برنامه ریزی حافظه فلش ، EEPROM ، فیوزبیت ها و بیت های قفل ( Lock Bits ) از طریق ارتباط JTAG

  • خصوصیات جانبی میکروکنترلر

– دو تایمر/کانتر ۸ بیتی و یک تایمر/کانتر ۱۶ بیتی

– یک کانتر زمان حقیقی (RTC) با اسیلاتور جداگانه

– ۴  کانال برای PWM

– ۸ کانال برای مبدل آنالوگ به دیجیتال ۱۰ بیتی

۸ کانال معمولی یک طرفه

۷ کانال تفاضلی ( که این قابلیت فقط در بسته بندی TQFP وجود دارد)

دارای ۲ کانال تفاضلی با گین قابل برنامه ریزی ۱ ، ۱۰ و ۲۰۰ برابر کننده

– قابلیت ارتباط با پروتکل سریال دوسیمه I2C

– دارای پورت USART سریال قابل برنامه ریزی

– قابلیت ارتباط سریال SPI به صورت Master یا Slave

– دارای تایمر قابل برنامه ریزی Watchdog با اسیلاتور داخلی جداگانه

– دارای مقایسه کننده آنالوگ داخلی

  • خصوصیات ویژه میکروکنترلر

– ریست خودکار میکرو در هنگام روشن شدن

– شناسایی ولتاژ تغذیه ورودی قابل برنامه ریزی و ریست خودکار میکرو

– دارای اسیلاتور RC داخلی کالیبره شده

– منابع وقفه داخلی و خارجی

– دارای ۶ حالت خواب ( Sleep Mode ) برای کم مصرف شدن میکرو

  • ورودی/خروجی و بسته بندی

– دارای ۳۲ خط ورودی/خروجی قابل برنامه ریزی

– در بسته بندی های مختلف ۴۰پایه PDIP ،

۴۴ پایه TQFP و ۴۴ پایه MLF

  • ولتاژهای کاری

– ۷ تا ۵٫۵ ولت در ATMega32L

– ۵ تا ۵٫۵ ولت در ATMega32

  • فرکانس های کاری

– ۰ تا ۸MHz برای ATMega32L

– ۰ تا ۱۶MHz برای ATMega32

 


تشریح عملکرد پایه ها در ATMEGA32

همانطور که مشاهده کردید این میکرو در سه بسته بندی مختلف تولید و عرضه شده است که بسته بندی TQFP و MLF به صورت SMD ( تکنولوژی روی سطح برد ) برای استفاده در pcb ( فیبر مدار چاپی ) و بسته بندی PDIP به صورت DIP (پایه دار ) مناسب برای استفاده در بردبرد می باشد . بسته بندی PDIP این میکرو که در شکل زیر مشاهده می کنید ۴۰ پایه دارد . دارای ۴ پورت ورودی/خروجی ( PA تا PD ) که هر پورت آن دارای ۸ بیت است (از ۰ تا ۷) . منظور از پورت همان ورودی/خروجی های موازی(پارالل) واحد I/O می باشد .

Atmega32Pins

پایه های ۱ و ۲ ( T0 و T1 ) : به ترتیب مربوط به ورودی کلاک خارجی تایمر ۰ و تایمر ۱ می باشد .

پایه های ۳ و ۴ ( AIN0 و AIN1 ) : به ترتیب پایه مثبت و منفی واحد مقایسه کننده آنالوگ می باشد .

پایه های ۵ تا ۸ ( MISO ، MOSI ، SCK ، SS ) : این پایه ها مربوط به ارتباط spi ( واحد ارتباط سریال ) می باشد.

پایه ۹ ( RESET ) : پایه ریست میکرو است که تا زمانی که به منطق صفر وصل شود میکرو در حالت ریست میماند .

پایه ۱۰ ( VCC ) : پایه تغذیه مثبت دیجیتال

پایه ۱۱ ( GND ) : پایه تغذیه منفی یا زمین دیجیتال

پایه های ۱۲ و ۱۳ ( XT1 و XT2 ) : ورودی های واحد کلاک میکرو کنترلر است .

پایه های ۱۴ و ۱۵ ( RXD و TXD ) : به ترتیب گیرنده و فرستنده دیتا مربوط به ارتباط USART (واحد ارتباط سریال) می باشد .

پایه های ۱۶ ، ۱۷ و ۳ ( INT0 ، INT1 ، INT2 ) : به ترتیب مربوط به وقفه های خارجی صفر ، یک و دو است .

پایه های ۴ ، ۱۹ ، ۱۸ ، ۲۱ ( OC0 ، OC1A ، OC1B و OC2 ) : مربوط به خروجی های کانال PWM (واحد تایمر/کانتر ) است.

پایه های ۲۲ و ۲۳ ( SCL ، SDA ) : مربوط به پروتکل دوسیمه ( واحد ارتباط سریال ) می باشد .

پایه های ۲۴ تا ۲۷ ( TCK ، TMS ، TDO ، TDI ) : مربوط به ارتباط JTAG می باشد .

پایه های ۲۸ و ۲۹ ( TOSC1 و TOSC2 ) : مربوط به واحد RTC می باشد . در زمان استفاده از RTC به این دو پایه کریستال ۳۲۷۶۸ هرتز وصل می‌شود .

پایه ۳۰ ( AVCC ) : ولتاژ تغذیه آنالوگ واحد ADC است .

پایه ۳۱ ( GND ) : زمین آنالوگ واحد ADC است.

پایه ۳۲ ( AREF ) : پایه مربوط به ولتاژ مرجع قسمت ADC می باشد .

پایه های ۳۳ تا ۴۰ ( ADC0 تا ADC7 ) :  کانال های ورودی آنالوگ مربوط به واحد ADC می باشد .

 

نکته : همانطور مشاهده می شود بعضی از پایه ها دو یا سه عملکرد دارند که همزمان نمیتوان از چند عملکرد استفاده کرد و در آن واحد تنها یک کاربرد از آنها استفاده می گردد . مثلا اگر از پورت A به عنوان ورودی/خروجی پارالل استفاده شود دیگر نمیتوان از قابلیت واحد ADC میکروکنترلر استفاده نمود .
نکته : همانطور که میدانید میکروکنترلرهای AVR میکروکنترلرهای ۸ بیتی هستند ، بنابراین پهنای باس داده ، همه رجیسترها ، پورت های ورودی/خروجی همگی ۸ بیتی هستند.

 


معماری و ساختار داخلی میکروکنترلر Atmega32

همانطور که از پایه ها و ویژگی های میکروکنترلر پیداست ، این میکروکنترلر دارای واحد های زیر می باشد و معماری داخلی آن مطابق شکل زیر است :

AtMega32BlockDiagram

واحد پردازش مرکزی ( CPU ):

دارای ۱۳۱ دستورالعمل می باشد که در صفحه ۳۲۷ دیتاشیت همه ۱۳۱ دستور العمل به زبان اسمبلی آورده شده است . معماری این واحد دقیقا مشابه گفته شده در فصل قبل می باشد . این واحد در شکل فوق با نقطه چین ( AVR CPU ) مشخص شده است . ضمنا پهنای رجیستر شمارنده برنامه (Program Counter) در این میکروکنترلر ۱۴ بیت می باشد .

 

واحد حافظه برنامه Flash :

این واحد که در شکل فوق با نام Program Flash در کنار CPU نشان داده شده است ، در این میکروکنترلر دارای ۳۲ کیلوبایت طول و ۸ بیت عرض برای ذخیره برنامه می باشد . برنامه نوشته شده به زبان C بعد از کامپایل شدن درون این واحد به یکی از سه صورت موازی (پارالل) ، JTAG و Spi پروگرام می شود تا توسط CPU خط به خط خوانده و اجرا شود . همچنین در هنگام راه اندازی میکروکنترلر ( بوت شدن ) ، تنظیمات راه اندازی میکروکنترلر شامل فیوز بیت ها ( Fuse Bits ) و بیت های قفل ( Lock Bits ) که در بخشی از حافظه Flash به نام Boat Loader هستند ، اعمال می شوند . بنابراین حافظه فلش از دو قسمت برنامه (Application) و بوت (Boat) تشکیل می شود که در شکل زیر نشان داده شده است . سمت چپ شکل آدرس خانه های حافظه را نشان می دهد که از ۰۰۰۰ در مبنای هگز تا ۳FFF هگز نامگذاری می شود . از آن جایی که همه دستورالعمل ها در میکروکنترلرهای AVR تعداد ۱۶ یا ۳۲ بیت دارند ، حافظه فلش در این میکروکنترلر به صورت ۱۶ کیلوبایت طول در ۱۶ بیت عرض سازماندهی شده است . برای همین رجیستر PC در cpu دارای ۱۴ بیت عرض می باشد تا بتواند هر ۱۶K خانه حافظه برنامه را آدرس دهی نماید .

 

نکته : از حافظه برنامه Flash در صورتی که حجم برنامه کم بوده باشد و فضای خالی موجود باشد ، میتوان برای ذخیره دائمی اطلاعات ( یعنی به عنوان حافظه داده ) نیز استفاده نمود .

Atmega32Flash

واحد حافظه داده SRAM :

این واحد که در نزدیکی CPU قرار دارد دارای حجم ۲ کیلوبایت و پهنای ۸ بیت می باشد . به طوری که ۳۲ خانه اول در آن مربوط به General Register File یا همان رجیسترهای عمومی که در حقیقت جزو واحد CPU بوده و به طور مستقیم با واحد CPU در ارتباط است . ۶۴ خانه بعدی حافظه SRAM مربوط به نگهداری و ذخیره کلیه رجیسترها می باشد . رجیسترهای تنظیمات تمامی واحدها ( واحد ورودی/خروجی ، واحدهای سریال ، تایمرها و کانترها و … ) در حقیقت در این قسمت قرار دارد . و این یعنی همه واحد ها از SRAM دستور کار می گیرند . برای مشاهده لیست تمامی رجیسترهای موجود در این قسمت به صفحه ۳۲۵ دیتاشیت مراجعه نمایید . بقیه خانه های حافظه همان واحد SRAM اصلی می باشد که جهت نگهداری اطلاعات و داده های برنامه که یا دائما تغییر می کنند ( مثلا متغیرهایی که در برنامه توسط کاربر تعریف می شود ) یا داده هایی که در زمان محدودی به آنها نیاز داریم ( مثلا متغیرهای توابعی که بعد از پایان کار تابع به طور خودکار از بین می رود ) می باشد . در شکل زیر نحوه سازماندهی این حافظه را مشاهده می کنید . در شکل سمت راست حافظه SRAM را به صورت خانه هایی که آدرس آنها داخلش نوشته شده است و در شکل سمت چپ معادل آن خانه ها را مشاهده می کنید .

 

نکته : فقط با قطع تغذیه محتویات SRAM از بین میرود و در صورتی که میکروکنترلر را Reset دستی یا خارجی کنیم محتوای حافظه SRAM صفر نمی شود.

Atmega32SRAM

واحد حافظه داده EEPROM :

این حافظه که در این میکروکنترلر ، ۱ کیلوبایت ( ۱۰۲۴ بایت ) است ، جزء حافظه های ماندگار می باشد که در صورت قطع تغذیه میکروکنترلر پاک نمی گردد و میکروکنترلر در هر زمان می تواند اطلاعاتی را در این حافظه بنویسد و یا اطلاعاتی را از آن بخواند با این تفاوت که خواندن و نوشتن در حافظه eeprom زمان تاخیر طولانی تری از حافظه های SRAM و Flash دارد . از این حافظه زمانی استفاده می شود که میکروکنترلر باید دیتایی را در خود ثبت کند و بعدا آن دیتا را به کاربر اعلام کند و در صورتی که میکروکنترلر Reset شد با تغذیه آن قطع گردید داده ذخیره شده از بین نرود .

 

  • واحد ورودی/خروجی
  • واحد کنترل کلاک
  • واحد تایمر/کانتر
  • واحد Wathdog Timer
  • واحد کنترل وقفه
  • واحد ارتباطی JTAG
  • واحد مبدل ADC
  • واحد مقایسه کننده
  • واحد ارتباطی spi
  • واحد ارتباطی USART
  • واحد ارتباطی TWI

 

تذکر : عملکرد ، معماری و رجیسترهای بقیه واحدهای جانبی فوق الذکر در این بخش و بخش های آتی کاملا تشریح خواهد شد .

 


ساختار برنامه میکروکنترلر به زبان C

برنامه میکروکنترلر باید توسط برنامه نویس روی یک کامپایلر نوشته شود و سپس توسط پروگرامر روی میکرو پروگرام شود . برنامه ای که نوشته می شود باید طوری نوشته شود که وقتی روی آی سی پروگرام شد دائما اجرا شود و هیچگاه متوقف نشود . راه حل این مسئله قرار دادن کدهای برنامه درون یک حلقه نامتناهی است . این عمل باعث می شود تا میکروکنترلر هیچگاه متوقف نشود و بطور مداوم عملکرد مورد انتظار را اجرا کند. بنابراین ساختار یک برنامه به زبان C که قرار است در کامپایلر CodeVision نوشته شود به صورت زیر در می آید.


نحوه عملیاتی شدن یک برنامه

در شکل زیر نحوه نوشتن یک برنامه نمونه در کامپیوتر و پروسه تولید کد و ریخته شدن آن روی میکروکنترلر به تصویر کشیده شده است. بعد از نوشتن برنامه ، فایلی متشکل از 0 و 1 در مبنای 2 تشکیل می شود ، سپس همین فایل به مبنای 16 می رود و درون فایل Hex ریخته می شود. فایل Hex توسط پروگرامر به درون حافظه Flash میکروکنترلر می رود و سپس CPU خط به خط برنامه را خوانده و اجرا می کند.

programming


حداقل سخت افزار راه اندازی میکروکنترلر Atmega32

برای راه اندازی این میکرو کافی است پایه های تغذیه دیجیتال ( ۱۰ و ۱۱ ) را به منبع تغذیه با ولتاژ مناسب وصل کرده و همچنین میبایست پایه RESET را توسط یک مقاومت مناسب (۱۰ کیلواهم ) به مثبت تغذیه وصل نماییم ( Pull Up ) . برای اینکه بتوانیم به صورت دستی میکرو را هر زمان که خواستیم ریست کنیم ، احتیاج به یک سوئیچ یا Push Button داریم . بنابراین مدار کامل شده به صورت زیر است . علت وجود خازن در مدار زیر جلوگیری از نوسانات ولتاژ در لحظه اتصال کلید و همچنین برای آرام آرام زیاد شدن ولتاژ در هنگام شروع به کار مجدد میکرو است . مقدار خازن و مقاومت میزان زمان افزایش ولتاژ تا Vcc در هنگام وصل منبع تغذیه را تعیین می کند که در پروژه های حرفه ای حتما ۱۰k و ۱۰n انتخاب می شود . پس از اتصال میکرو به صورت شکل زیر ، میکرو روشن شده و طبق برنامه ای که کاربر در حافظه فلش آن پروگرام کرده است ( توسط پروگرامر و نرم افزار کامپایلر ) ، شروع به کار می کند .

MinimumCircuitMega32

نکته : پایه های ۳۰ ، ۳۱ و ۳۲ به ترتیب ولتاژ تغذیه آنالوگ ، زمین آنالوگ و ولتاژ مرجع برای واحد ADC می باشند و تنها در هنگام استفاده از واحد ADC باید متصل شود .

 


 معرفی رجیسترهای واحدهای میکروکنترلر Atmega32

هر یک از واحدهای گفته شده در Atmega32 به جز CPU ، رجیسترهایی دارد که تنظیمات واحد مورد نظر را مشخص می کند . برنامه نویس باید رجیسترهای مربوط به هر واحد را شناخته و آنها را بسته به پروژه مورد نظر به درستی مقدار دهی نماید . در ادامه به معرفی هر یک از واحد ها و رجیسترهای مربوط به هر واحد خواهیم پرداخت . در این فصل ابتدا با رجیسترهای واحد I/O آشنا خواهیم شد و سپس در فصل هشتم بعد از آموزش CodeVision و برنامه نویسی C دوباره بقیه واحد ها را ادامه خواهیم داد .

 

رجیسترهای واحد I/O در AVR :

تمامی میکروکنترلرهای AVR از جمله Atmega32 دارای واحد I/O ( ورودی/خروجی ) می باشند . در ATmega32 چهار پورت ورودی/خروجی وجود دارد که برای هر یک پین هایی خروجی درنظر گرفته شده است که در تشریح پایه ها نیز گفته شد . هر یک از این ۴ پورت ورودی/خروجی دارای سه رجیستر به شرح زیر است . در نتیجه مجموعا ۱۲ رجیستر ۸ بیتی برای واحد ورودی/خروجی وجود دارد که همگی در حقیقت درون SRAM می باشند که با مقدار دهی آنها در برنامه این واحد کنترل می شود .

  • DDRX : یک رجیستر ۸ بیتی که مشخص کننده جهت ورودی یا خروجی بودن هر یک از پایه ها است . هر بیت از این رجیستر که ۱ باشد ، جهت پایه متناسب با آن به عنوان خروجی و هر بیت که ۰ باشد پایه متناسب با آن ورودی می گردد . در حالت default همه بیت های این رجیستر ۰ هستند یعنی تا زمانی که پایه ای را خروجی نکرده باشیم همه پایه ها ورودی هستند .
  • PORTX : در صورت انتخاب شدن رجیستر DDRX به عنوان خروجی از این رجیستر برای ۱ یا صفر کردن منطق پایه خروجی استفاده می شود . هر بیت از این رجیستر که ۱ باشد پایه متناسب با آن منطق ۱ را خارج می کند و هر بیت که ۰ باشد منطق ۰ در خروجی ظاهر می گردد. در حالت default همه بیت های این رجیستر ۰ هستند .
  • PINX : در صورت انتخاب شدن رجیستر DDRX به عنوان ورودی از این رجیستر برای خواندن منطق پایه های پورت استفاده می شود . هر منطقی که یکی از پایه های پورت داشته باشد ، بیت مورد نظر در رجیستر PINX همان منطق را به خود می گیرد. در حالت default همه بیت های این رجیستر ۰ هستند .

 

نکته ۱ : به جای X در بالا نام پورت مورد نظر قرار میگیرد ( A ، B ، C و D)

نکته ۲ : نام تمامی رجیستر ها از جمله رجیسترهای فوق با حروف بزرگ نوشته میشوند . بقیه حروف در برنامه همگی کوچک نوشته میشوند.

نکته ۳ : برای مقدار دهی به هر رجیستر در برنامه به زبان C از عملگر مساوی = استفاده میشود.

نکته ۴ : ۰b برای مقدار دهی به رجیسترها در مبنای ۲  (باینری) و ۰x برای مقدار دهی به رجیسترها در مبنای ۱۶ (هگز) به کار میرود .

 

مثال :

 

توضیح : هر سه خط فوق در واقع یک کار را انجام می دهند و آن هم خروجی کردن تمامی ۸ بیت پورت A است اما با این تفاوت که خط اول در مبنای ۱۰ ، خط دوم به صورت باینری و خط آخر به صورت هگز نوشته شده است . ( مبنای هگز راحت تر است )

 

توضیح : بعد از اینکه پورت A را خروجی تعریف کردیم در خط اول یکی در میان به خروجی ها منطق ۱ تزریق کردیم و در خط دوم نیمه پایینی پورت ( ۴بیت کم ارزش ) را ۱ و بقیه را ۰ کردیم . ( زمانی که رجیستر DDR تنظیم میشود همگی منطق ها به صورت default روی منطق صفر هستند )

 

توضیح : علاوه بر ۰ و ۱ کردن کل یک پورت میتوان تنها منطق یکی از پایه ها را تنظیم کرد این کار توسط یک نقطه و نوشتن بیت مورد نظر صورت می گیرد . برای مثال در خط اول بیت صفرم پورت A ( پایه ۴۰ میکرو ) منطق ۱ و در خط دوم بیت پنجم پورت A ( پایه ۳۵ ) منطق ۰ به خود می گیرد .

 

تذکر : از رجیستر PIN تنها در حالتی که پایه ورودی باشد ( مانند وقتی که کلیدی به عنوان ورودی به پایه وصل باشد ) ، استفاده میشود . مثالهای استفاده از رجیستر PIN را زمانی که نحوه اتصال کلید را آموزش دهیم ، خواهیم گفت .

 


مثال عملی شماره ۱

برنامه ای بنویسید که LED موجود روی PA.0 را ۴ بار در ثانیه به صورت چشمک زن روشن و خاموش کند . سپس آن را در نرم افزار Proteus شبیه سازی کرده و پس از اطمینان از عملکرد صحیح برنامه توسط نرم افزار CodeVision روی میکروکنترلر Atmega32 پیاده سازی نمایید .

حل : ابتدا سخت افزار مثال خواسته شده را روی کاغذ رسم می نماییم تا درک بهتری از مثال داشته باشیم سپس برنامه را به زبان C می نویسیم .

Mesal1Atmega32

 

توضیح برنامه :

در خط اول ابتدا کتابخانه مربوط به Atmega32 را اضافه می کنیم ( در همه برنامه های کار با Atmega32 باید نوشته شود )

در خط دوم کتابخانه مربوط به تابع تاخیر زمانی (delay.h) را اضافه می کنیم . زمانی که این کتابخانه به برنامه اضافه شود میتوان از تابع delay_ms برای تاخیر زمانی در برنامه استفاده کرد .

در خط پنجم ، پورت PA.0 ( بیت صفرم پورت A ) به عنوان خروجی تنظیم می شود .

در خط هفتم ، برنامه منطق ۱ را به پورت PA.0 که خروجی شده بود ، تخصصیص می دهد . در نتیجه led در این حالت روشن می شود .

در خط هشتم ، برنامه هیچ کاری انجام نداده و ۲۵۰ میلی ثانیه منتظر می ماند سپس به خط بعدی میرود . در نتیجه این خط led به مدت ۲۵۰ میلی ثانیه روشن میماند .

در خط نهم ، برنامه منطق ۰ را به پورت PA.0 که خروجی شده بود ، تخصصیص می دهد . در نتیجه led در این حالت خاموش می شود .

در خط دهم ، برنامه هیچ کاری انجام نداده و ۲۵۰ میلی ثانیه منتظر می ماند سپس به خط بعدی میرود . در نتیجه این خط led به مدت ۲۵۰ میلی ثانیه خاموش میماند .

چون برنامه در حلقه نامتناهی نوشته شده است ، با اجرا شدن برنامه LED موجود روی PA.0 دائما روشن و خاموش می شود و چون زمان تاخیر ۲۵۰ میلی ثانیه است این کار ۴ بار در ثانیه انجام می شود .

در فصل آینده بعد از آموزش Proteus و CodeVision به حل ادامه مثال (شبیه سازی و پیاده سازی) خواهیم پرداخت . با ما همراه باشید

 


با کلیک بر روی تصویر زیر به بخش بعدی آموزش AVR بروید

next-image



در صورتی که این مطلب مورد پسندتان بود لایک و اشتراک گذاری فراموش نشود.

28+

دیدگاه (17)

  • حمزه پاسخ

    توضیحات کافی و عالی 🙂 مرسی.

    2015-12-06 در 10:28
    • محمد حسین پاسخ

      خواهش می کنم ممنون از نظرتون

      2015-12-06 در 19:26
  • آیرس پاسخ

    مرسی حسین جان..به صورت اتفاقی مطلبتو دیدم…بسیار استفاده کردم…ممنون

    2016-03-02 در 19:52
    • محمد حسین پاسخ

      خواهش می کنم عزیزم … مررررسی …

      2016-03-03 در 03:46
  • HOJABRCR7 پاسخ

    همچنان پیش میرویم….و همچنان عاووووولی…مرسی مهندس.دست مریزاد 🙂 :)) 😉

    2016-06-30 در 10:36
  • saeid پاسخ

    سلام . هدر فایل mega32 توسز نرم افزار کد ویژن شناسایی نشد . چه کار کنم ؟؟

    2016-07-01 در 23:59
    • شجاع داودی پاسخ

      سلام مشکل از نرم افزار یا کرکشه که درست نصب نشده

      2016-07-02 در 06:43
  • امیر فرصتی قراملکی پاسخ

    مطالب ریز و پرورده ای بود
    مرسی

    2016-07-18 در 12:21
  • حمید رضا پاسخ

    سلام . خسته نباشین . ببخشید نمیدونم سوالم مربوط به اینجا میشه یا نه ؟اگه بخوایم پایه های یک پورت رو تغییر بدیم از چه دستوری یا روشی باید استفاده کنیم ؟ مثلا چهار تا سوییچ به پایه های 1 تا 4 پورت B وصله ومقدارهای 1و2و4و8 رو روی ال سی دی نمایش میده . حالا اگه بخوایم به جای این پایه ها از پایه های 3 تا 6 استفاده کنیم و همین مقادیر برگردونه بای چه کار کنیم ؟ راهنمایی کنید ممنون میشم .

    2017-04-24 در 10:27
    • ادمین الکترو ولت پاسخ

      سلام دوست عزیز با استفاده عملگر شیفت << این کار رو انجام میدیم

      2017-04-25 در 05:44
      • حمیدرضا پاسخ

        از پاسختون ممنونم ، ولی بازم نشد همون مقدارای قبل رو برمیگردونه . نمیدونم شاید من دستورات رو جابجا میزنم .

        2017-04-26 در 06:28
      • حمیدرضا پاسخ

        ببخشید در مورد سوالم فکرکنم منظورمو درست بیان نکردم که از این بابت معذرت میخوام .اگه بخوایم پایه های یک پورت رو تغییر بدیم از چه دستوری یا روشی باید استفاده کنیم ؟ مثلا چهار تا سوییچ به پایه های ۱ تا ۴ پورت B وصله ومقدارهای ۱و۲و۴و۸ رو روی ال سی دی نمایش میده . حالا اگه بخوایم به جای این پایه ها از پایه های ۱و۳و۵و۶ استفاده کنیم و همین مقادیر برگردونه .ترتیب خاصی نداره . ممکنه بخوایم پایه 2 و 5 و 6 و7 باشه . امیدورام این دفعه درست توضیح داده باشم . حالا نمیدونم بازم باید از شیفت استفاده بشه یا نه . ممنون.

        2017-04-26 در 12:48
        • ادمین الکترو ولت پاسخ

          بله دوست عزیز همه این عملیات ها با استفاده از اصول برنامه نویسی زبان سی و استفاده درست از عملگرها نظیر عملگر شیفت امکان پذیر است

          2017-04-26 در 18:16
          • حمیدرضا

            ممنون از شما . فقط مشکل اینه که من زبون سی زیاد بلد نیستم .تو اینترنتم چیزی مربوط به این پیدا نکردم ، اگه میتونستید یه تیکه کد مثال بیان کنید خیلی خیلی ممنونتون میشدم .

            2017-04-28 در 14:52
          • ادمین الکترو ولت

            توی سایتمون آموزش های برنامه نویسی سی هم قرار دادیم آن ها را مطالعه نمایید و در تلگرام به بنده پیام دهید

            2017-04-30 در 05:30
  • behzadabdolrezaee پاسخ

    سلام و خسته نباشید.
    این که بگیم در واقع خانه های SRAMو رجیستر ها دیود هایی هستند که اگر بایاس مستقیم داشته باشند و جریان رو عبور بدن میشن یک در غیر این صورت میشن 0 درسته؟

    2017-08-01 در 14:16
    • ادمین الکترو ولت پاسخ

      سلام ممنونم خیر این حرف را در مورد SRAM نمیتوان گفت اما در مورد حافظه های قدیمی ROM میتوان گفت

      2017-08-02 در 17:58

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

17 − 10 =

بازگشت به آموزشگاه