نمونه کد برای میکروکنترلر AVR

کد AVR

کد AVR بعضی از برنامه های تدریس شده

این کد ها در کلاس میکروکنترلر AVR با نرم افزار Code Vision AVR را در این صفحه می توانید دانلود کنید. این برنامه ها در دوره های بعدی AVR ممکن است تغییر کنند.

این کد ها با میکروکنترلر ATMega32 و زبان برنامه نویسی C نوشته شده اند.

کد AVR راه اندازی LCD کاراکتری در مد 8 بیتی

در این کد AVR بدون استفاده از پرچم Busy Flag اطلاعات برای LCD ارسال می شود. در این حالت پایه های داده همیشه خروجی می مانند. در صورتی که برنامه با تست پرچم Busy Flag انجام شود، باید پایه ی RW را به یکی از پورت های میکروکنترلر متصل نمود و جهت پایه های داده دائما ورودی و خروجی خواهد شد که در این حالت سرعت LCD بیشتر خواهد شد. در شبیه سازی پایه های 1 تا 3 از LCD نیازی نسیت که متصل شوند اما در عمل وصل بودن آنها الزامی است.

راه اندازی ال سی دی در مد 8 بیتی

دانلود


راه اندازی LCD کاراکتری در مد 4 بیتی بدون تست مشغول بودن LCD

 

ال سی دی در مد 4 بیتی

توابع موجود در این مد بدون استفاده از توابع آماده ی Code Vision نوشته شده اند. در شکل بالا LCD بدون تست Busy Flag متصل شده است و این مد کاری از LCD شبیه نرم افزار Bascom AVR می باشد.


راه اندازی LCD کاراکتری در مد 4 بیتی همراه با تست مشغول بودن LCD

ال سی دی در مد 4 بیتی با BF

توابع موجود در این مد بدون استفاده از توابع آماده ی Code Vision نوشته شده اند. در شکل بالا LCD همراه با تست Busy Flag متصل شده است و این مد کاری از LCD شبیه نرم افزار CodeVision AVR می باشد.


ولوم دیجیتالی

ولوم دیجیتالی

این ولوم خود نوعی مبدل دیجیتال به آنالوگ (DAC) ساده می باشد. در این برنامه با فشار دو کلید موجود، متغیری کم یا زیاد می شود و مقدار آن روی پورت D به صورت باینری نشان داده می شود. این ولوم دیجیتالی می تواند 256 حالت مختلف داشته باشد چرا که از 8 مقاومت استفاده شده است (دقت 8 بیتی دارد).


دقیقه و ثانیه شمار روی نمایشگر هفت قسمتی

 

نمایش دقیقه و ثانیه بر روی سون سگمنت

در این کد AVR متغیری زیاد می شود و مقدار آن روی یک سون سگمنت چهار رقمی نمایش می یابد. در صورتی که این متغیر بیش از 59 شود، به متغیر دقیقه یک واحد اضافه خواهد شد. پایه های آند مشترک در این مدار به طور مستقیم به میکروکنترلر متصل شده است که برای افزایش سرعت شبیه سازی این کار انجام داده شده است. اما در عمل به دلیل جریان محدود پورت ها باید هر کدام از این چهار پایه با یک ترانزیستور NPN به صورت شکل زیر متصل شوند.

تقویت جریان


نمایش اعداد بر روی نمایشگر دات ماتریس 8*8

 

راه اندازی دات ماتریس

در این کد AVR اعداد صفر تا نه روی دات ماتریکس نمایش داده می شوند. در این برنامه از حلقه ی refresh جهت کند کردن سرعت برنامه استفاده شده است.


نمایش متن متحرک روی نمایشگر ماتریسی 8*8

نمایش متن متحرک

در این کد AVR به عنوان نمونه عدد صفر به صورت متحرک بر روی Matrix نمایش داده می شود. این برنامه برای دو حالت حرکت به سمت راست و حرکت به سمت چپ نوشته شده است.


برنامه های اسمبلی به منظور تشریح دقیق وقفه و ساختمان میکروکنترلر AVR

 

AVR Studio Logo

برنامه ی اسمبلی جهت خروجی کردن پورت A

برنامه ی اسمبلی جهت خاموش و روشن کردن کل پورت B

برنامه ی اسمبلی جهت راه اندازی وقفه ی خارجی INT0 حساس به لبه ی بالا رونده

