آموزش میکروکنترلر AVR

مهمترین هدف برنامه سازی سیستم، دسترسی، مدیریت و بهره برداری از سخت افزار یک سیستم کامپیوتری می باشد. در محیط PC ، دسترسی به سخت افزار از 3 طریق ممکن است اولین راه، دسترسی مستقیم به سخت افزار است که برای بررسی و تحلیل دسترسی ها با استفاده از این روش، در صدد برامدیم که از میکروکنترلر های AVR استفاده می کنیم دانشجویان واساتید ارجمند بهتر است برای درک بهتر، برنامه هایی را در کلاس های عملی برای این میکروکنترلرها نوشته و نحوه ارتباط با سخت افزار را بطور قابل لمس تری مشاهده نمایند.

میکروکنترلر چیست و نحوه برنامه ریزی آن به چه صورت است.

میكروكنترلر در واقع یك كامپیوتر تك تراشه ای می باشد. كامپیوتر تك تراشه ای بدین معنا است كه كل سیستم كامپیوتر در داخل تراشه مدار مجتمع جای داده شده است. میكروكنترلری كه بر روی تراشه سیلیكونی ساخته می شود دارای خصوصیاتی مشابه خصوصیات كامپیوترهای شخصی استاندارد است. در واقع میکروکنترلر قطعه ای است که می توان با دادن فرمان آنرا به عملیات مختلف وا داشت یعنی یک کنترل کننده قابل برنامه ریزی است.

نخستین ویژگی میكرو قابلیت ذخیره سازی و اجرای برنامه است. یك میكرو تمامی خصوصیات یك كامپیوتر را به صورت محدودتر داراست. میکروکنترلرها تراشه هایی هستند که توسط یک نرم افزار به یکی از زبانهای C یا Basic یا اسمبلی برنامه نویسی می شوند و سپس برنامه نوشته شده (که همان اعمال مورد نظر کاربر از میکروکنترلر است) توسط کامپایلر یا اسمبلر کامپایل شده و اگر کامپایل بدرستی صورت گیرد فایلی را تولید خواهد کرد که این فایل دقیقا همان دستورات، اما به زبان ماشین (یعنی زبان قابل فهم توسط میکروکنترلر) است ، در نهایت این فایل تولید شده توسط ابزاری به نام پروگرمر به میکروکنترلر منتقل می شود . با اتصال منبع تغذیه مناسب به میکرو و ابزارهای جانبی و مورد نیاز به پایه های آن، میکروکنترلر شروع به اجرای دستورات خواهد نمود.

 

خانواده های مختلف میکروکنترلر:
امروزه خانواده های مختلفی از میکروکنترلر وجود دارد که موارد زیر نمونه هایی از آنها می باشد.


Intel شرکت 8048 و 8051
Motorola شرکت68HC11
Zilog شرکتZ80
Microchip شرکت PIC
Hitachi شرکت H8
Atmel شرکت AVR

 

در حالت کلی هیچ نوع میکروکنترلری را نمی توان بعنوان بهترین معرفی کرد چرا که هر میکروکنترلر، کاربردهای خاص خودش را دارد و بر اساس خصوصیات داخلی، می توان تنها برای موارد ویژه ای بعنوان بهترین انتخاب گردد . اما برخی ویژگی های خاص این میکرو عبارتند از :

1-دارای بهترین MCU برای حافظه فلش در جهان ! (MCU: Master Control Unit)

2-دارای سیستمی با بهترین هماهنگی

3-دارای بالاترین كارایی و اجرا در CPU (یك دستورالعمل در هر سیكل كلاك)

4-دارای كدهایی با كوچكترین سایز

5-دارای حافظه خود برنامه ریز

6-دارای واسطه JTAG كه با IEEE 1149.1 سازگار است.

 (IEEE: Institute of Electrical and Electronics Engineers.)

7-دارای سخت افزار ضرب كننده روی خود

8-دارای بهترین ابزارها برای پیشرفت و ترقی

9-دارای حالات زیادی برای ترفیع دادن یا Upgrade

 

میکروکنترلر های AVR دارای ویژگی های منحصر بفردی دیگری نیز نسبت به میکروکنترلرهای دیگر موجود هستند، از جمله AVR ها میکروکنترلرهایی 8 بیتی از نو ع CMOS با توان مصرفی پایین هستند که بر اساس ساختار پیشرفته RISC ساخته شده اند که با استفاده از این معماری عملیات خود را در یک کلاک سیکل انجام می دهند. خانواده AVR ، 32 رجیستر همه منظوره و مجموعه دستورات قدرتمندی را شامل می گردند. تمام این 32 رجیستر مستقیما به ALU متصل شده اند. بنابراین دسترسی به 2 رجیستر در یک کلاک سیکل هم امکان پذیر است. این ساختار موجب می گردد تا سرعت آنها نسبت به میکروکنترلرهای CISC بتواند تا 10 برابر هم افزایش یابد.

 

میکروکنترلرهای AVR ، میتوانند تا 10000 مرتبه پاک شده و مجددا برنامه ریزی شوند. این میکروها از تکنولوژی حافظه کم مصرف غیر فرار استفاده می کنند.

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

با پیشرفت علم و تکنولوژی در عرصه الکترونیک، تراشه هایی به عنوان میکروپروسسورها طراحی و تولید شدند تا قبل از سال 1971 میلادی اگر شخص طراح، قصد طراحی سیستمی را داشت باید سیستم مورد نظر را به شرکت های سازنده میکروپروسسور ارائه می داد تا طراحی و ساخته شود و یا اینکه مجبور بود با استفاده از IC هایی سیستم مورد نظر خود را طراحی کند. از این پس شرکت های سازنده میکروپروسسورها، از جمله شرکت Zilog تصمیم به ساخت میکروپروسسوری نمود که بتوان آن را در اختیار کاربر قرار داد و به هر صورت ممکن که می خواهد سیستم مورد نظر خود را طراحی کند و به همین دلیل میکروپروسسور Z80 را به بازار عرضه کرد و نرم افزار کامپایلر به زبان اسمبلی و پروگرمر آنرا نیز ارائه نمود. بطور کلی اگر یک شخص از میکروپروسسور 8 بیتی Z80 برای سیستمی استفاده کند، باید المان های جانبی CPU را نیز علاوه بر سخت افزار سیستم مورد نظر، در کنار میکروپروسسور Z80 قرار دهد.

شکل بلوک دیاگرام یک CPU بهمراه اجزای جانبی آن

ابتدا بهتر است تفاوت میکروپروسسورها را با میکروکنترلرها بصورت مختصر بیان کنیم. همانطور که در بلوک دیاگرام شکل 1 نشان داده شده است برای اینکه از یک میکروپزوسسور حتی برای ساده ترین عملکرد بخواهیم استفاده کنیم، باید از المان های جانبی دیگری نیز بهره گیریم. این عمل سبب افزایش قیمت و پیچیده شدن سخت افزار پروژه مورد نظر می گردد. بنابراین شرکت های سازنده قطعه را به فکر انداخت تا به طراحی تراشه ای بپردازند که تمامی امکانات جانبی میکروپروسسور را به همراه خود CPU داشته باشد، تا شخص طراح با قیمت مناسب و سخت افزار کمتر، بتواند سیستم مورد نظر خود را طراحی نماید.

 

درسال 1981 میلادی شرکت اینتل تراشه ای را به عنوان میکروکنترلر خانواده 8051 به بازار عرضه کرد که این میکروکنترلر دارای CPU 8 بیتی، تایمر یا کانتر، تبادل سریال ، حافظه SRAM و حافظه غیر فرار (Flash) داخلی بود. ابتدا این میکروکنترلر حافظه PROM بهره می برد که فقط یکبار قابل برنامه ریزی بود. سپس این میکروکنترلر را توسعه دادند و در آن از حافظه EPROM استفاده کردند مزیت استفاده از این نوع حافظه در آن است که می توان توسط پنجره شیشه ای که در بالای تراشه قرار داشت، در مجاورت نور ماورائ بنفش مانندنور خورشید قرار داده و بعد از چند دقیقه آنرا پاک کرد. با ادامه این روند شرکت اینتل تصمیم به استفاده از حافظه ای گرفت که بتواند با ولتاژ الکتریکی نوشته و پاک شود (حافظه Flash). این سری با شماره 89Cxx آغاز می شود که امروزه نیز مورد استفاده قرار می گیرد. شرکت های سازنده دیگری از جمله شرکت Atmel تحت لیسانس شرکت اینتل میکروکنترلر 8051 تولید کردند. شرکت Atmel بعدا نوع توسعه یافته 8051 را با سری AT89Sxx ارائه کرد.

 

این روند با ارائه میکروکنترلرهای جدیدی که دیگر شرکت های سازنده قطعه از جمله شرکت Microchip که میکروکنترلرهای PIC را تولید کرده است ادامه یافت تا در نهایت شرکت Atmel خانواده AVR را در سال 1997 به بازار عرضه نمود.

 

طراحی برای زبانهای Basic و C

زبانهای Basic و C بیشترین استفاده را در دنیای امروز بعنوان زبانهای HLL (high level language) دارند. امروزه معماری بیشتر میکروها برای زبان اسمبلی طراحی شده و کمتر از زبانهای HLL حمایت شده است.

 

