درگاه سریال UART
در این بخش دانلود پروژه ارتباط میکروکنترلر AVR و کامپیوتر توسط درگاه سریال UART, توسط تیم الکترونیک وبرنامه نویسی الکترونیک ۹۸ برای شما علاقه مندان به پروژه های میکروکنترلر AVR آماده شده است. ارتباط بین کامپیوترهای شخصی به عنوان پردازشگرهای قدرتمند با دنیای خارج از جمله مسائل ضروری در کاربرد های کنترلی محسوب می شود. یکی از روش های برقراری ارتباط و انتقال اطلاعات بین کامپیوتر و تجهیزات الکترونیکی, استفاده از واسط سریال موجود روی کامپیوتر شخصی است.
واسط سریال, واسط سرعت بالایی به شمار نمی رود, ولی جوابگوی بیشتر نیازهای کنترلی و انتقال اطلاعات خواهد بود, زیرا در کاربرد های کنترلی, معمولا نیازی به ارسال و دریافت اطلاعات با سرعت بالا نیست. هدف ما در این پروژه برقراری ارتباط سریال بین میکروکنترلر و کامپیوتر از طریق واسط سریال و با استفاده از زبان برنامه نویسی Visual Basic 6 است. این پروژه دو قسمت را در بر می گیرد, قسمت الکترونیکی, شامل میکروکنترلر و تجهیزات مربوط به آن و قسمت نرم افزار, شامل یک نرم افزار ساده طراحی شده توسط VB6 که مسئول برقراری ارتباط با میکروکنترلر AVR است. اطلاعات و دستورهای کنترلی از کامپیوتر به میکروکنترلر و برعکس منتقل می شوند و به این ترتیب یک ارتباط تمام دو طرفه غیر همزمان خواهیم داشت. نقشه شماتیک کامل مدار پروژه در تصویر درج شده در ادامه مطلب قابل مشاهده است.
تبدیل سطوح منطقی با تراشه MAX232
سطوح منطقی در استاندارد RS232, با ولتاژ مثبت و منفی 12 ولت مشخص می گردند, حال آنکه این سطوح در استاندارد TTL, با ولتاژ 5 ولت و صفر مشخص شده اند. برای اینکه بتوانید توسط درگاه سریال UART کامپیوتر با میکروکنترلرهای AVR که از استاندارد TTL استفاده می کنند, ارتباط برقرار کنید, در نظر گرفتن واسطی که دو استاندارد ذکر شده را به یکدیگر تبدیل کند, ضروری است.
تراشه های فراوانی برای رسیدن به این هدف موجودند که از جمله معروف ترین آن ها, تراشه MAX232 ساخت شرکت ماکسیم است. این تراشه 16 پایه, دارای دو کانال ارتباطی مجزا, یعنی دو کانال رفت و برگشت کامل می باشد. تصویر زیر ترتیب پایه ها و چگونگی بایاس این تراشه را نشان می دهد. همانطور که مشاهده می شود, برای استفاده از تراشه MAX232 چهار خازن لازم است, خازن های C1 تا C4 که با پلاریته نشان داده شده در شکل, به تراشه متصل می شوند.
نقشه شماتیک پروژه ارتباط میکروکنترلر AVR و کامپیوتر توسط درگاه سریال UART
دو رله RL1 و RL2 به عنوان راه انداز دو وسیله الکتریکی دلخواه با نام های Device1 و Device2 در نظر گرفته شده اند. 4 میکروسوئیچ متصل شده به پورت C میکروکنترلر ATmega8 برای روشن و خاموش کردن این وسایل به کار می روند. با فشار دادن سوئیچ Device1 ,D1 ON از طریق رله RL1 روشن می شود و با زدن D1 OFF خاموش می گردد. همین عمل در مورد Device2 و رله RL2 توسط دو سوئیچ D2 ON و D2 OFF صورت می گیرد. چهار عدد دیود متصل به سوئیچ ها, به این دلیل به کار رفته اند که با فشار دادن هر سوئیچ, یک وقفه به میکروکنترلر اعمال شود. در زیروال وقفه, وضعیت پورت C خوانده می شود تا مشخص گردد کدام سوئیچ فشار داده شده است.
عملکرد نرم افزار طراحی شده در VB6
همزمان با تغییر وضعیت رله ها بر روی مدار, وضعیت فعلی هر یک از رله ها, توسط ارتباط سریال به کامپیوتر منتقل می گردد تا در فرم برنامه VB6 نمایش داده شود. در برنامه طراحی شده توسط نرم افزار VB6 در قسمت Device Checker, وضعیت فعلی Device1 و Device2 مشخص است و می توان وضعیت آن ها را در دو کادر کناری موجود تغییر داد. چراغ مقابل این کادرها, نیز در صورت روشن بودن هر یک از وسایل به رنگ قرمز در خواهد آمد. با استفاده از دکمه های رادیویی (Radio Buttons) موجود در قسمت وسط فرم به نام های COM1 و COM2, می توان شماره درگاه مورد نظر را انتخاب کرد (در حالت پیش فرض Com1 انتخاب شده است).
در صورتی که COM1 با COM2 توسط وسایل دیگر مورد استفاده قرار گرفته باشد, پیغام خطایی صادر می شود تا کاربر را از اینگه درگاه مورد نظر, در حال استفاده است مطلع سازد. همچنین توسط سه نوار پیمایشی افقی (HScroll Bar) موجود که با نام های R, G و B مشخص شده اند, می توان شدت نور هر یک از کانال های RGB LED متصل به پایه های PB0 تا PB2 را تنظیم کرد. در نتیجه با تنظیم این سه نوار پیمایش افقی, رنگ RGB LED موجود به دلخواه کاربر تغییر می کند.
برنامه میکروکنترلر در محیط نرم افزار Bascom-AVR
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
$regfile = "M8def.dat" $crystal = 8000000 $baud = 9600 Config Timer0 = Timer , Prescale = 1 Config Portb = Output Config Portc = Input Config Pind.6 = Output Config Pind.7 = Output Config Int0 = Rising Enable Interrupts Enable Int0 Enable Ovf0 Enable Urxc On Urxc Intlab On Ovf0 T0_rut On Int0 Ex0_rut Dim R As Byte , G As Byte , B As Byte Dim Device1 As Bit , Device2 As Bit Dim Pwm As Byte Dim C As Byte Dim Receive As Byte Dim S As String * 20 Start Timer0 Device1 = 0 Device2 = 0 R = 20 G = 0 B = 0 S = "" '*************** Do If Device1 = 1 Then Set Portd.6 If Device1 = 0 Then Reset Portd.6 If Device2 = 1 Then Set Portd.7 If Device2 = 0 Then Reset Portd.7 Loop End '*************** T0_rut: If Pwm = 255 Then Pwm = 0 End If If Pwm = B Then Set Portb.0 If Pwm < B Then Reset Portb.0 If Pwm = G Then Set Portb.1 If Pwm < G Then Reset Portb.1 If Pwm = R Then Set Portb.2 If Pwm < R Then Reset Portb.2 Incr Pwm Return '*************** Ex0_rut: C = Pinc C = C And &H0F Select Case C Case 1: Device1 = 1 Print 1 Case 2: Device1 = 0 Print 2 Case 4: Device2 = 1 Print 3 Case 8: Device2 = 0 Print 4 End Select Return '*************** Intlab: Receive = Inkey() Select Case Receive Case 1: Device1 = 1 Case 2: Device1 = 0 Case 3: Device2 = 1 Case 4: Device2 = 0 Case 10: R = Val(s) S = "" Case 11: G = Val(s) S = "" Case 12: B = Val(s) S = "" Case Else S = S + String(1 , Receive) End Select Return |
برنامه میکروکنترلر در محیط نرم افزار Code Vision AVR
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#include <mega8.h> #include <stdio.h> #include <delay.h> //----------------------------------------- unsigned char R=20,G=0,B=0; bit Device1=0,Device2=0; unsigned char Pwm,C,i,sum,P; char s[3]; //----------------------------------------- unsigned char s2v(void); // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { C=PINC&0x0F; switch (C) { case 1: Device1=1; putchar('1'); break; case 2: Device1=0; putchar('2'); break; case 4: Device2=1; putchar('3'); break; case 8: Device2=0; putchar('4'); break; }; } // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char Receive; Receive=UDR; switch (Receive) { case 1: Device1=1; break; case 2: Device1=0; break; case 3: Device2=1; break; case 4: Device2=0; break; case 10: R=s2v(); break; case 11: G=s2v(); break; case 12: B=s2v(); break; default: if(i<3) { s[i]=Receive; i++; } else i=0; }; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { if(Pwm==255) Pwm=0; if(Pwm==B) PORTB.0=1; else PORTB.0=0; if(Pwm==G) PORTB.1=1; else PORTB.1=0; if(Pwm==R) PORTB.2=1; else PORTB.2=0; Pwm++; } //----------------------------------------- void main(void) { PORTB=0x00; DDRB=0xFF; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xC0; // Timer/Counter 0 initialization TCCR0=0x01; TCNT0=0x00; // External Interrupt(s) initialization GICR|=0x40; MCUCR=0x03; GIFR=0x40; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // USART initialization UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // Global enable interrupts #asm("sei") while (1) { if(Device1) PORTD.6=1; else PORTD.6=0; if(Device2) PORTD.7=1; else PORTD.7=0; delay_ms(10); }; } //-------------------------------------- unsigned char s2v(void) { sum=0; P=0; while(i>0) { i--; sum=sum+(10^P)*(s[i]-0x30); s[i]=0x30; P++; } i=0; return (sum); } |
شرح برنامه میکروکنترلر به زبان بیسیک و زبان C
این دو برنامه، به صورتی ساده و روان طراحی شده اند و جنبه های مختلف و نکات مربوط به چگونگی برقراری ارتباط سریال بین میکروکنترلر و کامپیوتر از طریق واسط سریال را مطرح می کنند و همانطور که اشاره شد، هدف این پروژه، جز آموزش آنها نیست. در اینجا با توجه به یکسان بودن عملکرد هر دو برنامه، تنها برنامه میکروکنترلر در محیط نرم افزار Bascom-AVR را شرح می دهیم.
برای برقراری ارتباط، از پایه های RXD و TXD میکروکنترلر استفاده شده است. این دو پایه امکان ارتباط دو طرفه کامل را به صورت سخت افزاری فراهم می کنند. در ابتدای برنامه با استفاده از دستور Baud = 9600 میزان باود برای ارسال و دریافت مشخص شده است. بدیهی است در برنامه نوشته شده توسط VB6 که روی کامپیوتر اجرا می گردد، نیز همین مقدار برای ارسال و دریافت به کار رفته است. تایمر صفر برای تولید موج PWM به منظور تغییر شدت نور، در هریک از کانال های R و G و B از RGB LED استفاده شده است.
معرفی وقفه ها و تایمرها تعریف شده در برنامه
بعد از تعریف متغیرها و مقدار دهی اولیه، برنامه وارد یک حلقه Do…Loop می گردد و از این پس، کل عملیات به صورت وقفه ای انجام می شود. در این برنامه، سه منبع وقفه به کار گرفته شده است که عبارتند از:
1- وقفه تایمر صفر که برای زمانبندی جهت تولید پالس PWM استفاده شده است.
2- وقفه خارجی صفر که برای آگاهی از وضعیت سوئیچ ها به کار گرفته شده است.
3- وقفه واسط سریال که برای آگاهی از زمان دریافت اطلاعات در واسط سریال استفاده شده است.
شرح عملکرد وقفه ها و تایمرها در برنامه
در زیر روال وقفه تایمر، با توجه به مقادیر موجود در متغیرهای R و G و B سیگنال PWM مناسب روی پایه های PB0 تا PB2 تولید می شود. مقادیر R و G و B با توجه به اطلاعات دریافتی از کامپیوتر به روز می شوند.
زیر روال وقفه خارجی با فشار دادن هر یک از چهار سوئیچ نشان داده شده در نقشه شماتیک فراخوانی می گردد. در ابتدا وضعیت پورت C بررسی می شود تا مشخص گردد که کدام یک از سوئیچ ها فشرده شده است. سپس عمل مناسب (خاموش و یا روشن کردن وسیله مورد نظر) انجام می شود و بسته به عمل انجام شده، یکی از اعداد 1 تا 4 توسط دستور Print و از طریق واسط سریال ارسال می شود تا وضعیت هر وسیله در فرم برنامه ای که روی کامپیوتر در حال اجراست، نمایش داده شود.
همچنین با دریافت اطلاعات در واسط سریال میکروکنترلر، با توجه به فعال بودن وقفه دریافت واسط سریال، کنترل برنامه به زیر روال مربوط (Intlab) هدایت می شود. ابتدا توسط دستور Receive=inkey() بایت دریافتی موجود در بافر ورودی، در متغیر Receive قرار می گیرد. سپس توسط ساختار Selectr Case با توجه به مقدار متغیر Receive عمل مناسب انجام می شود. اعداد 1 تا 4 برای روشن و خاموش کردن رله یک و رله دو به کار می روند. اعداد 10 و 11 و 12 به ترتیب برای تعیین شدت نور در LED های قرمز، سبز و آبی به کار رفته اند.
با دریافت هر یک از اعداد، مقدار موجود در متغیر S که از قبل توسط برنامه VB6 ارسال سده بود، در متغیرهای R و G یا B قرار می گیرد تا در فراخوانی بعدی زیر روال وقفه تایمر صفر به صورت موج PWM به RGB LED اعمال شود.
برنامه نرم افزار تحت ویندوز در محیط Visual Basic 6
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
Dim col As Long Dim comerr As Byte Dim s As String * 2 Private Sub Check1_Click() If Check1.Value = 1 Then Shape1.FillColor = vbRed MSComm1.Output = Chr$(1) Else Shape1.FillColor = vbBlack MSComm1.Output = Chr$(2) End If End Sub Private Sub Check2_Click() If Check2.Value = 1 Then Shape2.FillColor = vbRed MSComm1.Output = Chr$(3) Else Shape2.FillColor = vbBlack MSComm1.Output = Chr$(4) End If End Sub Private Sub Command1_Click() End End Sub Private Sub Form_Load() Option1.Value = True HScroll1.Value = 20 HScroll2.Value = 0 HScroll3.Value = 0 Text4 = "" Timer1.Interval = 50 End Sub Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False End Sub Private Sub HScroll1_Change() Text1 = HScroll1.Value MSComm1.Output = Text1.Text MSComm1.Output = Chr$(10) Call color End Sub Private Sub HScroll1_Scroll() Text1 = HScroll1.Value MSComm1.Output = Text1.Text MSComm1.Output = Chr$(10) Call color End Sub Private Sub HScroll2_Change() Text2 = HScroll2.Value MSComm1.Output = Text2.Text MSComm1.Output = Chr$(11) Call color End Sub Private Sub HScroll2_Scroll() Text2 = HScroll2.Value MSComm1.Output = Text2.Text MSComm1.Output = Chr$(11) Call color End Sub Private Sub HScroll3_Change() Text3 = HScroll3.Value MSComm1.Output = Text3.Text MSComm1.Output = Chr$(12) Call color End Sub Private Sub HScroll3_Scroll() Text3 = HScroll3.Value MSComm1.Output = Text3.Text MSComm1.Output = Chr$(12) Call color End Sub Private Sub color() col = Val(Text3) * 256 * 256 col = col + Val(Text2) * 256 col = col + Val(Text1) Text4.BackColor = col Text5 = Hex(col) End Sub Private Sub Option1_Click() On Error GoTo errh If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.CommPort = 1 MSComm1.PortOpen = True errh: If Err.Number = 8005 Then msg = MsgBox("COM1 already in use!", vbOKOnly, "Warning!") If comerr = 2 Then End comerr = 1 Option2.Value = True End If MSComm1.Settings = "9600,n,8,1" End Sub Private Sub Option2_Click() On Error GoTo errh If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.CommPort = 2 MSComm1.PortOpen = True errh: If Err.Number = 8005 Then msg = MsgBox("COM2 already in use!", vbOKOnly, "Warning!") If comerr = 1 Then End comerr = 2 Option1.Value = True End If MSComm1.Settings = "9600,n,8,1" End Sub Private Sub Timer1_Timer() s = MSComm1.Input d = Val(s) If d <> 0 Then Select Case d Case 1: Check1.Value = 1 Case 2: Check1.Value = 0 Case 3: Check2.Value = 1 Case 4: Check2.Value = 0 End Select End If End Sub |
توجه : برنامه طراحی شده توسط نرم افزار VB6 را می توان در ویندوزهای اکس پی XP نسخه 32 بیتی اجرا نمود در صورتی که ویندوز سیتسم شما ویندوز ویستا, ویندوز هفت و یا ویندوز هشت بود می توانید برای اجرای برنامه کدک ها ویندوز اکس پی XP را برای ویندوز مربوطه خود از طریق اینترنت دانلود نمائید و سپس برنامه را اجرا کنید.
سلام. من یه پروژه دارم که توش از UART استفاده میکنم. یه مشکلی دارم. اطلاعات رو از UART1 دریافت میکنم و روش محاسباتی انجام میدم و در نهایت اونو با UART0 ارسال میکنم. دفعه اول اطلاعات درست ارسال میشه، اما دفعه دوم خراب میشه. یه وقتایی هم دومیش خوبه و سوم به بعدش خراب میشه.مشکلم رو اینجا مطرح کردم با توضیحات ولی پاسخ ها فایده ای نداشته. ممنون میشم راهنماییم کنین
سلام دوست عزیز
آدرسی که داده بودید اشتباه بود، لطفا برنامه خود را به آدرس ایمیل ارسال کنید.