در این کد AVR با رخ دادن وقفه توسط دستور اسمبلی PUSH مقدار رجیستر های R17، R18 و R19 که در تابع وقفه استفاده شده اند، در حافظه ی Stack ذخیره شده و سپس تابع تاخیر در تابع وقفه مجددا فراخوانی می شود. پس از بازگشت از تابع تاخیر توسط دستور اسمبلی POP رجیستر های R17، R18 و R19 بازیابی می شوند. (اگر این کار انجام نشود، ممکن است اجرای بعضی از برنامه ها با مشکل روبرو شود زیرا این سه رجیستر در برنامه ی وقفه تغییر می کنند.) با استفاده از دستورات انشعاب (یعنی دستور BRNE) تاخیر ایجاد شده است.

برنامه ی اسمبلی Bootloader جهت تعویض قسمتی از حافظه ی برنامه

در این کد AVR ابتدا یک صفحه از حافظه ی Flash توسط دستور اسمبلی SPM که در قسمت Boot در انتهای این حافظه قرار دارد، پاک می شود و به صورت نمونه چهار بایت در بافر موقت صفحات نوشته شده و سپس توسط دستور اسمبلی SPM این چهار بایت به ابتدای حافظه ی Flash منتقل می شوند. این برنامه با نرم افزار AVR Studio قابل شبیه سازی است.


راه اندازی وقفه ی خارجی با زبان C

 

در این برنامه وقفه ی خارجی INT2 به لبه ی بالا رونده حساس شده است. با رخ دادن بار اول وقفه پورت A چشمک زن شده و برای بار دوم پورت C چشمک زن می شود و این کار به همین شکل ادامه پیدا می کند.


ساخت ساعت با استفاده از تایمر صفر

 

نمایش ساعت

در این برنامه ازوقفه ی سر ریز تایمر صفر برای ایجاد یک ثانیه استفاده شده است. فرکانس میکروکنترلر در این برنامه 1MHz است و تقسیم فرکانسی تایمر صفر نیز 1024 است در نتیجه فرکانس تایمر صفر برابر

1MHz/1024=976Hz

می شود. یعنی تایمر در مدت یک ثانیه 976 شمارش انجام می دهد. اما تایمر به دلیل اینکه هشت بیتی است تا 256 شمارش می شمارد در نتیجه داریم

976/256=3.81

یعنی تایمر 3 بار کامل سر ریز می شود و 0.81 نیز شمارش می کند یعنی

0.81*256=208

یعنی تایمر 3 بار کامل سر ریز شده و تا مقدار 208 در بار چهارم می رسد که تا سر ریز شدن کامل 48 شماره کم دارد. حال اگر بعد از هربار سرریز شدن تایمر، مقدار TCNT رابا عدد 12 بار کنیم، تایمر دقیقا چهار بار سرریز می شود


ساخت فرکانس متر با استفاده از دو تایمر یکی در حالت معمولی و دیگری به عنوان کانتر

 

در این کد AVR تایمر یک وظیفه ی ایجاد یک ثانیه را دارد و تایمر صفر تعداد پالس های اعمال شده به پایه ی T0 را شمارش می کند. به دلیل اینکه تایمر صفر 8 بیتی است برای شمارش پالس های خارجی مناسب نمی باشد (چون 8 بیتی است و سریعا سرریز می شود) بنابراین بهتر است که تایمر صفر را برای ایجاد یک ثانیه و تایمر یک را برای شمارش پالس های خارجی انتخاب کنیم که برنامه ی نوشته شده برای این حالت در قسمت دانشگاه انقلاب اسلامی موجود است.


ساخت PWM با استفاده از تایمر صفر میکروکنترلر

 

ساخت PWM

در این کد AVR با استفاده از تایمر صفر که در حالت PWM قرار داده شده است، موج PWM در پایه ی OC0 تولید شده است که با افزایش مقدار رجیستر OCR0 نسبت یک بودن سیگنال بیشتر می شود.


روشن کردن RGB LED با استفاده از سه PWM

در این کد AVR با استفاده از تایمر دو و یک، سه موج PWM مختلف تولید می شود. هر کدام از این سه موج PWM به LED های قرمز، سبز و آبی اعمال می شوند. در صورت تغییر این سه موج نور خروجی سه LED که کنار هم قرار داده شده اند، تغییر می کند. به عنوان مثال اگر موج اعمالی دیود قرمز زمان وظیفه ی 25 درصد و موج اعمالی دیود سبز زمان وظیفه ی 10 درصد داشته باشد، نور خروجی زرد می شود. بهتر است LED ها از نوع OVAL باشند تا نور آنها بیشتر شود.