هدف Atmel طراحی معماری بود که هم برای زبان اسمبلی و هم زبانهای HLL مفید باشد. بطور مثال در زبانهای C و Basic می توان یک متغیر محلی به جای متغیر سراسری در داخل زیر برنامه تعریف کرد، در این صورت فقط در زمان اجرای زیر برنامه مکانی از حافظه RAM برای متغیر اشغال می شود در صورتی که اگر متغیری بعنوان سراسری تعریف گردد در تمام وقت مکانی از حافظه Flash را اشغال کرده است.

 

برای دسترسی سریعتر به متغیرهای محلی و کاهش کد، نیاز به افزایش رجیسترهای همه منظوره است. AVR ها دارای 32 رجیستر هستند که مستقیما به ALU (Arithmetic Logic Unit) متصل شده اند، و تنها در یک کلاک سیکل به این واحد دسترسی پیدا می کنند.

 

خانواده AVR به سه دسته تقسیم می شوند:

  1. سری AT90S

این دسته، اعضای کلاسیک خانواده AVR را تشکیل می دهند و قابلیت های کمتری نسبت به دو دسته بعدی دارند و کمتر نیز ورد استفاده قرار می گیرند.

 

ATtiny
85ATtiny
28ATtiny
25ATtiny
15ATtiny
12ATtiny
10ATtiny
2313ATtiny
45ATtiny
26ATtiny
22ATtiny
13ATtiny11
سری ATtiny : این میکروکنترلرها در ابعاد کوچک 8، 20 و 28 پایه ای هستند و قابلیتهای بهتری نسبت به دسته اول دارند و اکثرا در سیستم هایی که نیاز به پورت بالا نیست استفاده می شوند. 
  • سری ATmega : این دسته، امکانات بیشتری نسبت به دو دسته قبلی دارند . این نوع میکروکنرلرها قابلیت خود برنامه ریزی دارند و می توان آنها را با استفاده از مدارات اضافی برنامه ریزی کرد. در این کتاب سعی شده دسته ATmega برای آموزش انتخاب شود، زیرا تمامی سرفصل های آموزش AVR را شامل می شود.

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

  • معماری CISC : (Complex Instruction Set Computer)

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

معماری RISC (Reduced Instruction Set Computer)

هدف از این معماری کوتاه کردن زمان اجرا، با کاهش مجموعه دستورات در کامپیوتر است. در این معماری جدید تعداد دستورات کاهش پیدا کرد و از طرفی سرعت اجرایی دستورات تقریبا 10 برابر نسبت به معماری قبلی افزایش یافت و برنامه نویسی به زبان اسمبلی را قدری پیچیده و سخت کرد اما با وجود ساختار بهینه شده میکروکنترلرهای AVR با حافظه های ظرفیت بالا و همچنین استفاده از معماری RISC امکان برنامه نویسی به زبان سطح بالا مانند C و BASIC فراهم گردید.


فیوز بیت های میکرو کنترلر ATMEGA32
فیوز بیت ها قسمتی از حافظه FLASH هستند که امکاناتی را در اختیار کاربر قرار می دهند. فیوز بیت ها با پاک کردن میکروکنترلر (ERASE) از بین نمی روند و می توانند توسط بیت های قفل مربوطه، قفل شوند. تغییر آنها فقط از طریق پروگرمر امکان پذیر است و برای تنظیم آنها نیاز به برنامه نویسی خاصی نداریم و موقع پروگرم کردن توسط ابزار نرم افزار Codevision یا BASCOM آنها را تنظیم و برنامه ریزی می کنیم. فیوز بیت ها با 0 برنامه ریزی و با 1 غیر فعال می شوند. توجه کنید که برنامه ریزی فیوزبیت ها باید قبل از قفل کردن تراشه صورت گیرد. میکرو کنترلر های AVR بسته به نوع قابلیتی که دارند دارای فیوز بیت های متفاوتی هستند. بعلت توجه بیشتر این کتاب به میکرو کنترلر ATMEGA32 ، به توضیح فیوز بیت های این میکرو می پردازیم. برای اینکه بدانید میکروکنترلری که با آن کار می کنید دارای چه ویژگی و چه فیوز بیت هایی می باشد. به Data Shit آن مراجعه نمایید. میکروکنترلر ATMEGA32 دارای 2 یایت فیوز بیت طبق جدول زیر می باشد.



فیوز بیت OCDEN (On Chip Debug Enable)
زمانیکه فیوز بیت ارتباط دهی JTAG فعال شده باشد و همچنین برنامه میکروکنترلر را قفل نکرده باشیم می توان با فعال کردن فیوزبیت OCDEN برنامه میکروکنترلر را به طور آنلاین در حین اجرا توسط مدار واسطی که از ارتباط سریال JTAG استفاده می کند توسط نرم افزار AVR Stdio مشاهده کرد. به این نوع آنالیز امولاتور (Emulator) یا شبیه ساز سخت افزاری گفته می شود. همچنین برنامه ریزی شدن این بیت به قسمتهایی از میکرو امکان می دهد که در مدهای SLEEP کار کنند. درهر صورت فعال کردن این بیت مصرف توان میکرو کنترلر را افزایش می دهد. این بیت بصورت پیش فرض برنامه ریزی نشده (1) است.

  • نکته در مورد واسط JTAG واسطه ای كه تسلیم قانون IEEE 1149.1 است و می تواند به صورت NVM برنامه ریزی كند یعنی با استفاده از فیوزها و بیتهای قفل هنگام قطع جریان برق داده ها از بین نروند. بیشتر برای دیباگ كردن آنچیپ و به منظور تست استفاده می شود .

    فیوز بیت JTAGEN : با فعال کردن این بیت میکرو را از طریق ارتباط دهی استاندارد IEEE (JTAG) می توان برنامه ریزی کرد. (این فیوز بیت بطور پیش فرض فعال است) . میکرو می تواند از این ارتباط برای برنامه ریزی خود استفاده نماید.

    فیوز بیت SPIEN : با فعال کردن این فیوز بیت می توان میکرو را از طریق ارتباط دهی سریال SPI برنامه ریزی کرد. این فیوز بیت بطور پیش فرض فعال است.

    فیوز بیت CKOPT : با فعال کردن این بیت، می توان از حداکثر دامنه نوسان اسیلاتور خارجی استفاده کرد. این حالت در مکانهایی که نویز زیادی دارند استفاده می شود، هرچند باعث افزایش توان مصرفی در میکروکنترلر می گردد. (این فیوزبیت بطور پیش فرض غیر فعال است)

    فیوز بیت EESAVE : در زمان پاک شدن (ERASE) میکرو حافظه EEPROM ریست (پاک) می شود ولی در صورتیکه این بیت برنامه ریزی شود محتویات EEPROM در زمان پاک شدن حافظه FLASH محفوظ می ماند. این بیت بطور پیش فرض غیرفعال است.

    فیوز بیت های BOOTSZ0 و BOOTSZ1 : این دو بیت، مقدار حافظه اختصاص د اده شده BOOT را طبق جدول زیر تعیین می کنند. در زمان برنامه ریزی شدن فیوز بیت BOOTRST اجرای برنامه از آدرس حافظه BOOT آغاز خواهد شد.


    جدول تعیین ظرفیت حافظه BOOT

    فیوزبیت BOOTRST : این بیت برای انتخاب بردار Reset است اگر غیر فعال باشد آدرس بردار RESET از $0000 است و اگر این بیت فعال شود به آدرسی که فیوز بیت های BOOTSZ0 و BOOTSZ1 مشخص کرده اند تغییر می یابد.

    فیوز بیت BODEN : مدار BROWN-OUT آشکارساز ولتاژ تغذیه است که اگر از 2.7 یا 4 ولت کمتر شود میکروکنترلر را ریست می کند. برای فعال کردن این مدار، باید فیوزبیت BODEN فعال گردد. این فیوز بیت بطور پیش فرض غیرفعال است.

    فیوز بیت BODLEVEL : اگر فیوزبیت BODEN فعال و فیوز بیت BODLEVEL غیرفعال باشد با کاهش ولتاژ VCC کمتر از 2.7 ولت میکروکنترلر ریست می شود اما اگر فیوز بیت BODLEVEL را فعال کنیم آنگاه با کاهش ولتاژ VCC کمتر از 4 ولت میکروکنترلر ریست می شود. مطاابق جدول زیر سطح ولتاژ BROWN-OUT تعیین می شود. فیوز بیت BODLEVEL بصورت پیش فرض غیر فعال است.


  • فیوز بیت های SUT0 و SUT1 : این دو بیت، زمان راه اندازی (Start-up) را در هنگام متصل کردن منبع تغذیه مطابق جدول زیر تعیین می کنند .

    فیوز بیت های CLKSEL3 ، CLKSEL2، CLKSEL1، CLKSEL0

    توسط این فیوز بیت ها نوع و مقدار فرکانس اسیلاتور را تعیین می کنیم. عملکرد این بیت ها بطور کامل شرح می دهیم برای اینکار نیاز داریم که با منابع کلاک سیستم در میکروکنترلرهای AVR آشنایی مختصری پیدا کنیم.

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

