به نام خدا : آموزش جامع میکروکنترلر avr جلسه6 ؛ موضوع این جلسه : ۳ تا پروژه در مورد ” ارتباط سریال USART ” از سری مطالب آموزش avr
آموزش جامع میکروکنترلر avr جلسه6
آموزش جامع میکروکنترلر AVR جلسه۵
توجه ۲ : فایل های مربوط به هر سه تا پروژه رو به صورت یک جا در آخر برا دانلود میزارم.
توجه ۳ : این پروژه ها در ظاهر سادس ولی ممکنه تازه کارا به مشکل بخورن همون طور که بعضی از دوستان... ، به هر حال نظر من اینه که موقع آموزش باید پروژه های آسون بزارم و قشنگ توضیح بدم تا... قرار نیست که موقع آموزش پروژه ای در سطح پارس جنوبی بزارم که....)
توجه ۴ : نحوه کار با LCD رو هم تو پروژه های مربوط به LCD باید خوب یاد گرفته باشید. فقط اینو بگم که همیشه تا اونجایی ک میشه سعی کنید که LCD رو به PORTC وصل نکنید.و از پورت های دیگه استفاده کنید.
توجه ۵ : مطلب زیر رو حتما حتما بخونید>>>ادامه ی همین بحث هستش ولی تو قسمت مربوط به آموزش پروتئوس قرارش دادم.
آموزش جامع کار با پروتئوس جلسه۱
———–پروژه avr یک———–
همون طور که رد عکس بالا میبینید یه فرستنده داریم و یه گیرنده که با روشن خاموش کردن کلید ها ، led ها روشن و خاموش میشوند.
و همون طور که مشاهده میکنید توسط پایه های RXD و TXD که در PORTD هست این دو میکرو کنترلر به هم وصل شده اند.
این از کد های مربوط به میکرو کنترلر فرستنده
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <mega32.h> #include <stdio.h> void main(void) { DDRB=0x00; ///////////////////////////////////////////////////////////////////////// UCSRA=0x00; //-------------------------------------------------------------- UCSRB=0x08;//فعال کردن ارسال کننده با بیت ۴ ام //-------------------------------------------------------------- //هشت بیت کردن فریم داده ارسال--این کار مشترکا توسط دو ریجستر // انجام میشود که این یکی از آن دو ریجستر است--و دو بیتش در این ریجستر هستش UCSRC=0x86;//انتخاب مد آنسنکرون توسط بیت ششم این ریجستر //انتخاب دسترسی به ریجسترUCSRC //توسط بیت ۷ ام //-------------------------------------------------------------- // تعیین نرخ انتقال داده با مقدار ۹۶۰۰ //دو ریجستر زیر با هم این کار رو انجام میدن UBRRH=0x00; UBRRL=0x33; ///////////////////////////////////////////////////////////////////////// while (1) { putchar(PINB);// فرستادن اطلاعات }; } |
و اینم از کدهای مربوط به میکروکنترلر گیرنده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <mega32.h> #include <stdio.h> void main(void) { DDRA=0xFF; ///////////////////////////////////////////////////////////////////////// UCSRA=0x00; //-------------------------------------------------------------- UCSRB=0x10;//فعال کردن دریافت کننده با بیت ۵ ام //-------------------------------------------------------------- //هشت بیت کردن فریم داده ارسال--این کار مشترکا توسط دو ریجستر // انجام میشود که این یکی از آن دو ریجستر است--و دو بیتش در این ریجستر هستش UCSRC=0x86;//انتخاب مد آنسنکرون توسط بیت ششم این ریجستر //انتخاب دسترسی به ریجسترUCSRC //توسط بیت ۷ ام //-------------------------------------------------------------- // تعیین نرخ انتقال داده با مقدار ۹۶۰۰ //دو ریجستر زیر با هم این کار رو انجام میدن UBRRH=0x00; UBRRL=0x33; ///////////////////////////////////////////////////////////////////////// while (1) { PORTA=getchar(); // دریافت اطلاعات و دادنش به پورت آ }; } |
اگه توجه کنید کد های مربوط به “ارتباط سریال USART” در هر دو برنامه (هم فرستنده و هم گیرنده) تقریبا یکی هست غیر از ریجستر UCSRB که توسط بیت ۴ و ۵ همین ریجستر فرستنده گیرنده بودن میکروکنترلر رو تعیین میکنیم.(حالا دو هزاریت اوفتاد که چرا این دو کد با هم متفاوت اند.)
——-پروژه avr دو——-
اینم از پروژه ساده دوم>>> کار این پروژه اینه که با صفر یا یک کردن کلید مقدار اون در LCD نمایش داده میشود.
اینم از کد های برنامه فرستنده (تقریبا مثل پروژه قبلی هست فقط یه LCD اضافه شده)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <mega32.h> #include <stdio.h> #include <delay.h> void main(void) { DDRB=0x00; UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; while (1) { putchar(PINB.0); } } |
اینم از کد های گیرنده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <mega32.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> #include <lcd.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm unsigned char out[8]; void main(void) { UCSRA=0x00; UCSRB=0x10; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; lcd_init(16); while (1) { lcd_gotoxy(0,0); itoa(getchar(),out); lcd_puts(out); } } |
————پروژه avr سه————
تو این پروژه هر دو تا میکروکنترلر هم فرستنده هستن و هم گیرنده.
اینم از کد های برنامه که تو ه دو تا میکروکنترلر یکسان هست و هر دو میکرو کنترل از همین کد استفاده میکنن
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <mega32.h> #include <stdio.h> void main(void) { DDRA=0xFF; DDRB=0x00; UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; while (1) { putchar(PINB); PORTA=getchar(); }; } |
اگه توجه کرده باشید کد های مربوط به “ارتباط سریال USART” تو این پروژه مثل دو پروژه قبل هستش فقط با این تفاوت که تو دو پروژه قبل ریجستر UCSRB ، مثلا فقط به صورت فرستنده یا گیرنده تعریف شده بود اما تو این پروژه هم به صورت فرستنده و هم به صورت گیرنده تعریف شده و اگه بازم دقت! کنید میبینید که بیت ۴ و ۵ این ریجستر یک هست که دلیلش رو گفتم.
این پروژه دو که در بالا گزاشتم رو من به صورت عملی بستمش ولی چون میکروکنترلر مگا ۱۶ فقط یکی داشتم مجبور شدم از مگا ۸ استفاده کنم؛ فیلمی هم که در زیر میبینید مربوط به همین پروژه هستش که فیلمش رو گرفتم :
دانلود ۳ پروژه این جلسه | حجم : ۳۶۰ کیلوبایت!
سوال بود در خدمتیم.
بروزرسانی در یکشنبه – 21 خرداد 1396
یه کتابخونه نوشتم برا مگا 16/32 ( فک کنم ) که برا ساده شدن کارتون میتونید ازش استفاده کنید؛ که شامل توابع زیر هستش :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | void uartInit( unsigned long int BAUD ); // راه اندازی اولیه و اعمال تنظیات پیشفرض // غیر فعال کردن پایه های ارسال و دریافت void uartTxDisable(); void uartRxDisable(); // فعال کردن پایه های ارسال و دریافت void uartTxEnable(); void uartRxEnable(); void uartSetStopBit( unsigned char StopBit ); // تنظیم تعداد بیت استاپ void uartSetParityMode( unsigned char ParityMode ); // تنظیم مد پاریتی void uartSetDataBit( unsigned char DataBit ); // تنظیم تعداد بیت داده void uartSetBaudRate( unsigned long int BAUD ); // تنظیم نرخ انتقال داده // ارسال اطلاعات void uartWrite( unsigned char data ); // ارسال کاراکتر void uartPrint( unsigned char *data ); // ارسال رشته void uartPrintln( unsigned char *data ); // ارسال رشته + رفتن به خط بعد با کاراکتر شماره 10 void uartPrintNumber(unsigned long int Number); // ارسال عدد صحیح void uartPrintNumberln(unsigned long int Number); // ارسال عدد صحبح + رفتن به خط بعد با کاراکتر شماره 10 unsigned char uartReceive( void ); // دریافت اطلاعات void USART_Flush( void ); // حذف کردن بقیه اطلاعات موجود unsigned char numberDigits(unsigned long int Number); // تعداد ارقام یه عدد صحیح رو به ما میده |
که شما فقط کافیه :
- اول پروژه کتابخونه رو فراخونی کنید.
- اولای تابع main تابع uartInit رو فراخونی کنید و BaudRate مد نظرتون رو به این تابع بدید.
- از توابع ارسال و دریافت اطلاعات استفاده کنید؛ وسلام.
با استفاده از این کتابخونه دیگه نیاز نیست هر دقیقه کد نویسی مربوط به ارتباط سریال رو انجام بدید. فایل این کتابخونه رو از زیر میتویند دانلود کنید :
مهمان
سلام اقا مهدی. میشه یه شماره تماس از خودتون بدید.
من یه سری ایراد کلی دارم. میخاستم بپرسم ازتون.
مهمان
سلام خسته نباشید اگه میشه آموزشی برای ارتباط سریال در محیط اتمل استودیو تدارک ببینید و با کتابخانه stdio و _وقفه واقعا به مشکل بر خوردیم
مهمان
سلام
خسته نباشد
وقتی که ما از رجیستر یوزارت استفاده کنیم بقیه پورت های میکرو از کار میفتن؟
نویسنده این مطلب
سلام/فقط پایه یوزارت نقششون از I/O به UART تغییر پیدا میکنه، با بقیه کاری نداریم که////
مهمان
اهان ینی از 8تا پایه فقط همون دوتا رو کار داریم. اخه یجا خوندم نوشته بود usart رو فعال کنیم کل پایه های پورت رو دیگ نمیشه استفاده ی دیگه ایی کرد
مهمان
سلام آقا مهدی وقت بخیر.برای انتقال اطلاعات با ماژول 433 mhz rf ask به صورت بیسیم وقتی که کاراکتر به کاراکتر دریافت میکنم اطلاعات دریافت میشه ولی بعضی حروف اشتباهی میره وقتی هم که یه آرایه میسازم و کاراکتر هاشو چک میکنم که اگه درست بود نمایش بده اکثر اوقات نمایش نمیده (از فیلتر رد نمیشه).باود ریت رو روی 600 گذاشتم کریستال 11.0592درصد خطا صفره.بین زمین و +5 ولت هر مدار یه خازن 10 میکرو گذاشتم.و یک پیام رو سه بار میفرستم و بین هر ارسال 1 ثانیه delay میدم شاید یکیش درست بره ولی هنوزم اکثر اوقات خطا داره.
سوال:
1- بهترین باودریت برای ماژول 433 مگاهرتز چه مقداریه؟
*********2-نکته سخت افزاری یا نرم افزاری هست که باید رعایت کنم؟*****