ساخت دماسنج به کمک مبدل آنالوگ به دیجیتال

نمایش دمای منفی

در این مدار با استفاده از دو دیود 1N4007 می توان دما های منفی را هم اندازه گرفت. در این صورت باید دما را از دو ADC به صورت دیفرانسیلی دریافت نمود و اختلاف آنها را محاسبه کرد.


استفاده از پروتکل SPI برای ارتباط بین میکروکنترلر ها

ارتباط چندین میکروکنترلر از طریق SPI

برنامه ی Master شمارنده و ارسال آن برای Slave و نمایش روی LCD بدون کتابخانه ی spi.h

برنامه ی Master شمارنده و ارسال آن برای Slave و نمایش روی LCD با کتابخانه ی spi.h

برنامه ی اطلاعات سنسور ها

در این برنامه چند سنسور در نقاط مختلفی قرار دارند. میکروکنترلر Master با انتخاب هر یک از Slave ها، دما را از آنها دریافت می کند. این برنامه به دو شکل مختلف نوشته شده است:

با استفاده از وقفه

بدون استفاده از وقفه

از دیگر کاربرد های این ارتباط می توان به حافظه های uSD و برخی از LCD ها و سنسورها و تابلو های روان اشاره نمود


استفاده از پروتکل USART برای ارتباط بین میکروکنترلر ها

ارتباط دو میکرو از طریق USART

در این کد AVR به صورت نمونه میکروکنترلر فرستنده اطلاعات را ارسال می کند و میکروکنترلر گیرنده اطلاعات دریافتی را روی LCD نشان می دهد. می توان بجای اتصال یک سیم بین دو میکروکنترلر در شکل بالا از ماژول های HMT و HMR استفاده نمود. این برنامه به سه شکل مختلف نوشته شده است. (منظور از سخت افزاری بودن این است که از سخت افزار قرار داده شدهدر داخل میکروکنترلر استفاده شده است و منظور از نرم افزاری این است که ارتباط با برنامه نویسی ایجاد شده است).

فرستنده و گیرنده هر دو سخت افزاری

فرستنده نرم افزاری و گیرنده سخت افزاری

فرستنده و گیرنده نرم افزاری

از جمله کاربرد های این ارتباط می توان به کاربرد در GSM، GPS و RFID اشاره نمود


استفاده از پروتکل I2C برای ارتباط بین میکروکنترلر ها

ارتباط دو میکرو از طریق I2C

ارسال اطلاعات به صورت I2C برای میکروکنترلر Slave با توابع آماده

ارسال اطلاعات به صورت I2C برای میکروکنترلر Slave بدون توابع آماده

ساخت ساعت با آی سی معروف DS1307

RTC

در صورت اتصال یک باتری سه ولتی به آی سی DS1307 اطلاعات زمان تا حدود 10 سال با قطع بودن برق باقی می مانند. این آی سی علاوه بر ساعت، تاریخ را به صورت میلادی می تواند در خود ثبت نماید و می توان با استفاده از الگوریتم های خاصی که در اینترنت موجود هستند، تاریخ میلادی را به تاریخ شمسی تبدیل نمود.

ای سی DS1307 یک RTC می باشدکه مخفف Real time clock می باشد .ازا مکانات این ای سی این است که با یک باطری بک آپ 3 ولتی می تواند تا 10 سال برای شما اطلاعات زیر را در خود بشمارد.

1:ساعت (شامل ثانیه – دقیقه وساعت ) به دو صورت 12 و 24 ساعت

2:تاریخ (شامل روز-ماه – سال ) به صورت میلادی که می توان با کد مخصوص که در پست های قبلی داده شده ان را به شمسی تبدیل کرد و همچنین تشخیص سال کبیسه

3:شمارش روز هفته (شنبه تا جمعه )

4:شمارش روز های طی شده از اول سال (البته به صورت میلادی)

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

این ای سی تمام و کمال کار شمارش را انجام می دهد یعنی بعد از این که ثانیه به 59 رسید سپس ثانیه را 0 کرده و به مقدار دقیقه یک واحد اضافه می کند تا آخر و میکرو فقط وظیفه خواندن مقدار از این ای سی و نمایش مقادیر بر روی ال سی دی را بر عهده دارد.