سیستم کلاک پالس در میکروهای AVR بسیار متنوع است. در شکل زیر سیستم توزیع و پخش کلاک و همینطور انواع نوسان ساز ها مشخص شده است. همانطور که در شکل مشخص است منبع کلاک توسط یک مالتی پلکسر, پالس لازم را به واحد کنترل کننده کلاک (AVR Clock Control Unit) اعمال می کند. در واقع کار این انتخاب کننده، انتخاب کردن یکی از نوسان سازهای تامین کننده کلاک ، برای قسمت های مختلف از جمله هسته cpu (CPU Core) یا ADC و یا … می باشد.
کلاک سیستم مطابق شکل بین قسمت های مختلف میکرو توزیع شده است.

  • کلاک غیرهمزمان تایمر_ CLK ASY : با این کلاک تایمر یا کانتر بصورت غیر همزمان توسط فرکانس اسیلاتور HZ32768 کار می کند حتی اگر سیستم در حالت SLEEP باشد.
  • کلاک I/O – CLK I/O : این کلاک برای تولید پالس ماژول های ورودی و خروجی مانند USART ، SPI ، شمارنده و وقفه ها بکار می رود.
  • کلاک ADC _ (CLKACD) : کلاک لازم را جهت قسمت مبدل آنالوگ به دیجیتال فراهم می کند که نوسط قسمت مبدل ADC می تواند بطور مجزا تقسیم گردد.
  • کلاک (CPU)_ CLKcpu : این پالی به هسته (اجزای درونی) CPU و SRAM داخلی اعمال می شود. توقف و به مکث بردن این کلاک باعث می شود که عملیات و محاسبات AVR انجام نگیرد.
  • کلاک FLASH _ CLKFLASH : کلاک لازم را برای حافظه فلش و EEPROM داخلی فرام می سازد. کلاک فلش معمولا با کلاک CPU فعال می گردد.

نکته آخر اینکه تایمر WATCHDOG از یک اسیلاتور مجزا داخلی (Watchdog Oscillator) برای تاکین کلاک خود استفاده می کند.
ساختار داخلی میکروکنترلرهای AVR
فیوز بیت های STU0 و STU1
این دو فیوز بیت زمان شروع (Start-up) را در موقع وصل تغذیه جدول 1-7 تعیین می کنند (بطور پیش فرض STU0 فعال و SUT1 غیرفعال است).



جدول 1-7 تنظیم فیوز بیت های Start-up

  • فیوز بیت های CKSEL0 , CKSEL1 , CKSEL2 , CKSEL3

توسط این فیوز بیت ها نوع و مقدار فرکانس اسیلاتور را تعیین می کنیم. به طور پیش فرض فیوز بیت CKSEL0 غیرفعال و بقیه فعال هستند یعنی فرکانس 1MHZ داخلی انتخاب شده است. اگر بخواهیم فرکانس کاری اسیلاتور داخلی را تنظیم کنیم این فیوز بیت ها را طبق جدول 1-8 تنظیم می کنیم و اگر بخواهیم از کریستال خارجی استفاده کنیم باید این فیوز بیت ها را طبق جدول 1-9 در حالت یک یعنی غیرفعال قرار دهیم در تنظیم این فیوز بیت ها دقت نمایید بطور مثال اگر اشتباهی تمام این فیوز بیت ها را فعال کنیم طبق جدول 1-9 مد کلاک خارجی انتخاب می شود که در این حالت میکروکنترلر نه با نوسان داخلی و نه با کریستال خارجی کار می کند بلکه توسط کلاک خارجی که به پایه XTAL1 اعمال می شود کار می کند همچنین توجه کنید اگر شما از کریستال خارجی برای میکروکنترلر خود استفاده می نمایید باید حتما موقع پروگرمر کردن نیز کریستال به میکروکنترلر وصل باشد ولی در حالت استفاده از نوسان ساز داخلی نیازی به قرار دادن کریستال بیرونی ندارید.



جدول 1-8 تنظیم نوسان ساز کالیبره شده داخلی



جدول 1-9 تعیین منبع کلاک سیستم


نکته: اگر بطور تصادفی فیوز بیت ها را اشتباه تنظیم کرده اید و با قراردان کریستال خارجی، میکروکنترلر توسط پروگرامر شناسایی نشد، یک فرکانس 1MHZ توسط ی میکروکنترلر دیگری به پایه XTAL1 میکروکنترلر مذکور اعمال کنید و توسط پروگرامر ، فیوز بیت ها را صحیح تنظیم نمائید.


1-5 پورت های ورودی و خروجی میکروکنترلر ATmega16
در میکروکنترلر AVR بسته به نوع قابلیت و بسته بندی که دارد دارای یک سری پایه های ورودی و خروجی است. ممکن است عموما یک پورت دارای 8 پایه نباشد بطور مثال پورت c میکرووکنترلر Atmega دارای 5 پایه می باشد. پورتهای تمام میکروکنترلرهای AVR می توانند به صورت ورودی و خروجی عمل کنند در حالت اولیه Reset تمام ورودی و خروجی ها در حالت Tri-state قرار می گیرند. Tri-state یعنی حالتی که پایه پورت امپدانس بالا می باشد. همچنین تمامی پایه های پورت ها مجهز به مقاومت بالاکش(Pull-up) داخلی هستند که می توانند در حالت ورودی فعال شوند. از آنجائیکه مقاومت بالاکش (Pull up) داخلی هستند که می توانند در حالت ورودی فعال شوند.

از آنجائیکه جریان دهی پورت های میکروکنترلرهای قدیمی نمی توانستند حتی یک LED را روشن کنند شرکت های سازنده میکروکنترلرهای جدید سعی کرده اند که جریان دهی پایه های پورت ها را افزایش دهند بافر latch داخلی میکروکنترلرهای AVR می تواند در جریان دهی (Source) و جریان کشی (Sink) در حالت فعال، جریانی تا 20mA را تامین کند البته در حالت حداکثر می تواند جریان 40mA را تحمل کند. بنابراین به راحتی میتواند یک LED و یا سون سگمنت را جریان دهی کند. بطور کلی تمامی پورت های میکروکنترلرهای AVR دارای سه رجیستر تنظیم کننده به فرم زیر هستند:


1. DDRx.n : این رجیستر (Data Direction Register) برای تنظیم هر پایه از یک پورت به عنوان ورودی و خروجی در نظر گرفته شده است .اگر بیتی از این رجیستر یک شود نشان دهنده تعیین آن پایه به عنوان خروجی و اگر صفر شود آن پایه ورودی خواهد بود.


مثال:
تمام پایه های پورت A به عنوان خروجی // DDRA=0xFF;
تمام پایه های پورت A به عنوان خروجی // DDRB=0x00;
پایه PC.0 از پورت C به عنوان خروجی // DDRC.0=1;
پایه PC.0 از پورت C به عنوان ورودی // DDRC.0=0;


2. PORTx.n : این رجیستر (Port Data Register) برای ارسال دیتا به خروجی می باشد. هر موقع میکروکنترلر بخواهد داده ای را به خروجی بفرستد باید ابتدا رجیستر DDRx.n در حالت خروجی تنظیم شده باشد و سپس داده موردنظر در رجیستر PORTx.n قرار می گیرد.
تمام پایه های پورت B به عنوان خروجی // DDRB-0xFF;
عدد 46 دسیمال به خروجی پورت B ارسال می گردد// PORTB=46;


3. PINx.n : این رجیستر (Port Input Pin Address) برای دریافت دیتا از ورودی است هرگاه میکروکنترلر بخواهد داده ای را از ورودی بخواند باید رجیستر DDRx.n در حالت ورودی تنظیم شده باشد و سپس داده موردنظر از رجیستر PINx.n به صورت بیتی توسط دستورهای شرطی خوانده می شود. همچنین خواندن به صورت بایتی ، با یک متغیر 8 بیتی انجام می شود.
مثال
فعال کردن مقاومت Pull-up داخلی پایه PCS // PORTC.5=1;
تعیین پایه PCS به عنوان ورودی // DDRC.5=0;
اگر پایه PCS برابر صفر شد دستورالعمل ها اجرا شوند// if(PINK.5==0) {
دستورالعمل ها
}
تعیین تمام پایه های پورت C به عنوان ورودی // DDRC=0Î00;
خواندن دیتا از پورت C و قرار دادن آن در متغیر Data// Data=PINK;


کاربردهای دیگر پورت های میکروکنترلر ATmega16


پورت A
پایه های PA0 تا PA7 پورت A را تشکیل می دهند. در حالت عادی می توان از این پایه ها به عنوان ورودی و خروجی استفاده کرد. کاربرد بعدی پایه های پورت A به عنوان ورودی مالتی پلکسر مدل آنالوگ به دیجیتال می باشند. توجه کنید در صورتی که شما به طور مثال از کانال ADC0 استفاده می کنید می توانید از دیگر پایه های پورت A برای کاربردهای دیگر به عنوان ورودی و خروجی استفاده کنید اما بهتر است در هنگام عمل تبدیل مبدل آنالوگ به دیجیتال داده ای به خروجی پورت A ارسال نشود.


پورت B
پایه های PB0 تا PB7 پورت B را تشکیل می دهند. در حالت عادی ی توان از این پایه ها به بعنوان ورودی و خروجی استفاده کرد. عملکرد بعدی این پورت ارتباط دهی سریال SPI، وقفه خارجی دو، ورودی مقایسه کننده آنالوگ، خروجی مد مقایسه ای تایمر صفر و ورودی کانتر صفر و یک می باشد که به توضیح آنها می پردازیم.

پایه PB0(XCK/T0)
اگر کانتر صفر استفاده شود ورودی کانتر صفر پایه T0 خواهد بود همچنین اگر USART در مد سنکرون کار کند، پایه XCK به عنوان خروجی کلاک همزمان کننده USART عمل می کند.


