کد AVR بعضی از برنامه های تدریس شده
این کد ها در کلاس میکروکنترلر AVR با نرم افزار Code Vision AVR را در این صفحه می توانید دانلود کنید. این برنامه ها در دوره های بعدی AVR ممکن است تغییر کنند.
این کد ها با میکروکنترلر ATMega32 و زبان برنامه نویسی C نوشته شده اند.
کد AVR راه اندازی LCD کاراکتری در مد 8 بیتی
در این کد AVR بدون استفاده از پرچم Busy Flag اطلاعات برای LCD ارسال می شود. در این حالت پایه های داده همیشه خروجی می مانند. در صورتی که برنامه با تست پرچم Busy Flag انجام شود، باید پایه ی RW را به یکی از پورت های میکروکنترلر متصل نمود و جهت پایه های داده دائما ورودی و خروجی خواهد شد که در این حالت سرعت LCD بیشتر خواهد شد. در شبیه سازی پایه های 1 تا 3 از LCD نیازی نسیت که متصل شوند اما در عمل وصل بودن آنها الزامی است.
راه اندازی LCD کاراکتری در مد 4 بیتی بدون تست مشغول بودن LCD
توابع موجود در این مد بدون استفاده از توابع آماده ی Code Vision نوشته شده اند. در شکل بالا LCD بدون تست Busy Flag متصل شده است و این مد کاری از LCD شبیه نرم افزار Bascom AVR می باشد.
راه اندازی LCD کاراکتری در مد 4 بیتی همراه با تست مشغول بودن LCD
توابع موجود در این مد بدون استفاده از توابع آماده ی 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
برنامه ی اسمبلی جهت خروجی کردن پورت 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 با استفاده از تایمر صفر میکروکنترلر
در این کد AVR با استفاده از تایمر صفر که در حالت PWM قرار داده شده است، موج PWM در پایه ی OC0 تولید شده است که با افزایش مقدار رجیستر OCR0 نسبت یک بودن سیگنال بیشتر می شود.
روشن کردن RGB LED با استفاده از سه PWM
در این کد AVR با استفاده از تایمر دو و یک، سه موج PWM مختلف تولید می شود. هر کدام از این سه موج PWM به LED های قرمز، سبز و آبی اعمال می شوند. در صورت تغییر این سه موج نور خروجی سه LED که کنار هم قرار داده شده اند، تغییر می کند. به عنوان مثال اگر موج اعمالی دیود قرمز زمان وظیفه ی 25 درصد و موج اعمالی دیود سبز زمان وظیفه ی 10 درصد داشته باشد، نور خروجی زرد می شود. بهتر است LED ها از نوع OVAL باشند تا نور آنها بیشتر شود.
ساخت دماسنج به کمک مبدل آنالوگ به دیجیتال
در این مدار با استفاده از دو دیود 1N4007 می توان دما های منفی را هم اندازه گرفت. در این صورت باید دما را از دو ADC به صورت دیفرانسیلی دریافت نمود و اختلاف آنها را محاسبه کرد.
استفاده از پروتکل SPI برای ارتباط بین میکروکنترلر ها
برنامه ی Master شمارنده و ارسال آن برای Slave و نمایش روی LCD بدون کتابخانه ی spi.h
برنامه ی Master شمارنده و ارسال آن برای Slave و نمایش روی LCD با کتابخانه ی spi.h
برنامه ی اطلاعات سنسور ها
در این برنامه چند سنسور در نقاط مختلفی قرار دارند. میکروکنترلر Master با انتخاب هر یک از Slave ها، دما را از آنها دریافت می کند. این برنامه به دو شکل مختلف نوشته شده است:
از دیگر کاربرد های این ارتباط می توان به حافظه های uSD و برخی از LCD ها و سنسورها و تابلو های روان اشاره نمود
استفاده از پروتکل USART برای ارتباط بین میکروکنترلر ها
در این کد AVR به صورت نمونه میکروکنترلر فرستنده اطلاعات را ارسال می کند و میکروکنترلر گیرنده اطلاعات دریافتی را روی LCD نشان می دهد. می توان بجای اتصال یک سیم بین دو میکروکنترلر در شکل بالا از ماژول های HMT و HMR استفاده نمود. این برنامه به سه شکل مختلف نوشته شده است. (منظور از سخت افزاری بودن این است که از سخت افزار قرار داده شدهدر داخل میکروکنترلر استفاده شده است و منظور از نرم افزاری این است که ارتباط با برنامه نویسی ایجاد شده است).
فرستنده و گیرنده هر دو سخت افزاری
فرستنده نرم افزاری و گیرنده سخت افزاری
از جمله کاربرد های این ارتباط می توان به کاربرد در GSM، GPS و RFID اشاره نمود
استفاده از پروتکل I2C برای ارتباط بین میکروکنترلر ها
ارسال اطلاعات به صورت I2C برای میکروکنترلر Slave با توابع آماده
ارسال اطلاعات به صورت I2C برای میکروکنترلر Slave بدون توابع آماده
ساخت ساعت با آی سی معروف DS1307
در صورت اتصال یک باتری سه ولتی به آی سی 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 با فیبر مدار چاپی و نرم افزار لازم
کلید بکار رفته در شکل بالا جهت برنامه ریزی میکروکنترلر هایی با فرکانس کوچکتر مساوی 1MHz می باشد که باید فشار داده شود. در غیر این صورت این کلید آزاد می ماند. این پروگزمر AVR خود از یک میکروکنترلر AVR مدل ATMega8 می باشد که باید فیوز بیت های آن در حالت کریستال خارجی قرار گرفته (هیچ کدام از فیوز های CKSEL را برنامه ریزی نمی کنیم) و فیوز بیت CKOPT نیز در حالت برنامه ریزی تنظیم شده و به فیوزهای BOOT نیز دست نمی زنیم.
نمایش ساعت، دقیقه و ثانیه بر روی دات ماتریس 64*8
در این کد AVR در ابتدا برای پردازش راحت کد ها، از یک آرایه ی 64 عضوی در حافظه ی SRAM استفاده شده است به این صورت که ابتدا کد های مورد نیاز خوانده شده و در حافظه ی SRAM ذخیره می شود و از آنجا بر روی ماتریس ها نشان داده می شود.
آقا دمت گرم.i2c رو خیلی خوب و ساده کار کردی و خیلی به کارم اومد.
با سلام
بسیار جالب و عالی
باتشکر از شما
سلام
واسه اینه بتونیم با پروتکل spi در avr یه عدد 16 بیتی رو ارسال کنیم باید بصورت نرم افزاری برنامشو بنویسیم؟؟
اصن شدنی هست؟؟
کافی است داده را دو بار ارسال کنیم
و مشکلی پیش نمی آید
salam
vagean ali
good luck
سلام ممنون از مطالبتون
من برنامه کار با ای سی ds1307 رو دانلود کردم بعد از اجرا در کد ویین خطاهای زیر و داد میشه کمک کنید
من میخوام برنامه رو جوری تغیر بدم که بشه با صفحه کلید زمانو تغییر داد.
Error: DS1307.c(3): can't open #include file: ds1307.h
Error: DS1307.c(22): undefined symbol 'rtc_init'
که میگه فایل ds1307ررو نمی تونه بلز کنه و'rtc_init رو هم نمیشناسه
احتمالا نرم افزارتون یا ورژن قدیمی است یا مشکل دارد
باید از نزدیک عیب را ببینم
سلام
واقعا خسته نباشید
این مطالب خیلی به دردم خورد
خدا خیرتون بده
اگه تونستید از وبلاگ من بازدید کنید
ممنون واقعا عالی بودن
بسیار عالی،خیر ببینی.
از مبدلهای dc به dc با روش pwm به وفور در دستگاه ها استفاده میشه.
یک مثال برای pwm کم نور شدن و سپس خاموش شدن نور گوشی موبایل بعد از مدتی که ازش استفاده نمی کنیم/