ارتباط با آی سی AT24C512 ساخت شرکت Atmel

ارتباط با آی سی حافظه

در این کد AVR ابتدا توسط یک حلقه که تا 100 می شمارد، اعداد زوج 0 تا 200 در داخل حافظه ذخیره می شوند و سپس این اعداد خوانده شده و روی LCD نمایش می یابند. با استفاده از پایه های آدرس A0 و A1 می توان به صورت ستقیم چهار حافظه ی AT24C512 را به میکروکنترلر متصلنمود به طوری که هرکدام از این حافظه ها می توانند 512K بیت یا 64K بایت داده را در خود جای دهند.

دریافت دما از چندین میکروکنترلر

در یافت دما از چندین نقطه

در این کد AVR دما توسط میکروکنترلر Master خوانده می شود. این میکروکنترلر ابتدا آدرس مورد نظر را می فرستد و اطلاعات را از آن آدرس می خواند.


ارتباط یک میکروکنترلر با مجموعه ای از میکروکنترلر ها به صورت I2C، SPI و USART

 

ارتباط با مجموعه ای از میکروکنترلر ها

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


راه اندازی سنسور گاز با مبدل آنالوگ به دیجیتال

 

طریقه ی راه اندازی سنسور گاز

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


آموزش فیوز بیت های میکروکنترلر AVR


پروگرمر میکروکنترلر های AVR مدل USB-ASP با فیبر مدار چاپی و نرم افزار لازم

مدار چاپی پروگرمر usbasp

پروگرمر usbasp

کلید بکار رفته در شکل بالا جهت برنامه ریزی میکروکنترلر هایی با فرکانس کوچکتر مساوی 1MHz می باشد که باید فشار داده شود. در غیر این صورت این کلید آزاد می ماند. این پروگزمر AVR خود از یک میکروکنترلر AVR مدل ATMega8 می باشد که باید فیوز بیت های آن در حالت کریستال خارجی قرار گرفته (هیچ کدام از فیوز های CKSEL را برنامه ریزی نمی کنیم) و فیوز بیت CKOPT نیز در حالت برنامه ریزی تنظیم شده و به فیوزهای BOOT نیز دست نمی زنیم.


نمایش ساعت، دقیقه و ثانیه بر روی دات ماتریس 64*8

در این کد AVR در ابتدا برای پردازش راحت کد ها، از یک آرایه ی 64 عضوی در حافظه ی SRAM استفاده شده است به این صورت که ابتدا کد های مورد نیاز خوانده شده و در حافظه ی SRAM ذخیره می شود و از آنجا بر روی ماتریس ها نشان داده می شود.

11 thoughts on “نمونه کد برای میکروکنترلر AVR

  1. امیر says:

    آقا دمت گرم.i2c رو خیلی خوب و ساده کار کردی و خیلی به کارم اومد.

  2. mohamad says:

    سلام

    واسه اینه بتونیم با پروتکل  spi در avr یه عدد 16 بیتی رو ارسال کنیم باید بصورت نرم افزاری برنامشو بنویسیم؟؟

    اصن شدنی هست؟؟

    • محمد رضا بیگی says:

      کافی است داده را دو بار ارسال کنیم

      و مشکلی پیش نمی آید

  3. رضا says:

    سلام ممنون از مطالبتون 
    من برنامه کار با ای سی ds1307 رو دانلود کردم بعد از اجرا در کد ویین خطاهای زیر و داد میشه کمک کنید 
    من میخوام برنامه رو جوری تغیر بدم که بشه با صفحه کلید زمانو تغییر داد.
    Error: DS1307.c(3): can't open #include file: ds1307.h
    Error: DS1307.c(22): undefined symbol 'rtc_init'
    که میگه فایل ds1307ررو نمی تونه بلز کنه و'rtc_init رو هم نمیشناسه

    • محمد رضا بیگی says:

      احتمالا نرم افزارتون یا ورژن قدیمی است یا مشکل دارد

      باید از نزدیک عیب را ببینم

  4. بهروز says:

    از مبدلهای dc  به dc با روش pwm به وفور در دستگاه ها استفاده میشه.

    یک مثال برای pwm کم نور شدن و سپس خاموش شدن نور گوشی موبایل بعد از مدتی که ازش استفاده نمی کنیم/

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

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