پایه PB1(T1)
اگر کانتر یک استفاده شود ورودی کانتر یک پایه T1 خواهد بود.


پایه PB2(INT2/AIN0)
اگر وقفه خارجی دو توسط رجیسترهای مربوطه فعال شود آنگاه پایه INT2 به عنوان ورودی وقفه خارجی دو عمل می کند. همچنین اگرمقایسه کننده آنالوگ داخلی فعال شده باشد پایه AIN0 به عنوان ورودی مثبت OPAMP داخلی عمل می کند.


پایه PB3(OC0/AIN1)
در صورتی که از مد مقایسه ای تایمر صفر استفاده کنیم و خروجی مقایسه ای فعال شده باشد پایه OC0 به عنوان خروجی مد مقایسه ای تایمر صفر و در مد PWM تایمر صفر به عنوان خروجی سیگنال PWM تولید شده عمل می کند. همچنین اگر مقایسه کننده آنالوگ داخلی فعال شده باشد پایه AIN1 به عنوان ورودی منفی OPAMP داخلی عمل می کند.


پایه PB4(SS)
در شرایطی که از ارتباط دهی SPI استفاده کنیم و میکروکنترلر در حالت Slave باشد پایه SS به عنوان ورودی انتخاب Slave عمل می کند.


پایه PB5(MOSI)
اگر از ارتباط دهی سریال SPI استفاد ه کنیم پایه MOSI به عنوان خروجی در حالت Master و به عنوان ورودی در حالت Slave عمل می کند. در حالت ورودی برای Slave تنظیم DDRB.5 تاثیری بر عملکرد این پایه ندارد.


پایه PB6(MISO)
اگر از ارتباط دهی سریال SPI استفاده کنیم پایه MISO به عنوان ورودی در حالت Master و به عنوان خروجی در حالت Slave عمل می کنند. در حالت ورودی برای Master تنظیم DDRB.6 تاثیری بر عملکرد این پایه ندارد.


پایه PB7(SCK)
در ارتباط دهی SPI پایه SCK به عنوان خروجی Master و به عنوان ورودی کلاک Slave عمل می کند. زمانی که Slave انتخاب شود این پایه ورودی خواهد بود و اگر Master انتخاب شود باید توسط DDRB.7 جهت داده تنظیم گردد.


پورت C
پایه های PC0 تا PC7 پورت C را تشکیل می دهند. در حالت عادی می توان از این پایه ها به عنوان ورودی و خروجی استفاده کرد. عملکرد بعدی این پورت ارتباط دهی سریال TW1 ، ارتباط دهی استاندارد JTAG و کریستال پالس ساعت واقعی RTC تایمر دو است.


پایه PC0(SCL)
زمانی که از ارتباط دهی سریال دو سیمه TW1 استفاده شود. پایه SCL ب عنوان کلاک عمل می کند. این پایه کلاک استاندارد I2C است.


پایه PCI(SDA)
زمانی که از ارتباط دهی سریال دو سیمه TW1 استفاده شود، پایه SDA به عنوان خط دیتا عمل می کند. این پایه، دیتا استاندارد I2C است.


پایه PC2(TCK)
در ارتباط دهی استاندارد JTAG که برای برنامه ریزی میکروکنترلر نیز استفاده می شود پایه TCK به عنوان کلاک تست به صورت سنکرون عمل می کند. توجه کنید در صورت فعال بودن ارتباط دهی JTAG نمی توان از این پایه به عنوان ورودی و خروجی استفاده کرد. برای غیرفعال این ارتباط دهی به بخش توضیح فیوز بیت ها مر اجعه کنید.


پایه PC3(TMS)
در ارتباط دهی JTAG پایه TMS بر ای انتخاب مد تست می باشد. در صورت فعال بودن JTAG دیگر نمی توان از این پایه به عنوان ورودی و خروجی استفلاده کرد.


پایه PC4(TDO)
در ارتباط دهی JTAG پایه TDO به عنوان خروجی داده سریال عمل می کند و در صورت فعال بودن JTAG دیگر نمی توان از این پایه به عنوان ورودی و خروجی استفا ده کرد.


پایه PC5(TDI)
در ارتباط دهی JTAG پایه TDI به عنوان ورودی داده سریال عمل می کند و در صورت فعال بودن JTAG دیگر نمی توان از این پایه به عنوان ورودی و خروجی استفاده کرد.


پایه PC6(TOSC1)
در صورتی که بخواهیم از RTC تایمر دو استفاه کنیم باید از کریستال 32.768KHZ پالس ساعت استفاده کنیم پایه TOSC1 به عنوان پایه اول اسیلاتور پالس زمان واقعی می باشد. در صورت فعال شدن بیت AC2 در رجیستر ASSR، تایمر دو، پالس خود ر ا از کریستال پالس ساعت تامین می کند و دیگر نمی توان از این پایه در این حالت، به عنوان ورودی و خروجی استفاده کرد.


پایه PC7(TOSC2)
در صورتی که بخواهیم از RTC تایمر دو استفاده کنیم باید از کریستال 32.768KHZ پالس ساعت استفاده کنیم پایه TOSC2 به عنوان پایه دوم اسیلاتور پالس زمان واقعی می باشد. در صورت فعال شدن بیت AC2 در رجیستر ASSR، تایمر دو ، پالس خود را از کریستال پالس ساعت تامین می کند و دیگر نمی توان از این پایه در این حالت، بعنوان ورودی و خروجی استفاده کرد.


پورت D
پایه های PD0 تا PD7 پورت D را تشکیل می دهند در حالت عادی می توان از این پایه ها به عنوان ورودی و خروجی استفاد ه کرد عملکردهای بعدی این پورت ارتباط دهی سریال USART، وقفه های خروجی صفر و یک، خروجی های مد مقایسه ای تایمر یک و خروجی مد مقایسه ای تایمر 2 و ورودی Capture تایمر یک می باشد.


پایه PD0(RXD)
در ارتباط دهی سریال USART پایه RXD بدون در نظر گرفتن DDRD.0 به عنوان ورودی داده سریال پیکربندی می شود.


پایه PD1(TXD)
در ارتباط دهی سریال USART یا به TXD بدون در نظر گرفتن DDRD.1 به عنوان خروجی داده سریال پیکربندی می شود.


پایه PD2(INT0)
اگر وقفه خارجی صفر فعال شده باشد پایه INT0 به عنوان منبع ورودی وقفه صفر عمل می کند.


PD3(INT1)
اگر وقفه خارجی یک فعال شده باشد پایه INT1 به عنوان منبع ورودی وقفه یک عمل می کند.


PD4(OC1B)
استفاده از مد مقایسه ای تایمر یک و فعال کردن خروجی مقایسه ای، پایه OC1B به عنوان دوم مقایسه ای تایمر یک عمل می کند همچنین در مد PWM تایمر پک، این پایه می تواند سیگنال PWM تولید شده باشد.


PD5(OC1A)
استفاده از مد مقایسه ای تایمر یک و فعال کردن خروجی مقایسه ای، پایه OC1A به عنوان اول مقایسه ای تایمر یک عمل می کند همچنین در مد PWM تایمر یک این پایه می تواند سیگنال PWM تولید شده باشد.


PD6(ICP
حد تسخیر کننده یعنی مد Capture تایمر یک فعال شده باشد پایه ICP به عنوان ورودی Capture یک عمل می کند.


PD7(OC2)
استفاده از مد مقایسه ای تایمر 2 و فعال کردن خروجی مقایسه ای، پایه OC2 به عنوان مقایسه ای تایمر دو عمل می کند. همچنین در مد PWM تایمر دو، این پایه می تواند خروجی PWM تولید شده باشد.


1-6 تغذیه مناسب جهت بایاس میکروکنترلر

VCC و GND تغذیه میکروکنترلر را تامین می کنند میکروکنترلرهای AVR همان طور که در میکروکنترلرهای ATmega16 بیان کردیم می توانند با ولتاژ 2.7v تا 5.5v برای نوع L و ولتاژ 4v تا 5.5v برای کار کنند اما از آنجائی که اکثر تراشه ها و المان هایی نظیر LCD و آی سی های دیجیتال و ولتاژ 5v استفاده می کنند بنابراین به طور استاندارد تغذیه میکروکنترلر را 5 ولت انتخاب و چون ولتاژ بیشتر از 5 ولت، باعث سوختن میکروکنترلر می شود برای تغذیه آن از رگولاتور 280 استفاده می شود البته باید نویز محیط را نیز در نظر بگیریم.


منبع تغذیه DC ورودی 9 ولتی استفاده کرده ایم زیرا ولتاژ ورودی رگولاتور بهتر است 3 ولت از ولتاژ نامی باشد همچنین ورودی را می توان 12 ولت انتخاب کرد اما این امر باعث افزایش و گرما در رگولاتور می شود. استفاده از دیود برای حافظت رگولاتور در برابر پلارینه معکوس باشد. سلف 1MH به همراه خازن عدسی 10Nf به عنوان فیلتر حذف نویز ورودی رگولاتور عمل کند و خازن عدسی 100nF نویزهای تغذیه 5 ولت خروجی رگولاتور را حذف می کند و خازن الکترولیتی 100uf در ورودی رگولاتور به صاف کردن تغذیه ورودی کمک می کند و همچنین خازن الکترولیتی 10uf خروجی رگولاتور باعث جلوگیری از افت ولتاژ تغذیه 5 ولت می شود


.


در صورتی که بخواهیم از تغذیه با ورودی AC برای میکروکنترلر خود استفاده نمائیم باید طبق مدار شکل 1-5 عمل کنیم تمام توضیحات داده شده در مدار قبلی ، در این مدار نیز صدق می کند. تنها تفاوت این مدار وجود ترانس کاهنده 220 ولت به 9 ولت می باشد که توسط این دیود به صورت تمام موج یکسو می باشد و توسط خازن شیمیایی 1000mF صاف می گردد.



توجه) رگولاتورهای موجود در بازارهای الکترونیکی می توانند تا 500mA حداکثر جریان بدهند در صورتی که بخواهیم جریانی بیشتر از حدمجاز استفاده کنیم می توانیم از یک ترانزیستور و با موازی کردن دو رگولاتور و یا رگولاتورهای با جریان بیشتر و یا از منبع تغذیه سوئیچینگ استفاده کنیم. همچنین برای استفاده جریانی بیشتر از 100mA از خروجی رگولاتور مدار فوق، باید از گرماگیر (Heat Sink) استفاده کنیم ابعاد هیت سینک را 2Î2 سانتی متر انتخاب کنید.

