مقالات آموزشی

جلسه پانزدهم آموزش AVR
به نام خدا
آموزش میکروکنترلر AVR به زبان WinAVR) C)
(آموزش WinAVR جلسه چهارم)



مقدمه:

در جلسه قبل به راه اندازی LCD گرافیکی و توابع مربوطه پرداختیم. در این جلسه تصمیم داریم به معرفی پورت سریال میکرو و نحوه ارتباط میکرو با میکروی دیگر و نیز ارتباط با کامپیوتر توسط استاندارد RS232 بپردازیم.

◄ تصویر ابتدای این مقاله مربوط به کامپیوتر جیبی ZQ290II می باشد که اولین کامپیوتر نویسنده این مقاله بود (سال ١٣٨٣). این کامپیوتر یا PDA قادر بود اطلاعات (شماره تلفن ها، یادداشت ها و ایمیل ها) را از طریق پورت سریال با نرم افزار MS Outlook هماهنگ کند و به اصطلاح به تبادل اطلاعات توسط پورت سریال کامپیوتر و تنها با سه رشته سیم بپردازد. هرچند هم اکنون از این کامپیوتر فقط عکس آن باقی مانده است ولی شاید علاقه و اشتیاق فراوان به یادگیری چگونگی انتقال اطلاعات بین این دستگاه و کامپیوتر و در نهایت خراب کردن آن جرقه ای بوده است برای رفتن به دنبال علم دیجیتال، میکروکنترلر 8051 و AVR و در نهایت نوشتن این سری مقالات به شیوا ترین روش ممکن برای علاقه مندان به این علم.


پروتکل سریال برای ارتباط

یکی از مسائلی که در پروژه های بزرگ به وجود می آید ارتباط دو میکرو با بکدیگر و یا ارتباط میکرو با وسایل جانبی و ماژولهایی است که با پروتکل سریال کار می کنند. همچنین ارتباط میکرو با کامپیوتر و ارسال و دریافت اطلاعات نیز یکی از موارد لازم در پروژه های ارتباط با PC و کنترل از طریق PC و یا ذخیره اطلاعات در کامپیوتر است. برای ارتباط بین میکرو و کامپیوتر از پروتکل سریال RS-232 یک آی سی خاص به نام MAX232 استفاده می شود که سطوح ولتاژ و منطق TTL میکرو را با PC سازگار می نماید. برای ارتباط دو میکرو در فواصل کوتاه می توان از این چیپ صرفنظر کرد و برای فواصل بیشتر از چند متر بایستی در کنار هر میکرو یک MAX232 قرار داد تا با تبدیل سطح ولتاژ نویز کمتری روی کابل ارتباطی اثر بگذارد. در این مقاله در پروژه اول برنامه ای برای ارتباط دو طرفه میکرو و کامپیوتر می نویسیم. در این برنامه در ابتدا متنی توسط میکرو برای ترمینال کامپیوتر ارسال می شود و سپس برنامه وارد حلقه ای می شود و منتظر دریافت کاراکتر از PC می ماند؛ در صورتی که کاربر کاراکتر q را وارد کند LED موجود در مدار میکرو روشن می شود و در صورتی که کاراکتر w را وارد کند دیود نورانی LED خاموش می شود. همچنین کاراکترهای تایپ شده توسط کاربر مجدداً توسط میکرو به ترمینال ارسال می شود تا کاربر کاراکتر تایپ شده را ببینید. (در حالت عادی اگر در ترمینال چیزی بنویسیم دیده نمی شود و فقط ارسال می گردد، محیط ترمینال مانند یک ادیتور مثل Notepad نیست).

اولین پروگرمر قابل حمل ساخت مولف!






شماتیک پروژه ارتباط میکروکنترلر با کامپیوتر

قبل از هر چیز شماتیک زیر را بر روی برد بورد ببندید، در این شماتیک از آی سی MAX232 برای ارتباط با پورت سریال کامپیوتر بهره گرفته شده است. ترمینال های سمت راست شماتیک به ترتیب از بالا به پایین به پایه های 2 و 3 و 5 کانکتور مادگی DB9 متصل می شود که پایه اول که به پین شماره 2 کانکتور پورت سریال کامپیوتر متصل می شود ارسال (TX)از طرف میکرو و دریافت از طرف PC می باشد، پایه بعدی که به پایه شماره 3 پورت سریال PC وصل می شود ارسال از طرف PC و دریافت (RX) از طرف میکرو است. پایه 5 نیز زمین مشترک می باشد که سطوح ولتاژ نسبت به آن سنجیده می شود. منطق و سطح ولتاژ در سمت PC متفاوت با منطق و ولتاژ TTL میکرو بوده و معمولاً در محدوده ای بالاتر از 5 ولت قرار دارد.