ساختار داخلی میکروکنترلر ATmega16
همان طور که در بلوک دیاگرام شکل 1-6 مشاهده می کنید اجزای درونی میکروکنترلر توسط باس های داخلی به هم متصل شده اند و یک بخش از این بلوک دیاگرام با خط چین با نام AVR CPU مشخص شده است که در واقع پردازنده اصلی AVR می باشد. در این قسمت قصد داریم اجزای تشکیل دهنده شمارنده برنامه، اشاره گر پشته، رجیستر دستورات، آشکارساز دستورات، رجیسترهای X، Y و Z رجیسترهای همه منظوره واحد محاسبه و منطق (ALU) و رجیستر وضعیت از اجزای تشکیل دهنده CPU میکروکنترلر AVR هستند.

میکروکنترلر AVR از معماری RISC استفاد ه می کند و برای کارایی بهتر از ساختار Harvard و همچنین از حافظه ها و باس های جداگانه برای انتقال داده استفاده می کند دستورات به یک سطح pipelining اجرا می شوند و هنگامی که یک دستور در حال اجرا می باشد دستور بعدی از حافظه برنامه pre-fetched می شود به این روش هر دستور تنها در یک کلاک سیکل اجرا می شود.

شکل1-6 بلوک دیاگرام داخلی میکروکنترلرATmega16

کار اصلی یک CPU دسترسی به حافظه، محاسبات ریاضی و منطقی، کنترل وسایل جانبی و بررسی وقفه های هر یک از قسمت ها می باشد.


شکل1-7 بلوک دیاگرام ساختار میکروکنترلرهای AVR

شمارنده برنامه PC (Program Counter)
CPU میکروکنترلر برای اینکه دستورات را از اولین آدرس حافظه برنامه خط به خط بخواند نیاز به یک شمارنده برنامه می باشد. افزایش PC آدرس خط بعدی را برای اجرای دستورات فراهم می کند.

اشاره گر پشته SP (Stack Pointer) :
در میکروکنترلر AVR اشاره گر پشته از دو رجیستر 8 بیتی استفاده می کند. اشاره گر پشته برای ذخیره موقت اطلاعات در دستورالعملهای فراخوانی CALL ، PUSH و POP و متغیرهای محلی، روتین های وقفه و توابع استفاده می شود.
رجیستر دستورات (Instruction Registe)
CPU میکروکنترلر برای فهمیدن انجام یک دستورالعمل از کد ماشین استفاده می کند و به هر کدام از این کدها یک سمبل در زبان اسمبلی اختصاص داده می شود. رجیستر دستورات تمامی دستورهای اسمبلی در نظر گرفته شده از طرف شرکت سازنده Atmel را شامل می شود.


آشکارساز دستورات(Instruction Decoder)

شمارنده برنامه افزایش می یابد و کد هر دستور توسط CPU خوانده می شود و با توجه به رجیستر دستورات، خوانده شده آشکار می گردد و CPU متوجه می شود که کد دستور به چه معنی و مفهومی است.

رجیسترهای همه منظوره (General Purpose Register)

میکروکنترلرهای AVR دارای 32 رجیستر همه منظوره هستند این رجیسترها قسمتی از حافظه SRAM میکروکنترلر می باشند که اکثر دستورات اسمبلی AVR مستقیما با این رجیسترها دسترسی دارند یک کلاک سیکل اجرا می شوند.


شکل 1-8 رجیسترهای همه منظوره CPU میکروکنترلرهای AVR

رجیسترهای X، Y و Z
وظیفه این سه رجیستر که البته از ترکیب رجیسترهای R26 تا R31 بوجود می آیند اشاره گر 16 بیتی آدرس دهی غیرمستقیم فضای داده هستند و بسیاری از دستورات اسمبلی AVR با این سه رجیستر عمل می کنند.

واحد محاسبه و منطق ALU (Arithmetic Logic Unit)
ALU در میکروکنترلر AVR به صورت مستقیم با تمام 32 رحیستر همه منظوره ارتباط دارد. عملیاتهای محاسباتی با رجیسترهای همه منظوره در یک کلاک سیکل اجرا می شوند به طور کلی عملکرد ALU را می توان به سه قسمت اصلی ریاضیاتی، منطقی و توابع بیتی تقسیم بندی کرد در برخی از ALUهای توسعه یافته در معماری میکروکنترلرهای AVR از یک ضرب کننده با قابلیت ضرب اعداد بدون علامت و علامتدار و نیز اعداد اعشاری استفاده شده است.


رجیستر وضعیت SREG (Status Register)

بیت های این رجیستر در واقع پرچم هایی هستند که CPU را از نتایج دستورات و وضعیت برنامه آگاه می کنند.


بیت 0-C پرچم Carry
انجام دستوراتی که عملیات محاسباتی یا منطقی را انجام می دهند سبب تاثیر بر پرچم نقلی(Carry) می شود. بطور مثال اگر نتیجه جمع 8 بیتی بیشتر از 8 بیت شود Carry برابر یک خواهد شد.


بیت 1 –Z پرچم Zero
برخی از دستورات منطقی و محاسباتی سبب تاثیر بر روی این پرچم می شوند اگر حاصل عملیات صفر شود این پرچم فعال می گردد.


بیت 2-N پرچم Negative
این بیت نشانگر نتایج منفی در عملیاتهای محاسباتی یا منطقی است.


بیت3-V پرچم Two’s Complement Overflow
در دستورات محاسباتی این بیت نشانگر سرریز مکمل عدد دو می باشد.


بیت 4-S بیت علامت Sign Bit
این بیت حاصل XOR دو پرچم N و Y می باشد. S=N xor V(S=0 علامت + و S=1 علامت-)


بیت 5- H پرچم Half Carry
در انجام دستورات محاسباتی BCD پرچم نقلی کمکی تاثیر می بیند.


بیت6- T پرچم Bit Copy Storage
می توانیم از بیت T به عنوان مبدا و یا مقصد یک عملیات بیتی استفاده کنیم.


بیت 7- I پرچم Global Interrupt Enable
این بیت برای فعال سازی وقفه همگانی است اگر این بیت یک شود به دیگر وقفه ها در صورت فعال شدن پاسخ داده می شود در موقع رخ دادن یکی از وقفه ها برنامه وارد تابع وقفه مربوطه می شود در این حالت این پرچم توسط سخت افزار صفر می شود و به وقفه دیگری پاسخ داده نمی شود و در برگشت از تابع وقفه مربوطه این بیت بطور اتوماتیک توسط سخت افزار یک می شود.
در زبان برنامه نویسی C این بیت بصورت زیر فعال و غیرفعال می شود.
فعال کردن وقفه همگانی// #asm (“sei”)
غیرفعال کردن وقفه همگانی// #asm (“cli”)


1-8 انواع حافظه در میکروکنترلرهای AVR
میکروکنترلرهای AVR دارای سه نوع حافظه هستند.


حافظه Flash
در این حافظه کدهای برنامه یعنی همان فایل *.hex که توسط پروگرامر بر روی تراشه Load میشود، قرار می گیرد و CPU میکروکنترلربرنامه را که اجرا می کند کد دستورالعمل را از این حافظه برداشت می کند. حافظه ثابت (Flash) میکروکنترلرهای AVR از نسل جدید این حافظه می باشد و دارای دو قسمت Application و Boot Loader هستند. در قسمت Application کدهای برنامه قرار می گیرد اما ناحیه Boot این امکان را فراهم می کند که میکروکنترلربدون استفاده از ابزار پروگرامر، برنامه حافظه Flash را تغییر دهد. بطور مثال نحوه ی تعیین یک آرایه در حافظه ثابت بصورت زیر است:
2عدد 8بیتی ذخیره شده در Flash // flash char row[]={0xte,Uxtd,oxtd,0xtb,0x17}
شکل 1-9 آدرس و تقسیم بندی حافظه Flash را به دو قسمت نشان می دهد.
شکل 1-9
نقشه حافظه برنامه (Flash)