کانکتور DB9 مادگی شبیه شکل زیر می باشد:





چیدمان قطعات بر روی برد بورد به صورت زیر است:





البته ما قسمت MAX232 را بر روی برد مونتاژ نکرده ایم و از ماژول آماده ای که قبلاً برای این کار ساخته بودیم استفاده کردیم، تصویر این ماژول در زیر نشان داده شده است:





پس از مونتاژ قطعات بر روی برد نوبت به کد نویسی پروژه می رسد. در مرحله بعد برنامه ای توسط WinAVR می نویسیم و با استفاده از بخش پروگرمر Bascom بر روی میکرو پروگرم می کنیم. در جلسات قبل نحوه پروگرم کردن میکرو توسط بسکام با یک فایل Hex آموزش داده شده است که در این جلسه از تکرار آن خودداری میکنیم.


کدنویسی پروژه ارتباط میکروکنترلر با کامپیوتر

برای برنامه نویسی این پروژه به کتابخانه ای برای پورت سریال به نام Uart نیاز داریم. متاسفانه کتابخانه Uart موجود در avrlib به هیچ وجه کارنکرد و مجبور شدیم از یک کتابخانه free دیگر که از اینترنت دانلود کردیم استفاده کنیم. این کتابخانه در پوشه ای جدا در پوشه این مقاله به همراه سورس پروژه آورده شده و نام آن نیز دقیقاً uart.h و uart.c می باشد، پس آن را با کتابخانه استاندارد avrlib اشتباه نگیرید.





کد این پروژه در زیر آورده شده است:


#include <avr/io.h>		
#include <avr/interrupt.h>		
#include "rprintf.h"
#include "uart.h"
#include <util/delay.h>	


#include <avr/pgmspace.h>	
#include <stdlib.h>	

/* define CPU frequency in Mhz here if not defined in Makefile */

#ifndef F_CPU
#define F_CPU 4000000UL
#endif

/* 9600 baud */
#define UART_BAUD_RATE      9600  

int main(void)

{

	DDRB = 0b00000001;
	
	unsigned int c;
    char buffer[7];
    int  num=134;
	PORTB = 0b00000000;
	_delay_ms(500);
       PORTB = 0b00000001;
	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
	sei();
	uart_puts("Send from Micro...\n");
	//uart_puts_P("String stored in FLASH\n");
	//itoa( num, buffer, 10);   // convert interger into string (decimal format)         
       //uart_puts(buffer);        // and transmit string to UART
	//uart_putc('\r');
	
	_delay_ms(500);
	
	PORTB = 0b00000000;
	_delay_ms(500);
	
	while(1){
	c = uart_getc();
        if ( c & UART_NO_DATA )
        {
            /* 
             * no data available from UART 
             */
        }
        else
        {
            /*
             * new data available from UART
             * check for Frame or Overrun error
             */
            if ( c & UART_FRAME_ERROR )
            {
                /* Framing Error detected, i.e no stop bit detected */
               //uart_puts_P("UART Frame Error: ");
            }
            if ( c & UART_OVERRUN_ERROR )
            {
                /* 
                 * Overrun, a character already present in the UART UDR register was 
                 * not read by the interrupt handler before the next character arrived,
                 * one or more received characters have been dropped
                 */
                //uart_puts_P("UART Overrun Error: ");
            }
            if ( c & UART_BUFFER_OVERFLOW )
            {
                /* 
                 * We are not reading the receive buffer fast enough,
                 * one or more received character have been dropped 
                 */
               // uart_puts_P("Buffer overflow error: ");
            }
            /* 
             * send received character back
             */
            uart_putc( (unsigned char)c );
			if (c == 'q')
			{
				PORTB = 0b00000001;
			}
			if (c == 'w')
			{
				PORTB = 0b00000000;
			}
			
			
			
        }
	
	}

	return 0;
}