حافظه EEPROM
این حافظه جزء حافظه های ماندگار می باشد که میکروکنترلر می تواند اطلاعاتی را در این حافظه داخلی بنویسد و یا اطلاعاتی را از آن بخواند همچنین لازم به یادآوری است که این حافظه در صورت قطع تغذیه میکروکنترلر پاک نمی گردد. از این حافظه زمانی استفاده می شود که میکروکنترلر باید دیتایی را در خود ثبت کند و بعدا آن دیتا را به کاربر اعلام کند و در صورتی که میکروکنترلر Reset شد با تغذیه آن قطع گردید داده ذخیره شده از بین نرود باید توجه کنید که برای خواندن و نوشتن در حافظه eeprom باید یک زمان تاخیری در نظر بگیرید. در جدول 1-15 مدت زمان مناسب با کلاک 1MHZ ، 8.5 میلی ثانیه بیان شده است.
تعریف متغیر در حافظه EEPROM بصورت زیر است:


متغیر X در حافظه EEPROM ذخیره شده است// eeprom unsigned int X=0xff;


حافظه SRAM
همانطور که ذکر کردیم کدهای برنامه در حافظه Flash قرار می گیرند و CPU میکروکنترلر کدهای دستورات را آشکار می کند حال باید خاص دستورات انجام شده در یک حافظه موقت ذخیره گردد. این حافظه در میکروکنترلر AVR از نوع Static RAM می باشد رجیسترهای همه منظوره و رجیسترهای ورودی و خروجی نیز جز این حافظه می باشند محتوای این حافظه با قطع تغذیه پاک می گردد و در صورتی که میکروکنترلر را Reset کنیم محتوای رجیسترها صفر می شود اما محتوای حافظه SRAM صفر نمی شود.
بطور مثال متغیر M را در حافظه SRAM ذخیره کنید.
Unsigned char M=0x12;
بنابراین مشخص می شود در تعریف هر متغیری که قبل از آن کلمه کلیدی flash و eeprom استفاده نشود به مفهوم ذخیره متغیر در حافظه SRAM می باشد.
شکل 1-10 تقسیم بندی حافظه SRAM داخلی میکروکنترلر ATmega16 را نشان می دهد.


1-9 کلاک سیستم در میکروکنترلرهای AVR
سیستم پالس ساعت (سیکل ماشین) در میکروکنترلرهای AVR بسیار متنوع است بر خلاف میکروکنترلر 8051 که فقط با کرپیستال خارجی کار می کرد میکروکنترلرهای جدید می توانند علاوه بر کریستال خارجی از نوسان ساز داخلی نیز استفاده کنند. در این قسمت می خواهیم سیستم توزیع کلاک و انواع نوسان ساز ها را توضیح دهیم.



شکل 1-10 نقشه حافظه دیتا (RAM)
شکل 1-11 سیستم پالس ساعت را برای قسمت های مختلف درونی نشان می دهد.

شکل 1-11 بلوک دیاگرام کلاک سیستم


همانطور که در شکل 1-11 مشاهده می فرمائید منبع کلاک توسط یک مالتی پلکسر، پالس لازم را به واحد کنترل کننده کلاک اعمال می کند. در واقع کلاک لازم جهت راه اندازی می تواند یکی از نوسان سازها باشد و امکان استفاده همزمان از آنها وجود ندارد.
پالس CLKCPU به هسته(اجزای درونی) CPU و SRAM داخلی اعمال می شود، پالس CLKADC ، کلاک لازم را جهت مبدل آنالوگ به دیجیتال فراهم می کند که توسط قسمت مبدل ADC می تواند بطور مجزا تقسیم گردد، پالس CLKFLASH کلاک لازم را بر ای حافظه Flash و eeprom داخلی فراهم می سازد. پالس CLK/IO برای تولید پالس ماژول های ورودی و خروجی نظیر USART، SPI ، شمارنده و وقفه ها بکار برده می شود.پالس CLKASY برای راه اندازی آسنکرون تایمر یا کانتر دو برای استفاده از فرکانس 32.768MHZ اسیلاتور RTC است همچنین تایمرWatchdog از یک اسیلاتور مجزا داخلی استفاده می کند.


منابع پالس ساعت میکروکنترلرهای AVR


منابع پالس میکروکنترلرهای AVR:


میکروکنترلر دارای انواع منابع کلاک اختیاری است که می توان انواع آنرا بوسیله بیت های قابل برنامه ریزی FLASH (FLASH FUSE BITS) انتخاب کرد. کلاک انتخاب شده به عنوان ورودی کلاک AVR طبق جدول زیر در نظر گرفته شده و کلاک مناسب به هر قسمت سیستم داده می شود.
در تمام جداول مربوط به فیوز بیت ها, 0 به معنای بیت برنامه ریزی شده (PROGRAMMED) و 1 به معنای بیت برنامه ریزی نشده (UNPROGRAMMED) می باشد.


نوسان ساز با کریستال خارجی
برای استفاده از کریستال خارجی،باید فیوز بیت های CKSEL3.0 را طبق جدول 1-16 بصورت “1111” برنامه ریزی کنیم . پایه های خارجی XTAL1 و XTAL2 طبق شکل 1-12 توسط دو خازن عدسی (خازن های بالانس) با مقادیر یکسان به یک کریستال متصل می گردند.

شکل 1-12 نحوه اتصال کریستال خارجی
خازن های C1 و C2 را معمولا 22PF انتخاب می کنیم. وظیفه این خازن حذف نویز الکترومغناطیس اطراف کریستال می باشد که طبق جدول 1-17 با توجه به کریستال استفاده شده تعیین می شوند. در PCB برای حذف نویز ، بدنه کریستال خارجی را به زمین وصل می کنند اما نباید بدنه کریستال حرارت بیند زیرا ممکن است به آن آسیب برسد.


هنگام استفاده از کریستال خارجی می توان با فعال کردن بیت CKOPT دامنه نوسان اسیلاتور را حداکثر کرد. در این حالت اسیلاتور بصورت Rail-to-Rail عمل می کند یعنی اگر تغذیه میکروکنترلر 5 ولت باشد حداکثر دامنه پالس ساعت نیز 5 ولت خواهد بود.
این حالت برای محیط های پر نویز مانند کارخانه های صنعتی بسیار مناسب است . البته فعال کردن این فیوز بیت به اندازه چند میلی آمپر جریان مصرفی میکروکنترلر را افزایش می دهد در میکروکنترلرهای بدون پسوند L اگر بخواهیم از کریستال 16MHZ استفاده کنیم باید فیوز بیت CKOPT فعال گردد در غیر اینصورت حداکثر کریستال خارجی 8MHZ خواهد بود. زمان Start-up برای استفاده از کریستال خارجی توسط فیوز بیت های SUT0 و SUT1 طبق جدول 1-18 تعیین می گردد.منظور از زمان Start-up مدت زمانی است که تغذیه به میکروکنترلر وصل می شود و بعد از مدتی که نوسانات اسیلاتور پایدار شد میکروکنترلر Reset شده و برنامه را اجرا می کند این مدت زمان در حدود چند میلی ثانیه می باشد.



جدول 1-18 انتخاب زمان شروع (Start-UP) در حالت نوسان ساز خارجی


نوسان ساز با کریستال فرکانس پائین
منظور از کریستال فرکانس پائین، کریستال 32.768MHZ می باشد در صورتی که فیوز بیت های CKSEL 3.0 به صورت برنامه ریزی شوند پالس ساعت سیستم از کریستال خارجی فرکانس پایین استفاه می کند. در این حالت اگر فیوز بیت CKOPT فعال شود خازن داخلی بین دو پایه XTAL1 و XTAL2 فعال می گردد و مقدار این خازن 36F است. نحوه استفاده از این نوسان طبق شکل 1-12 می باشد و همچنین زمان Start-up در این حالت طبق جدول 1-19 تعیین میشود.

جدول 1-9 انتخاب زمان شروع در حالت نوسان ساز خارجی فرکانس پایین
نوسان ساز با RC خارجی
از اسیلاتور با RC خارجی در کاربردهایی که به تغییرت زمان و فرکانس حساسیت نداشته باشیم استفاده می کنیم فرکانس این اسیلاتور از رابطه زیر بدست می آید که در آن مقدار خازن حداقل باید انتخاب شود و مقدار مقاومت بین انتخاب می شود.


نوسان ساز با اسیلاتور RC کالیبره شده داخلی
اسیلاتور RC کالیبره شده داخلی می تواند فرکانس های ثابت 1MHZ ، 2MHZ ، 4MHZ و 8MHZ را در شرایط تغذیه +5v و در دمای 25c ایجاد نماید. فرکانس کاری این اسیلاتور به شدت به ولتاژ تغذیه، درجه حرارت محیط و مقدار بایت رجیستر OSSCAL وابسته می باشد.
از آنجایی که این نوع نوسان ساز به دما و ولتاژ وابسته است پیشنهاد می کنیم در موقع استفاده از تبادل سریال USART و دیگر پروتوکل ها و برنامه هایی که به زمان بسیار وابسته هستند از کریستال خارجی استفاده کنید. در تمامی پروژه های این کتاب از کریستال خارجی استفاده شده است که در برخی می توانستیم از اسیلاتور داخلی استفاده کنیم . همچنین لازم به ذکر است که میکروکنترلر ATmega16 به طور پیش فرض از اسیلاتور کالیبره شده داخلی با فرکانس 1MHZ استفاده می کند که شما باید فیوز بیت های CKSEL3.0 را طبق مباحث این بخش تنظیم کنید.
زمانی که اسیلاتور داخلی استفاده می شود نیازی به قرار دادن اسیلاتور خارجی نیست و پایه های XTAL1 و XTAL2 آزاد گذاشته می شود و همچنین در این نوسان ساز، نباید فیوز بیت های CKOPT فعال باشد. مقدار فرکانس این اسیلاتور توسط فیوز بیت های CKSEL3.0 طبق جدول 1-22 تعیین می شود.


رجیستر کالیبراسیون OSCCAL

در صورت استفاده از اسیلاتور RC کالیبره شده داخلی در هر بار که میکروکنترلر Reset می شود مقدار رجیستر OSCCAL، Load می شود و اسیلاتور به طور خودکار تنظیم می گردد. در حالت عادی استفاده از این نوع اسیلاتور 43% خطا دارد اما اگر از شرایط تغذیه +5v و یا دمای 25c خارج گردد ممکن است این خطا به 10% افزایش یابد که با توجه به اینکه برای دسترسی به حافظه Flash و حافظه eeprom از این اسیلاتور می خواهد استفاده شود ممکن است نتایج نامشخصی داشته باشد. با نوشتن مقدار 0Î00 کمترین و با نوشتن مقدار 0xFF در این رجیستر بیشترین فر کانس ممکن انتخاب می گردد. تنظیم دقیق این کالیبراسیون خیلی تضمینی نیست. اما مقدار بایت کالیبراسیون را می توانیم در هر شرایط دمایی طوری تنظیم کنیم که خطا به 1 کاهش یابد.

نوسان ساز با کلاک خارجی


در صورت تنظیم فیوز بیت های CKSEL3.0 به صورت “0000” میکروکنترلر AVR پالس ساعت خود را از یک منبع خارجی که به پایه ورودی تقویت کننده نوسان ساز یعنی XTAL1 اعمال می شود.
آموزش کامل AVR در کانال تلگرامی سایت قرار داده شده است.

مطالب مرتبط

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

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

نشانی ایمیل منتشر نخواهد شد

نویسنده : آدرس سایت : ایمیل :