برای راحتی کار، تمام سورس پروژه در پوشه همراه این مقاله آورده شده است، توجه داشته باشید که نوع میکرو در این پروژه atmega32 می باشد و فرکانس کاری آن 4000000 هرتز است که در صورت تغییر بایستی در Makefile تنظیم شود.

پس از کامپایل و پروگرم کردن میکرو، وارد Start شده و در Run تایپ کنید: Hypertrm





در پنجره بعدی یک نام دلخواه تایپ کنید:





پس از زدن OK در پنجره جدید Com1 را انتخاب کرده و OK را بزنید:





در پنجره جدید روی Restore Defaults کلید کنید و OK را بزنید:





پنجره ای مطابق زیر باز می شود:





هم اینک پورت Com1 کامپیوتر توسط هایپر ترمینال ویندوز با سرعت 9600 و به صورتی 8 بیتی بدون بیت توازن و یک بیت توقف باز شده است و آمده ارسال و دریافت کاراکتر می باشد. در این حالت پورت مادگی پروژه را به پشت case متصل کرده و تغذیه مدار را وصل کنید، مشاهده می کنید که عبارتی از طرف میکرو برای PC ارسال می شود. در این حالت اگر کلید q را بزنید LED روی برد بورد روشن می شود و با زدن کلید w دیود نورانی خاموش می گردد. به این ترتیب ارتباط بین میکرو و کامپیوتر به وسیله پورت سریال برقرار شد.

در پروژه بعدی قصد داریم ارتباط بین دو میکرو را بررسی کنیم. در ارتباط بین دو میکرو معمولاً در فواصل کوتاه از آی سی MAX232 استفاده نمی شود و پایه های ارسال و دریافت دو آی سی میکرو به صورت معکوس به یکدیگر متصل می شوند. در پروژه بعدی یک میکروکنترلر ATmega16 کاراکتر های q و w را به ترتیب برای میکروی اول که همین پروژه جاری می باشد ارسال می کند و مشاهده می کنیم که LED به ترتیب روشن و خاموش می شود.






کدنویسی پروژه ارتباط دو میکرو با یکدیگر

برای ارتباط بین دو میکرو مداری مطابق شکل زیر بر روی دو برد بورد جدا ببندید، مدار پروژه جاری را بدون تغییر نگه دارید و قسمت ATmega16 (سمت راست شماتیک زیر) را روی یک برد بورد دیگر مونتاژ نمایید:





چیدمان قطعات بر روی برد بورد به صورت زیر است:





برد بورد کوچک سمت چپ که دارای LED زرد می باشد همان میکروی سمت راست در شماتیک است.


کدنویسی پروژه ارتباط دو میکرو با یکدیگر

در این پروژه فقط کد میکروی ATmega16 آورده شده است. میکروی مگا٣٢ با همان برنامه قبلی مورد استفاده قرار می گیرد. کد میکروی ای تی مگا١۶ در زیر آورده شده است:


#include <avr/io.h>		
#include <avr/interrupt.h>
#include "rprintf.h"
#include "uart.h"
#include <util/delay.h>

#include <avr/pgmspace.h>
#include <stdlib.h>

/* define CPU frequency in Mhz here if not defined in Makefile */

#ifndef F_CPU
#define F_CPU 4000000UL
#endif


/* 9600 baud */
#define UART_BAUD_RATE      9600  

int main(void)

{
	unsigned int c;
	//DDRB|=_BV(1);
	DDRC = 0xFF;
	PORTC = 0b00000001;
	
	_delay_ms(500);
	PORTC = 0b00000000;
	_delay_ms(500);
	
	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
	sei();	
	
	PORTC = 0b00000001;
	
	uart_puts("Send from Micro...\n");
	
	while(1){
		_delay_ms(500);
		uart_putc('q');
		PORTC = 0b00000001;
		_delay_ms(500);
		uart_putc('w');
		PORTC = 0b00000000;
   }
	
	return 0;
}


سورس این پروژه نیز در پوشه این مقاله به نام ATmega16-src آورده شده است. پس از کامپایل و پروگرم کردن میکرو و اتصال تغذیه مشاهده می کنید که هر دو دیود LED روشن و خاوش می شوند و در واقع میکروی ATmega16 میکروی Mega32 را کنترل می کند.



دانلود PDF این مقاله
جلسه چهاردهم آموزش AVR << مقاله قبلی                ليست مقالات                مقاله بعدی >> جلسه شانزدهم آموزش AVR



© 2009-2016 AVR64.com