تعداد 54 دیدگاه برای نوشته " آموزش میکروکنترلر AVR" ارسال شده است .

    فرزین 6 آذر 1392 در 9:38 ق.ظ
  1. سلام..مطالبتون خیلی مفید بود…ممنون

  2. پاسخ
      مدیریت 6 آذر 1392 در 6:35 ب.ظ
    • خواهش میکنم.
      موفق باشید.

    • پاسخ
        رضا 27 اردیبهشت 1393 در 11:17 ق.ظ
      • عالیست عالیست خدا خیرتون بده

      • پاسخ
          مدیریت 27 اردیبهشت 1393 در 12:43 ق.ظ
        • تشکر
          موفق باشید.

      محسن 21 شهریور 1393 در 6:02 ب.ظ
    • بسیار عالی توضیح داده شد فقط یح سئوال دارم اینکه درجایی که ما نیاز به فرکانس بالا داریم مثلا 12Mhz بجای کریستال خارجی 16Mhz از یک میکرو با کریستال داخلی به این میزان استفاده نمود؟

    • پاسخ
        مدیریت 21 شهریور 1393 در 8:21 ب.ظ
      • تشکر
        بله، میکروهای معمولی (AVR) به راحتی فرکانس 32 مگاهرتز (حداکثر) رو تولید می کنند؛ مثل خانواده xmega
        برای تغییر فرکانس هم میتونین Scale اون رو تو برنامه نویسی تغییر بدین و به فرکانس مورد نظر برسین.

      • پاسخ
    yalda 22 بهمن 1392 در 1:22 ب.ظ
  3. سلام
    خیلی خیلی ممنون
    مطالبتون عالی بود
    فقط اگه ممکنه خصوصیات میکرو کنترلر at mega8رو هم بزارین….
    بازم ممنون…

  4. پاسخ
    ابوالفضل 8 خرداد 1393 در 11:00 ق.ظ
  5. خیلی عالی بود

  6. پاسخ
      مدیریت 8 خرداد 1393 در 11:15 ق.ظ
    • تشکر
      موفق باشید.

    • پاسخ
    samira 2 تیر 1393 در 11:36 ق.ظ
  7. سلام مرسی از متنی که گذاشتین خیلی کمکم کرد

  8. پاسخ
      مدیریت 4 تیر 1393 در 10:16 ق.ظ
    • سلام
      خواهش میکنم.
      باعث خوشحالی ماست.
      موفق باشید.

    • پاسخ
    yasin 20 تیر 1393 در 1:52 ب.ظ
  9. واقعا حرف نداشت. خسته نباشید

  10. پاسخ
      مدیریت 20 تیر 1393 در 2:08 ب.ظ
    • تشکر از شما دوست عزیز

    • پاسخ
    محمدوثوقی 16 شهریور 1393 در 6:59 ق.ظ
  11. عالی بود، مرسی

  12. پاسخ
      مدیریت 16 شهریور 1393 در 8:09 ق.ظ
    • خواهش میکنم.
      موفق باشید.

    • پاسخ
    مهرداد 27 شهریور 1393 در 10:04 ب.ظ
  13. با سلام
    خواستم به خاطر گذاشتن این مطلب ازتون تشکر کنم واقعآ مختصر و مفید بود. چند مدته که به دنبال مطالب با ارزش در این مورد بودم که به سایت شما رسیدم و کمک زیادی ازش گرفتم. به امید این که بقیه ی سایت ها هم مثل شما برای وقت مردم ارزش قائل باشند و تا این حد مطالب تبلیغاتی و تو خالی نگذارند. با تشکر

  14. پاسخ
      مدیریت 28 شهریور 1393 در 12:18 ق.ظ
    • سلام
      خواهش میکنم.
      خوشحالیم که تونستیم کمک نچندان بزرگی به شما ارائه دادیم.

    • پاسخ
    مهرداد 31 شهریور 1393 در 5:00 ب.ظ
  15. با سلام خدمت شما دوستان عزیز
    خواستم بابت مطالب مفیدتون تشکر کنم واقعاٌ سایتتون کار من رو راه انداخت.
    به امید روزی که دیگر سایت های فارسی هم برای وقت مردم ارزش قائل باشند و به خاطر کار ها تبلیغاتی و بی محتواشون وقت مردم رو تلف نکنند.
    باز هم صمیمانه از شما سپاسگزارم.

  16. پاسخ
      مدیریت 31 شهریور 1393 در 6:19 ب.ظ
    • سلام
      خواهش میکنم.
      موفقیت شما آرزوی ماست.
      موفق و سربلند باشید.

    • پاسخ
    behzad 16 مهر 1393 در 6:56 ب.ظ
  17. با سلام و تشکر از اطلاعات جامع و مفیدتون
    با آرزوی بهترین ها برای شما
    ببخشید من یک برنامه ساده که یک LED را روشن و خاموش کند پروگرام کردم پس از بستن مدار با قرار دادن رگلاتور ولت و داشتن خروجی 5 ولت رگلاتور ، LED با نور خیلی ضعیف روشن می شود. وقتی پایه خروجی میکرو را کنترل کردم در حالت عادی بدون LED ولتاژ خروجی پایه مناسب و حدود 4.5 ولت می باشد ولی هنگام نصب LED ولتاژ به 1.7 ولت کاهش می یابد که نتیجه آن نور ضعیف LED می باشد ، لطفا اگه امکان دارد راهنمایی کنید چه کاری انجام بدم که نور LED هنگامی که دستور روشن شدن توسط میکرو داده می شود طبیعی گردد . با تشکر

  18. پاسخ
      مدیریت 16 مهر 1393 در 9:16 ب.ظ
    • سلام و تشکر از شما دوست عزیر
      AVR کار میکنین؟

    • پاسخ
        behzad 17 مهر 1393 در 4:51 ب.ظ
      • سلام و تشکر از پیگیری شما
        بله برنامه با کدویژن نوشته و در avr atmega16 پروگرام شده

      • پاسخ
          مدیریت 20 مهر 1393 در 10:55 ق.ظ
        • احتمالا مشکل از رگولاتور هست.

    milad 14 دی 1393 در 7:12 ب.ظ
  19. سلام من یه پروژه دانلود کردم حدود 10 تا کد c داخلش هست چطوری استفادشو ن کنم میتونین راهنماییم کنید؟؟؟؟؟

  20. پاسخ
      مدیریت 14 دی 1393 در 8:21 ب.ظ
    • باید کامپایلشون کنید

    • پاسخ
    hossein 8 بهمن 1393 در 4:38 ق.ظ
  21. با سلام وتشکر از زحمات شما.
    خسته نباشید.خداوند بشما قوت وعوض بدهد. حسین

  22. پاسخ
      مدیریت 8 بهمن 1393 در 9:09 ق.ظ
    • ممنون از شما حسین عزیز

    • پاسخ
    میلاد 19 بهمن 1393 در 2:11 ب.ظ
  23. با سلام خدمت شما

    من موتور DCرا به صورت مستقیم به باتری کتابی وصل کردم و ولتاژ به مرور زمان مثلا 1 دقیقه کاهش پیدا می کنه، من می خواستم یک ولتاژ5 ولت رگولاتور شده داشته باشم که بعدش خروجی آنرا به موتور DC بدم.

    می خواستم بدونم میشه از همون مداری که برای رگولاتور شدن ولتاژ میکروکنتلر پیشنهاد دادید، استفاده کنم یا مدار آن فرق می کند؟

    با تشکر از زحمات شما

  24. پاسخ
    لاچینی 9 اردیبهشت 1394 در 7:05 ب.ظ
  25. با تشکر از مقاله خوب شما.
    بنده مقاله ای در زمینه انتخاب پروگرامر مناسب برای AVR دارم که در صورت موافقت شما در سایت منتشر شود.

    خلاصه مقاله :
    =========
    انتخاب ابزار مناسب برای هر کاری از نکات بسیار مهم برای افراد است. شاید این جمله را بارها شنیده باشید که کار را ابزار انجام میدهد. یکی از مهترین وسایل مورد نیاز برای علاقمندان و متخصصان رشته الکترونیک پروگرامر است. هدف از این مقاله ارائه پارامترهای قابل سنجش و مهم برای انتخاب پروگرامر مناسب است. این مقاله بر مبنای تجربه کار با انواع پروگرامرهای AVR بدست آمده ولی این توضیحات میتواند کمک مناسبی برای خرید پروگرامر سایر قطعات نیز باشد.

    پارامترهای بررسی شده در این مقاله شامل موارد زیر است :

    نوع پورت مورد استفاده در پروگرامر جهت ارتباط با کامپیوتر
    زیف سوکت
    تامین کلاک
    نرم افرار پروگرامر
    روش برنامه ریزی توسط پروگرامر
    سرعت پروگرامر
    امکانات جانبی
    قاب و بدنه
    قیمت

  26. پاسخ
      مدیریت 12 اردیبهشت 1394 در 12:12 ق.ظ
    • بسیار عالی
      ارسال نمایید تا با اسم شما در سایت قرار بگیرد

    • پاسخ
        لاچینی 13 اردیبهشت 1394 در 5:47 ب.ظ
      • با تشکر به آدرس ایمیل سایت ارسال کردم[email protected]
        اگر آدرس ایمیل دیگری مد نظر شما است اطلاع دهید.
        آدرس ایمیل بنده :
        [email protected]

      • پاسخ
          مدیریت 16 اردیبهشت 1394 در 7:45 ق.ظ
        • با تشکر
          در سایت قرار خواهد گرفت
          موفق باشید

    محمد 2 تیر 1394 در 11:05 ق.ظ
  27. با سلام بسیار جالب وخوب توضیح داده بودید ممنون از لطف شما مطالب شما به خصوص در مورد فیوز بیت ها منو از سر درگمی نجات داد

  28. پاسخ
      مدیریت 3 تیر 1394 در 8:29 ق.ظ
    • خوشحالیم که مشکلتون حل شد

    • پاسخ
    م نوروزی 26 تیر 1394 در 6:29 ق.ظ
  29. سلام ضمن تشکر از شما میخواستم بپرسم علت پریدن یا پاک شدن برنامه میکرو کنترلر ها چیست. اگر نیاز باشد من میتوانم بیشتر راجب سوالم توضیح دهم !

  30. پاسخ
      مدیریت 29 تیر 1394 در 1:32 ق.ظ
    • سلام
      بیشتر توضیح دهید.

    • پاسخ
        م نوروزی 31 تیر 1394 در 3:32 ق.ظ
      • سلام دوستان نمی دانم راجب پرس کنترلهای پمپهای آب چقدر اطلاع دارید من کارم در رابطه با نصب پرس کنترل روی پمپ میباشد. این پرس کنترلها بعد چند ماه کارکردن یکسره میشوند. که من پیش چند مهندس الکترونیک بردم نتوانستند تعمییر کنند که نهایتا یکی از مهندسین سخت افزار کار کامپیوتر مشکل یکسره شدن را فهمید و گفت که از میکرو کنترلر مدار داخل پرس میباشد که پاک میشود که با برنامه دادن به میکرو کنترلر (آتمیل) مشکل حل شد ولی پاک شدن همچنان ادامه دارد میخواستم بدانم علت پاک شدن برنامه میکرو کنترلر چیست تا بتوانم از ریست یا پاک شدن آن آگاه بشوم و روش کارم را تغییر دهم با تشکر

      • پاسخ
    م نوروزی 16 مرداد 1394 در 10:09 ق.ظ
  31. سلام ادمین عزیز جواب من را لطفا بدهید. تشکر

  32. پاسخ
      مدیریت 20 مرداد 1394 در 7:05 ق.ظ
    • سلام
      آیا با برنامه دیگری میکرو رو کنترل میکنید؟
      مثل labview
      حجم کد نوشته شده زیاد نیست؟
      پروگرمر درست کار میکنه؟
      از نظر سخت افزاری مدار چک شده؟
      مدل دقیق میکرو؟

    • پاسخ
    هانیه 20 آذر 1394 در 5:50 ب.ظ
  33. سلام.من ی پروگرامر خریدم.موقع وصل به لپ تاپ میکرو رو برعکس توش قرار دادم.الان که درست گذاشتم همش error میده مبنی بر اینکه چیپ رو نمیشناسه.پروگرامرم هاتل جیبی هستش.باید چکار کنم آیا میکروی من سوخته؟

  34. پاسخ
      مدیریت 20 آذر 1394 در 7:56 ب.ظ
    • سلام
      بعیده سوخته باشه
      چه اروری میده
      درایورش رو پاک کنین و دوباره نصب کنبن
      ببینین درست میشه

    • پاسخ
    Ali 14 دی 1394 در 5:27 ب.ظ
  35. با سلام
    ممنون از آموزشهای خوبتون
    من از بعضی از پروژهاتون ایده گرفتم و در کانال تلگرام زیر ارائه کردم
    https://telegram.me/Micro_Controllers

  36. پاسخ
      مدیریت 15 دی 1394 در 9:10 ب.ظ
    • سلام
      لطفا در کانال خود در تمام پست ها در صورتی که از فایل سایت ما استفاده نموده اید، منبع را ذکر نمایید

    • پاسخ
    صفورا ا 4 بهمن 1394 در 7:22 ب.ظ
  37. سلام عالی بود ممنون

  38. پاسخ
      مدیریت 8 بهمن 1394 در 11:41 ق.ظ
    • خواهش میکنم
      موفق باشید

    • پاسخ
    ناشناس 13 تیر 1395 در 5:45 ب.ظ
  39. سلام به شما

    به کمکتون احتیاج دارم

    من یه هدر برد مگا 128 گرفتم اومدم پروگرامش کنم پایه ها رو درست وصل کردم
    من یه کریستال خارجی 16 مگ به میکرو وصل کردم
    نرم افزار میکرو رو شناخت
    میکرو به صورت پیش فرض روی فرکانس 1 مگ تنظیم بود
    و تو نرم افزار IPROG فرکانس رو روی 16 تنظیم کردم ( تو برنامه هم همین طور ) بعدش که اومدم پروگرامش کنم میگه دیگه نمیشناسدش

    حالا نمیدونم چیکار کنم ؟؟؟

  40. پاسخ
      مدیریت 24 تیر 1395 در 12:51 ق.ظ
    • خیلی حالت ممکنه پیش بیاد
      نمیشه نظر قطعی داد
      سیستم شما پورت COM رو شناسایی میکنه؟

    • پاسخ
    مریم 24 مرداد 1395 در 8:35 ق.ظ
  41. سلام
    ممنون از اطلاعات خوبتون..
    یه سوال داشتم.
    میشه لطفا بگید که در atmel چطوری سرفایل timer capture رو مینویسن؟

  42. پاسخ
    سعيد.ف 1 مهر 1395 در 3:21 ق.ظ
  43. سلام.چطوري ٢٠ بيت دينا راازيك پايه ميكرو بأ كلاك١ميكرو ثانيه ارسال كنت

  44. پاسخ
    احمد 24 بهمن 1396 در 8:33 ق.ظ
  45. با سلام
    مطالبتون واقعا عالی بود…ممنون
    ببخشید میتونین منو تو برنامه نویسی attiny13a یکم راهنمایی کنین؟ تا حالا باهاش کار نکردم الان شدیدا لازم دارم… خیلی ممنون

  46. پاسخ
    ایرج چراغی 6 آبان 1397 در 6:29 ب.ظ
  47. با سلام وخسته نباشید. مطالب خیلی خیلی عالی بودند.
    لطفاچند مثال کاربردی و عملی با میکرو کنترل 32 بدهید.

  48. پاسخ
    سید‌علی 11 مهر 1399 در 4:41 ب.ظ
  49. سلام خیلی علی بود ممنون من واقعا به این خیلی نیاز داشتم خدا خیرتون بده و اینکه خیلی خوب توضیح دادید

  50. پاسخ

0

شبکه های اجتماعی

دانشنامه تخصصی مهندسی ایران را در شبکه های اجتماعی دنبال کنید

0 0

عضویت در خبرنامه

برای دریافت آخرین اخبار در زمینه مهندسی شامل نرم افزارها، استانداردها و آموزش ها به سامانه اطلاع رسانی ما بپیوندید.

بدون پرداخت هزینه، تا هر وقت بخواهید.

تست

همکاران ما

گروه مپنا
گروه مپنا
دانشگاه تهران
دانشگاه تهران
سایپا
سایپا
ایران خودرو
ایران خودرو
شرکت ملی نفت ایران
شرکت ملی نفت ایران
ذوب‌آهن اصفهان
ذوب‌آهن اصفهان
فولاد خوزستان
فولاد خوزستان
مشاوره

نیاز به مشاوره دارید؟

 
                    همکاران ما پاسخگو شما خواهند بود.