AVR: برنامه نویسی در محیط AVR Studio. محیط اشکال زدایی یکپارچه AVR Studio از Atmel Avr Studio

برای کار با AVR Studio 4 باید آن را به تنهایی نصب کنید. اگر قبلاً نصب شده است، می توانید از این مرحله رد شوید.

نصب و راه اندازی:
یک دایرکتوری c:/avr/ ایجاد کنید - این جایی است که برنامه های کاری قرار خواهند گرفت.
یک دایرکتوری ایجاد کنید، به عنوان مثال c:/works/ – این جایی است که آثار شما ذخیره می شود.
لازم است میانبرهایی وجود داشته باشد تا مشکلی برای آنها پیش نیاید.

به طور کلی AVRStudio5 وجود دارد، اما AVRStudio4 هنوز کاملاً کافی است.

همه کارها در AVRStudio4 انجام می شود، WinAVR فقط به دلیل کتابخانه AVR-GCC مورد نیاز است (به طوری که می توانید به زبان C بنویسید)
ولی! ابتدا باید WinAVR را نصب کنید، در غیر این صورت کتابخانه AVR-GCC برداشته نخواهد شد.

من فکر می کنم شما آن را در اینجا کشف کنید.
AVR-GCC برای نوشتن به زبان C
اسمبلر Atmel Avr به ترتیب برای اسمبلر.

بهتر است درک MK را از ابتدا شروع کنید. و این به معنای از اسمبلر است، یعنی شما یک اسمبلر Atmel AVR را ایجاد می کنید.

سپس میکروکنترلر Atmega8 را انتخاب کنید.

هنگامی که پروژه ایجاد می شود، یک لوح بزرگ، سفید و خالی وجود خواهد داشت. در اینجا یک کد وجود خواهد داشت.

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

"نظرات" متنی است که کامپایلر هنگام کامپایل از آن عبور می کند.
قبل از شروع نظر باید یک علامت خاص وجود داشته باشد، من از نماد استفاده می کنم. "نقطه ویرگول"، "دبل اسلش" نیز وجود دارد (//)،
در اینجا نمونه هایی از نظرات وجود دارد

/* * یک نظر از این نوع (چند خطی)، * معمولاً برای * اطلاعات همراه * در مورد کد منبع استفاده می شود، i.e. * نام، توسعه دهنده و غیره */ NOP // این نظر عمدتاً برای توضیح هدف یک فرمان یا یک قطعه کد SLEEP استفاده می شود. این کامنت مانند کامنت قبلی می تواند برای توضیح (برای یادداشت ها) در کد استفاده شود

دستورات در هر خط نوشته شده است. آن ها یک فرمان - یک خط.
فرض کنید دستورهایی با دو "پارامتر"، با یک یا بدون هیچ چیز وجود دارد

MOV R16, R17 ; دو پارامتر INC R16 ; یک پارامتر SEI؛ بدون پارامتر

MOV R16, R17 ; سه بایت INC R16; دو بایت SEI ; یک بایت

آیا ارتباط بین اندازه تیم و پارامترها را می بینید؟

هر میکروکنترلر اسمبلر مخصوص به خود را دارد، اگرچه حافظه آنها مشابه است، یعنی. دستور MOV برای MK یک سری در کد ماشین، مثلاً 0x12، و برای یک سری دیگر 0x55 به نظر می رسد.
برای اینکه در حین کامپایل در کد مورد نیاز ما کامپایلر شود باید به کامپایلر بگوییم که برنامه را برای کدام میکروکنترلر می نویسیم.
این معمولاً هنگام ایجاد یک پروژه انتخاب می شود.
به همین دلیل ما میکروکنترلر Atmega8 را انتخاب کردیم.

اما این همه چیز نیست. برای آسان‌تر کردن زندگی ما، AVRStudio4 مجموعه‌ای از ثابت‌ها دارد که چیزی شبیه به «Macroassembler» نامیده می‌شوند.

برای بارگذاری آنها، باید خط را در ابتدای کد وارد کنید

"m8def.inc" // را با استفاده از دستور .include وارد کنید، ما فایل m8def.inc را بارگذاری کردیم؛ و اکنون برای ما آسان تر می شود؛)

در همان ابتدای کد، جدول وقفه قرار می گیرد. در پست دیگری توضیح خواهم داد که چیست و چگونه کار می کند. اما فعلاً اینطور بنویسیم:

RJMP RESET ; بازنشانی Handler RETI. RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 مقایسه Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; USART TX Complete Handler RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; آنالوگ مقایسه کننده RETI; RJMP TWSI ; کنترلر رابط سریال دو سیم RETI; RJMP SPM_RDY ; ذخیره ساز آماده حافظه برنامه

پس از این، خود کد می آید

شروع مجدد: ; نشانه اولیه MAIN: NOP ; نشانگر حلقه اصلی RJMP MAIN

اما یک ویژگی (یا بهتر بگوییم نه یک، بلکه بسیاری) وجود دارد.

برای راحتی نوشتن کد، برای وضوح آن و برای تسهیل انتقال نسبی، نشانگرهایی به ما داده شد، آنها چگونه هستند؟ "RESET:" و "MAIN:" نشانگر هستند؛ نام آنها می تواند تقریباً شامل هر کاراکتر و اعداد لاتین باشد. نشانگرها نمی توانند نام توابع و دستورات را داشته باشند، به عنوان مثال "NOP".
چگونه می توان به آنها رسید؟ دستور RJMP را فرض کنید.

همچنین از Markers می توانیم یک زیربرنامه (رویه) بسازیم که پس از اتمام آن به جایی که از آن فراخوانی شده است برمی گردیم. برای فراخوانی آن، از دستور "RCALL (زیر روال)" استفاده کنید، و برای بازگشت از زیربرنامه (رویه)، باید آن را با دستور "RET" خاتمه دهید. ما باید با کدی مانند این در پایان کار کنیم:

راه اندازی مجدد: اصلی: NOP RCALL PPP1؛ فراخوانی زیربرنامه RJMP MAIN PPP1: NOP RET ; از زیربرنامه خارج شوید

نحوه عملکرد دستور "RCALL"، هنگام فراخوانی، آدرسی که از آن فراخوانی شده است در STACK قرار می گیرد و هنگامی که دستور "RET" فراخوانی می شود، از ثبات "پشته" حذف می شود. STACK باید مقداردهی اولیه شود.

برای اینکه بتوانیم با MK خود کار کنیم، باید آن را مقداردهی اولیه کنیم. زیرا mk، این دستگاه جهانی است، دارای پورت های ورودی/خروجی و دستگاه های جانبی زیادی است. مانند USART، PWM، DAC، ADC و غیره. اولین گام در مقداردهی اولیه میکروکنترلر، نشان دادن ابتدای "پشته" است. ما پس از نشانگر "RESET:" مقدار دهی اولیه را انجام می دهیم.

LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16

اگر دستور .include “m8def.inc” را در ابتدای کد وارد نکرده بودیم، باید آن را به این صورت می نوشتیم:

LDI R16,0x04 OUT SPH,R16 LDI R16,0x5f OUT SPL,R16

تفاوت به نظر من قابل توجه است.

STACK یک حافظه از نوع ذخیره سازی است: (آخرین ورود، اولین خروج).
نوع فروشگاه یک سوپرمارکت نیست، بلکه بوق یک مسلسل است. امیدوارم همه بتوانند تصور کنند که چگونه کارتریج ها در آن بارگذاری می شوند و چگونه از آنجا خارج می شوند.
شما باید به حافظه STACK توجه زیادی داشته باشید، زیرا ... هر اشتباه جزئی در کار با آن می تواند منجر به شکست پشته شود. این موضوع به قدری مهم است که تصمیم گرفتم یک موضوع کامل را به آن اختصاص دهم و در یادداشت جداگانه ای آن را بنویسم.

بنابراین ما کد زیر را دریافت کردیم:

شامل "m8def.inc" RJMP RESET ; بازنشانی Handler RETI. RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 مقایسه Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; USART TX Complete Handler RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; آنالوگ مقایسه کننده RETI; RJMP TWSI ; کنترلر رابط سریال دو سیم RETI; RJMP SPM_RDY ; بازنشانی کنترلر آماده حافظه برنامه: LDI R16، HIGH(RAMEND) OUT SPH، R16 LDI R16، LOW(RAMEND) OUT SPL، R16 RGMP تنظیم مجدد اصلی: NOP ; نشانگر حلقه اصلی RJMP MAIN

در این مرحله می‌توانیم پروژه را کامپایل کرده و برای رفع اشکال اجرا کنیم، اما از آنجایی که کد ما هیچ کاری نمی‌کند، فقط می‌توانیم خطاهای نحوی را در کد شناسایی کنیم.

برای فرآیند صحیح اشکال زدایی، باید شبیه ساز فرکانس کارکرد MK را تنظیم کنید، این کار فقط پس از کامپایل و شروع اشکال زدایی انجام می شود.
این بدان معنی است که ما "Build" را در نوار منو پیدا می کنیم، آن را باز می کنیم و "Build and Run" را می بینیم، پس از آن یک فلش زرد در مقابل دستور اول در لیست کد خود خواهیم دید. اکنون در نوار منو به دنبال «Debug» می‌گردیم و روی «AVR Simulator Options» کلیک می‌کنیم، پنجره زیر باز می‌شود:

که در آن می توانیم MK و فرکانس آن را تغییر دهیم، همچنین در پانل سمت راست، اطلاعاتی در مورد MK خود مشاهده می کنیم: حداکثر فرکانس، ظرفیت حافظه (EEPROM، RAM، FLASH). اکنون دیتاشیت را در Atmega8 در صفحه 203 (لیست عمومی رجیسترها) و 205 (لیست عمومی دستورات) باز کنید و شروع به نوشتن برنامه خود کنید.
و به یاد داشته باشید، از آزمایش با شبیه ساز نترسید، آن را خراب نمی کند!


سلام.

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

همه چیز شرح داده خواهد شد (برای    )، از ابتدا تا انتها، - نصب و تهیه نرم افزار لازم، مونتاژ ساده ترین برنامه نویس گروموف (نترسید، فقط سه دیود و هفت مقاومت وجود دارد)، سیستم عامل MK و کد نوشتن در AVR Studio. کل فرآیند با تصاویر و مثال ها همراه خواهد بود.

اجازه دهید فوراً رزرو کنم: رایانه باید به درگاه COM مجهز باشد (آداپتور USB به COM به خوبی کار نمی کند). اگر رایانه شما چنین کانکتوری در پشت نداشته باشد، احتمالاً روی مادربرد (به شکل پین) است، پس همه چیز را می توان با این "خروج" حل کرد.

افسوس، برای دارندگان لپ تاپ های بدون COM، مقاله فقط مورد توجه آکادمیک است.

بنابراین، بیایید شروع کنیم…

به چه چیزی نیاز خواهید داشت؟

"نرم"


یونی پروف- یک برنامه جهانی برای فلش کردن میکروکنترلرهای مختلف ATmega، ساده و راحت، و مهمتر از همه، با برنامه نویس ما کاملاً کار می کند. نویسنده توسعه دهنده روسی میخائیل نیکولایف است.

البته می توانید MK را از AVR Studio فلش کنید اما برای این کار به یک برنامه نویس مخصوص نیاز دارید. بنابراین، ما کد را در استودیو می نویسیم و فایل های هگز حاصل را با UniProf با استفاده از برنامه نویس خانگی خود فلش می کنیم. علاوه بر این روش فلش فریمور از خط فرمان توضیح داده خواهد شد.

کاربران لینوکس باید از ماشین مجازی یا Wine استفاده کنند. با Wine برای من درست نشد، من اصلاً پورت را نمی بینم و آن را با ماشین مجازی امتحان نکردم.

  در Wine بی عیب و نقص کار می کند (Debian 8.5، wine1.6).

تمامی نرم افزارها رایگان هستند.

"اهن"

ما آزمایشاتی را انجام خواهیم داد آردوینو پرو مینیدارای تراشه ATmega328 فرکانس کوارتز (8/16 مگاهرتز)، و همچنین ولتاژ (3.3/5v)، مهم نیست. (پایین را ببینید)

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

درباره علامت گذاری روی میکروکنترلرها

بعد از نام اعدادی وجود دارد که اغلب میزان حافظه را نشان می دهند.

حرف بعد از اعداد نشان دهنده پارامترهای ولتاژ تغذیه است.

بدون نامه- ولتاژ تغذیه کنترلر در محدوده 4.5-5.5 ولت است.
L- نسخه های کنترل کننده هایی که با کاهش کار می کنند (کم)ولتاژ تغذیه (2.7 - 5.5 ولت).
V- نسخه های کنترل کننده هایی که با ولتاژ تغذیه پایین کار می کنند (1.8-5.5 ولت).
U- نسخه های کنترل کننده هایی که با ولتاژ تغذیه بسیار کم کار می کنند (0.7-5.5 ولت).
پ- نسخه های کم مصرف (حداکثر 100 نانو آمپر در حالت خاموش کردن).
آ- کاهش مصرف جریان، پوشش کل محدوده فرکانس ساعت تمام نسخه ها، ولتاژ تغذیه 1.8-5.5 ولت (در برخی از مدل ها، با حفظ سازگاری کامل با نسخه های قبلی، ویژگی های جدید و رجیسترهای جدید اضافه شده است).

میکروکنترلرها « آ" و نه- آ"معمولاً امضای یکسانی دارند، که باعث ایجاد مشکلاتی می شود، زیرا فیوز بیت ها متفاوت هستند.

مثال ها:

ATmega8- ظرفیت حافظه برنامه 8 کیلوبایت، ولتاژ تغذیه 4.5-5.5 ولت است.
ATmega8L- ظرفیت حافظه برنامه 8 کیلوبایت، ولتاژ تغذیه 2.7-5.5 ولت است.
ATtiny43U- ظرفیت حافظه 4 کیلوبایت، اصلاح - 3، ولتاژ منبع تغذیه - 0.7-5.5 ولت.
ATtiny44A- ظرفیت حافظه 4 کیلوبایت، اصلاح - 4، کاهش مصرف جریان، ولتاژ تغذیه 1.8-5.5 ولت.

این اتفاق می افتد که یک کنترل کننده بدون حرف ممکن است ولتاژ تغذیه کاهش یافته باشد (1.7 یا 1.8 ولت). این باید در دیتاشیت مشخص شود.

ATtiny841- ظرفیت حافظه 8 کیلوبایت، اصلاح - 41، ولتاژ منبع تغذیه - 1.7-5.5 ولت.

بعد از خط فاصله، نسخه میکروکنترلر نشان داده می شود که شامل اعدادی است که حداکثر فرکانس کنترل را نشان می دهد. (در ولتاژ تغذیه مناسب)و از حروفی که گزینه محفظه، محدوده دمای عملیاتی و ویژگی های ساخت را نشان می دهد.

یک یا دو حرف زیر فرکانس نشان دهنده نوع مسکن است:

یونی پروف
نوشتن یک برنامه نیمی از کار است؛ هنوز باید به نحوی آن را در کنترلر بچسبانید. پس بیایید بیشتر به این موضوع توجه کنیم.

اگر آردوینو شما با Blink استاندارد (از کارخانه همراه آن است) بارگذاری شود، خوب است.

بیایید UniProf را راه اندازی کنیم... شاید پنجره زیر ظاهر شود:

این به پورت LPT متصل است، بنابراین فقط کلیک کنید خوب.

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

اگر پورت به درستی انتخاب نشده باشد، پنجره ای ظاهر می شود که از شما می پرسد...

روی OK کلیک کنید و پورت مورد نظر را انتخاب کنید.

اگر MK به طور خودکار شناسایی نشود، پنجره ای با انتخاب دستی ظاهر می شود:

متاسفانه در لیست نیست atmega328، بنابراین ما انتخاب می کنیم مگا 32 (به همان میزان حافظه فلش دارند) و فشار دهید خوب.

پس از این به جای کلمه ناشناخته، کنترلر متصل ظاهر می شود...

32 هزارمقدار حافظه فلش است و 1024 - حجم EEPROM

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

آیا ملاقات کرده اید؟ عالی، حالا می توانیم ادامه دهیم. تیک کادر کنار EEPROM را بردارید و رابط تغییر یافته را مشاهده خواهید کرد:

پس از برداشتن تیک کادر EEPROM، خواندن و نوشتن این ناحیه حافظه انجام نمی شود.

از آنجایی که ما با فایل‌های هگز کار می‌کنیم، «چک‌مارک‌ها» را حذف می‌کنیم عمومیو صندوقچه، و همچنین کادر را علامت بزنید ترمز!، این باعث افزایش زمان خواندن/نوشتن می شود، اما ثبات را افزایش می دهد.

روند سریع نیست، بنابراین باید منتظر بمانید. مربع‌های آبی در زیر می‌خزند و اعداد در گوشه پایین سمت راست شمارش می‌شوند. پاس اول ناحیه PROGRAM را می خواند و دومی EEPROM را می خواند.

من یک آردوینو جدید دارم که یک Blink استاندارد در آن تعبیه شده است (هنگامی که برنامه نویس متصل است، دیود چشمک نمی زند). اگر شما هم همین مورد را دارید، تصویر زیر ظاهر می شود:

در سمت راست می بینیم که چیزی در EEPROM وجود ندارد و در سمت چپ، در PROGRAM، یک برنامه ضبط شده وجود دارد. (همانطور که گفتم، این پلک است). اکنون از فلش رو به پایین برای اسکرول اسلایدر استفاده کنید تا زمانی که داده ها تمام شود...

...حالا تا آخر اسکرول کنید. داده های بیشتری خواهید دید - این بوت لودر آردوینو است.

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

علامت را بردارید EEPROM. ما واقعاً به آن نیاز نداریم، اما مشخص خواهد شد که یک "تیک" وجود دارد ترمز!

حالا بیایید هر چیزی که فریمور است را در کنترلر ذخیره کنیم تا بعد از آزمایشات بتوانیم آن را به حالت اولیه برگردانیم.

دکمه   را فشار دهید و سیستم عامل را ذخیره کنید، آن را چیزی شبیه به - origProMini328.hex. تمام شد، حالا شما یک نسخه پشتیبان دارید.

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

حالا کنترلر را با همان “Blink” که فقط در AVR Studio نوشته شده فلش می کنیم.

این همان چیزی است که کد به نظر می رسد:

#تعریف F_CPU 16000000UL #شامل #عبارتند از #define PIN_PB5 5 // PB5 (Arduino - D13) #define PIN_PB5_PORTB PORTB #define PIN_PB5_DDR DDRB int main(void) (PIN_PB5_DDR = 1<< PIN_PB5; // устанавливаем PIN_PB5 (PB5 (ардуина - D13)) как ВЫХОД while(1) { PIN_PB5_PORT = 1 << PIN_PB5; _delay_ms(300); PIN_PB5_PORT = 0 << PIN_PB5; _delay_ms(300); } return 0; }
اگر از آردوینو با کوارتز 8 مگاهرتز استفاده می کنید، هیچ ایرادی در این کار وجود ندارد، دیود فقط نصف دفعات چشمک می زند.

در اینجا این است که چقدر فضا اشغال می کند:

AVRDude

Uniprof، مانند بسیاری از برنامه های مشابه دیگر، تنها یک افزونه گرافیکی بر روی برنامه AVRDude است. (AVR Downloader-Uploader)، که سپس تمام اقدامات توضیح داده شده در بالا را روی میکروکنترلر انجام می دهد.
از آنجا که AVRDudeرابط گرافیکی خود را ندارد، باید از خط فرمان با آن کار کنید. این ممکن است برای برخی ناخوشایند به نظر برسد، اما دقیقا برعکس است؛ کار کردن از کنسول به سادگی عالی است. راحت، ساده و به هیچ سیستم عاملی متصل نیست، زیرا avrdude احتمالا برای همه چیز وجود دارد. حالا شما این را خواهید دید.

برای کاربران

اوردوددر زنجیره ابزار AVR گنجانده شده است، بنابراین آن را نصب کنید (بعد از نصب AVR Studio)همانطور که در ابتدای مقاله نوشته شده است.

سی دی\
... به ریشه دیسک بروید با.

با وارد کردن دستور:

اگر اینطور است، پس avrdudeآماده رفتن و ادامه دادن

اکنون باید برنامه نویس خود را به فایل پیکربندی اضافه کنیم avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . آن را در برنامه باز کنید Notepad++و بعد از کتیبه "PROGRAMMER DEFINITIONS" این خطوط را اضافه کنید:

شناسه برنامه نویس = "gromov"; desc = "Banging پورت سریال، reset=dtr sck=rts mosi=txd miso=cts"; نوع = سرب تنظیم مجدد = 4; scck = 7; mosi = 3; miso = 8; ;
بیت کوبیدن.

فایل را ذخیره و ببندید؛ دیگر نیازی به آن نیست.

به ترمینال برگردید و دستور بررسی ارتباط بین MK و برنامه نویس را بدهید:

Avrdude -n -c gromov -P com1 -p m328p
ممکن است یک پورت کام متفاوت داشته باشید.

نصب avrdude

Sudo apt نصب avrdude

با وارد کردن دستور:

باید اطلاعات راهنما را ببینید.

اگر اینطور است، پس avrdudeآماده برای کار

پورت را پیکربندی کنید:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshاین کار باید بعد از هر بار راه اندازی مجدد کامپیوتر انجام شود یا آن را به rc.local اضافه کنید.

جایی که /dev/ttyS0 است com1، /dev/ttyS1 - com2و غیره.
در آینده در تیم ها خواهم نوشت /dev/ttyS0، ممکن است داشته باشید /dev/ttyS1و غیره.

برنامه نویس را به فایل پیکربندی اضافه کنید /etc/avrdude.conf

سودو نانو /etc/avrdude.conf

بعد از «تعریف برنامه‌نویس» خطوط زیر را اضافه کنید:

شناسه برنامه نویس = "gromov"; desc = "Banging پورت سریال، reset=dtr sck=rts mosi=txd miso=cts"; type = "serbb"; تنظیم مجدد = 4; scck = 7; mosi = 3; miso = 8; ;
برنامه نویس از فناوری Bit-banging استفاده می کند.

اطمینان حاصل کنید که در هنگام کپی، نقل قول ها فقط نقل قول باقی می مانند، در غیر این صورت ممکن است تغییر کنند (به دلیل تفاوت در رمزگذاری ها) و avrdude فحش می دهد.

ذخیره کنید و فایل را ببندید.

دستور بررسی ارتباط بین MK و برنامه نویس را بدهید:

Sudo avrdude -n -c gromov -P /dev/ttyS0 -p m328p

اگر ارتباطی وجود داشته باشد، پاسخ به این صورت خواهد بود:

اینجاست که تفاوت های بین سیستم عامل ها به پایان می رسد و دستورات تکراری می شوند.

یک آرگومان به دستور اضافه کنید -vیا -v -v (به هر دستوری می توان اضافه کرد)برای نمایش اطلاعات کامل:

Avrdude -n -v -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -n -v -c gromov -P /dev/ttyS0 -p m328p ###Linux###


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

در اینجا اطلاعات بیشتری وجود دارد، مثلاً می توانید ببینید چه فیوزهایی نصب شده است. در اینجا آنها به صورت هگزادسیمال خروجی می شوند (HEX)شماره. به عنوان مثال، hfuse 0xDA، در باینری به این شکل است - . یعنی اینها همان بیت هایی هستند که در رابط های گرافیکی بررسی می شوند.

وقتی با فیوزها سروکار دارید، به یاد داشته باشید که در میکروکنترلرهای ATmega فیوزها معکوس هستند. به این معنا که 0 - این بریوچنو، و 1 - خاموشیوچنو این باعث سردرگمی در ماشین حساب های آنلاین می شود (به زیر مراجعه کنید).

بیایید سیستم عامل را از منطقه بخوانیم فلاش (همان برنامه در uniprof)دستور:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h ###Linux###

در uniprof کد در برنامه نشان داده شد، اما در اینجا در یک فایل نوشته می شود.

سیستم عامل خوانده شده و در فایل نوشته می شود readfl.txt. حرف ساعت (هگز)در پایان نشان می دهد که داده ها باید در قالب هگزادسیمال نوشته شوند. اگر نامه بنویسی ب (دودویی)، در سیستم باینری نوشته خواهد شد و اگر r (خام)، سپس داده ها به شکل "خام" خواهند بود (کریاکوزیابرا).

از اینجا به بعد فرض بر این است که کاربران win در ریشه دیسک قرار دارند با (C:\)و کاربران لینوکس از پوشه اصلی خود کار می کنند، بنابراین فایل ها در آنجا ذخیره می شوند (مگر اینکه طور دیگری مشخص شده باشد). سفت‌افزاری که در MK آپلود می‌شود باید در آنجا قرار داشته باشد.

برای برد، فایل در اینجا C:\readfl.txt و برای لینوکس در /home/user/readfl.txt قرار خواهد گرفت. می توانید این فایل را باز کنید و نگاهی بیندازید.

خواندن EEPROM:

Avrdude -c gromov -P com1 -p m328p -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:r:reader.txt:h ###Linux###

خواندن فلش و eeprom با هم:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###Linux###

پاک کردن کنترلر:

Avrdude -e -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -e -c gromov -P /dev/ttyS0 -p m328p ###Linux###

پین "تنظیم مجدد" را قطع کنید - دیود چشمک نمی زند، برنامه پاک می شود.

بیایید MK را با فایل دانلود شده قبلی فلش کنیم 328test.hex. در ریشه دیسک قرار دارد سی(c:\328test.hex) در ویندوز یا در پوشه اصلی (/home/user/328test.hex) در لینوکس.

Avrdude -c gromov -P com1 -p m328p -U flash:w:328test.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:328test.hex ###Linux###

اکنون اگر "تنظیم مجدد" را خاموش کنید، کنترلر زنده می شود.

توجه داشته باشید. هنگام فلش MK از طریق avrdude، نیازی به پاک کردن کنترلر نیست، برنامه خودش این کار را انجام می دهد. با این حال، اگر پارامتر را مشخص کنید -دی، پس MK به طور خودکار پاک نمی شود.

سیستم عامل EEPROM:

Avrdude -c gromov -P com1 -p m328p -U eeprom:w:eeprom.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:w:eeprom.hex ###Linux###

خواندن همه فیوزها:

Avrdude -c gromov -P com1 -p m328p -U hfuse:r:hfuse.txt:h -U fuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse:r:fuse txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:r:hfuse.txt:h -U fuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse :r:efuse.txt:h ###لینوکس###

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

فقط خواندن فیوز کم:

Avrdude -c gromov -P com1 -p m328p -U fuse:r:lfuse.txt:h ###WIN###
sudo avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###Linux###

فیوز پایین مسئول انتخاب منبع سیگنال ساعت (داخلی، خارجی)، فرکانس آن و توقف قبل از شروع کنترلر پس از اعمال برق به آن است. اکنون مقداری را دارید که در آنجا نوشته شده است - 0xff، که مربوط به کوارتز خارجی از 8 مگاهرتز و بالاتر است.

اکنون یک fuse دیگر را فلش می کنیم که ATmeg شما را از یک ژنراتور داخلی 8 مگاهرتز به کار منتقل می کند.

Avrdude -c gromov -P com1 -p m328p -U fuse:w:0xe2:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U fuse:w:0xe2:m ###Linux###

اگر آردوینو 16 مگاهرتزی دارید، دیود دو برابر کندتر چشمک می زند.
در آینده، هنگام کدنویسی در AVR Studio، می‌توانید فرکانس 8 مگاهرتز را مشخص کنید و کوارتز را از حالت لحیم خارج کنید، در نتیجه دو پین دیجیتال رایگان دیگر در اختیار خود خواهید داشت.

اما بعداً، و حالا بیایید با فلش کردن فیوز قبلی همه چیز را به همان شکلی که بود برگردانیم:

Avrdude -c gromov -P com1 -p m328p -U fuse:w:0xff:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U fuse:w:0xff:m ###Linux###

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

فیوزها را می توان به صورت جداگانه یا با هم چشمک زد:

Avrdude -c gromov -P com1 -p m328p -U hfuse:w:0xda:m -U fuse:w:0xff:m -U fuse:w:0x05:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:w:0xda:m -U fuse:w:0xff:m -U efuse:w:0x05:m ###Linux###
این دستورات نیازی به دادن ندارند. من آنها را برای وضوح ارائه می کنم.

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

اکنون تنها چیزی که باقی می ماند این است که پارامترها را مشخص کنیم avrdudeو می توانید به قسمت پایانی بروید.

-سی گروموف- نوع برنامه نویس یا بهتر است بگوییم نامی که در کانفیگ زیر آن نوشته شده است (avrdude.conf).
-P com1- خب، اینجا همه چیز روشن است.
-p m328p- نوع نامگذاری MK.
-U- بعد از این گزینه ناحیه حافظه نشان داده شده است (فلش، ایپروم، ایکس فیوز)، که هر گونه اقداماتی بر روی آن انجام خواهد شد (r - خواندن، w - نوشتن).
کولون ها به عنوان جداکننده عمل می کنند.

در اینجا، با نام میکروکنترلرها و نام مستعار آنها، برنامه نویسان و گزینه های دیگر.

نام مستعار MK

uc3a0512- AT32UC3A0512
c128- AT90CAN128
c32- AT90CAN32
c64- AT90CAN64
pwm2- AT90PWM2
pwm2b- AT90PWM2B
pwm3- AT90PWM3
pwm316- AT90PWM316
pwm3b- AT90PWM3B
1200 - AT90S1200 (****)
2313 - AT90S2313
2333 - AT90S2333
2343 - AT90S2343 (*)
4414 - AT90S4414
4433 - AT90S4433
4434 - AT90S4434
8515 - AT90S8515
8535 - AT90S8535
usb1286- AT90USB1286
usb1287- AT90USB1287
usb162- AT90USB162
usb646- AT90USB646
usb647- AT90USB647
usb82- AT90USB82
m103- ATmega103
m128- ATmega128
m1280- ATmega1280
m1281- ATmega1281
m1284p- ATmega1284P
m1284rfr2- ATmega1284RFR2
m128rfa1- ATmega128RFA1
m128rfr2- ATmega128RFR2
m16- ATmega16
m161- ATmega161
m162- ATmega162
m163- ATmega163
m164p- ATmega164P
m168- ATmega168
m168p- ATmega168P
m169- ATmega169
m16u2- ATmega16U2
m2560- ATmega2560 (**)
m2561- ATmega2561 (**)
m2564rfr2- ATmega2564RFR2
m256rfr2- ATmega256RFR2
m32- ATmega32
m324p- ATmega324P
m324pa- ATmega324PA
m325- ATmega325
m3250- ATmega3250
m328- ATmega328
m328p- ATmega328P
m329- ATmega329
m3290- ATmega3290
m3290p- ATmega3290P
m329p- ATmega329P
m32u2- ATmega32U2
m32u4- ATmega32U4
m406- ATMEGA406
m48- ATmega48
m48p- ATmega48P
m64- ATmega64
m640- ATmega640
m644- ATmega644
m644p- ATmega644P
m644rfr2- ATmega644RFR2
m645- ATmega645
m6450- ATmega6450
m649- ATmega649
m6490- ATmega6490
m64rfr2- ATmega64RFR2
m8- ATmega8
m8515- ATmega8515
m8535- ATmega8535
m88- ATmega88
m88p- ATmega88P
m8u2- ATmega8U2
t10-ATtiny10
t11- ATtiny11
t12- ATtiny12
t13- ATtiny13
t15-ATtiny15
t1634- ATtiny1634
t20- ATtiny20
t2313- ATtiny2313
t24- ATtiny24
t25- ATtiny25
t26- ATtiny26
t261- ATtiny261
t4- ATtiny4
t40- ATtiny40
t4313-ATtiny4313
t43u- ATtiny43u
t44- ATtiny44
t45- ATtiny45
t461- ATtiny461
t5- ATtiny5
t84- ATtiny84
t85- ATtiny85
t861- ATtiny861
t88- ATtiny88
t9- ATtiny9
x128a1- ATxmega128A1
x128a1d- ATxmega128A1revD
x128a1u- ATxmega128A1U
x128a3- ATxmega128A3
x128a3u- ATxmega128A3U
x128a4- ATxmega128A4
x128a4u- ATxmega128A4U
x128b1- ATxmega128B1
x128b3- ATxmega128B3
x128c3- ATxmega128C3
x128d3- ATxmega128D3
x128d4- ATxmega128D4
x16a4- ATxmega16A4
x16a4u- ATxmega16A4U
x16c4- ATxmega16C4
x16d4- ATxmega16D4
x16e5- ATxmega16E5
x192a1- ATxmega192A1
x192a3- ATxmega192A3
x192a3u- ATxmega192A3U
x192c3- ATxmega192C3
x192d3- ATxmega192D3
x256a1- ATxmega256A1
x256a3- ATxmega256A3
x256a3b- ATxmega256A3B
x256a3bu- ATxmega256A3BU
x256a3u- ATxmega256A3U
x256c3- ATxmega256C3
x256d3- ATxmega256D3
x32a4- ATxmega32A4
x32a4u- ATxmega32A4U
x32c4- ATxmega32C4
x32d4- ATxmega32D4
x32e5- ATxmega32E5
x384c3- ATxmega384C3
x384d3- ATxmega384D3
x64a1- ATxmega64A1
x64a1u- ATxmega64A1U
x64a3- ATxmega64A3
x64a3u- ATxmega64A3U
x64a4- ATxmega64A4
x64a4u- ATxmega64A4U
x64b1- ATxmega64B1
x64b3- ATxmega64B3
x64c3- ATxmega64C3
x64d3- ATxmega64D3
x64d4- ATxmega64D4
x8e5- ATxmega8E5

کاربران لینوکس می توانند از شراب استفاده کنند.

امیدوارم همه چیز را قبلاً نصب کرده باشید، پس بیایید AVR Studio را راه اندازی کنیم...


در اینجا از ما خواسته می شود که یک پروژه جدید ایجاد کنیم یا یک پروژه قدیمی را باز کنیم. کلیک پروژه جدید


انتخاب کنید AVR GCC، از آنجایی که ما در SI خواهیم نوشت و نه در اسمبلر.
ما به پروژه یک نام می دهیم و کادرها را علامت می زنیم.
انتخاب کنید محل (من پوشه AVR را در درایو C:\ ایجاد کردم)پوشه های دارای پروژه به طور خودکار در آنجا ایجاد می شوند.
کلیک بعد


انتخاب کنید شبیه ساز AVR، از آنجایی که ما برنامه نویس خاصی نداریم که امکان اشکال زدایی را فراهم کند و میکروکنترلر ما چنین است ATmega328p.
کلیک پایان.

پس از این دستکاری ها، استودیو آماده کار است.

در سمت چپ مسیرهای پروژه هستند. در مرکز یک ویرایشگر متن است که کد در آن نوشته شده است. در سمت راست رجیسترهای کنترلر قرار دارند. در پایین سمت چپ اطلاعات اشکال زدایی وجود دارد.

از دکمه هایی که ما در حال حاضر به آنها علاقه مندیم -

پروژه را بسازید.
پروژه را بسازید و اشکال زدایی را شروع کنید.
در حال کامپایل کردن فایل.
تمیز کردن.
راه اندازی پروژه پس روی آن کلیک کنید...

در اینجا می توانید نوع MK را تغییر دهید، فرکانس ساعت را تنظیم کنید (ما آن را مستقیماً در کد می نویسیم)، سطح بهینه سازی و همچنین تعیین اینکه چه فایل هایی ایجاد خواهند شد.
برای علاقه روی آیکون های سمت چپ کلیک کنید و کلیک کنید لغو کنید.
من این گزینه ها و گزینه های دیگر را توضیح نمی دهم، اما بعداً پیوندی با توضیحات مناسب ارائه خواهم داد.

حالا کد نوشته شده در ابتدای مقاله را کپی کرده و در ویرایشگر قرار دهید:

فرکانس ساعت را در کد مشخص کردیم زیرا کتابخانه به آن نیاز دارد تاخیر.h.

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

حالا بیایید به راه خود ادامه دهیم C:\AVR\my328\default\، ما در آنجا فایل هگز را که ایجاد کردیم پیدا می کنیم - my328.hexو آن را در کنترلر فلش کنید. چه چیزی فلش شود (avrdude یا uniprof)برای خودت انتخاب کن

در avrdude به این صورت خواهد بود:

Avrdude -c gromov -P com1 -p m328p -U flash:w:\AVR\my328\default\my328.hex ###WIN###
avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:my328.hex ###Linux###

"تنظیم مجدد" را غیرفعال کنید و ببینید که دیود یک بار در ثانیه چشمک می زند. امیدوارم که شما را به سادگی و راحتی خط فرمان متقاعد کرده باشم.

برای تبدیل مجدد آردوینو به آردوینو، یک نسخه پشتیبان دارید.

همانطور که قبلاً در بالا نوشته شده است، من به توضیح کار با AVR Studio نخواهم پرداخت و همچنین در مورد زبان SI درس نخواهم داد. اولاً این برنامه من نبود. (من فقط می خواستم به انتقال از آردوینو به AVR Studio کمک کنم)

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

نسخه های اول

اولین نسخه های این استودیو شامل اسمبلر برای , می توانید آن را از اولین اسمبلی ها استخراج کنید اما بعداً این پروژه کنار گذاشته شد و C AVR به عنوان زبان اصلی انتخاب شد. کامپایلر یک محصول پولی و بسیار جدی IAR بود. می توانید WINAVR رایگان دانلود کنید؛ برای این کار، پس از نصب استودیو باید آن را نصب کنید.

توجه داشته باشید! بهتر است این کار را فقط پس از نصب AVR studio 4 و نسخه های دیگر انجام دهید.

استودیوی AVR 4 (تصویر بالا) برای مدت طولانی نمایش داده شد. بسیاری از توسعه دهندگان میکروکنترلر با این مشکل مواجه شده اند. بعداً IDE به AVR studio 5 ارتقاء یافت. به غیر از رابط، تغییرات خاصی ایجاد نشد و تنها پس از آن شرکت توسعه دهنده محصول را تغییر نام داد و نام آن را به Atmel Studio 6 تغییر داد.

محیط AVR studio 5 از میکروکنترلرهای زیر پشتیبانی می کرد:

  • AVR32;
  • XMEGA.

Atmel Studio 6 تفاوت قابل توجهی با AVR Studio 5 داشت؛ نوآوری های قابل توجه در نسخه عبارت بودند از:

  1. Microsoft Visual Studio 2010 شروع به کار با خانواده AVR کرد.
  2. برجسته سازی نحو بهبود یافته در مقایسه با AVR Studio 5.
  3. نکات اضافه شده و تکمیل خودکار مجموعه ای از دستورات، که روند توسعه را سرعت می بخشد.
  4. به طور کلی، کل عملکرد محیط قابل اعتمادتر شده است.
  5. پشتیبانی از ARM Cortex-M اضافه شده است.
  6. WinAVR دیگر نیازی به نصب جداگانه ندارد؛ GCC بر خلاف نسخه‌های جوان‌تر، اکنون در طی مراحل نصب نصب می‌شود.

در Atmel Studio 6 یک جهش به سمت بهتر شدن برای کاربر برنامه اتفاق افتاد که بر محبوبیت خانواده های Atmel تأثیر گذاشت. با این حال، امکان دستیابی به پشتیبانی کافی از کاراکترهای روسی در مسیرهای فایل وجود نداشت.

نسخه فعلی – Atmel studio 7

محیط توسعه ای که من استفاده کردم Visual Studio Isolated Shell 2015 بود. از یک طرف، این راه حل در ویندوز XP پشتیبانی نمی شود، از طرف دیگر، این اقدامات برای بهبود ظاهر برنامه و عملکرد آن انجام شده است.

شاید مهم ترین اضافه شدن پشتیبانی از آردوینو در Atmel Studio 7 باشد. این بدان معناست که می توانید از مجموعه ای از طرح های ساده به استفاده از تمام توابع C، اشکال زدایی، شبیه ساز MCU و سایر عملکردها بروید. ترکیب آردوینو و Atmel Studio 7 دور جدیدی را در توسعه این پلتفرم یادگیری ساده ایجاد کرد.

مطالعه استودیوی Atmel با آردوینو فرصتی برای حرکت به سمت تسلط کامل و سازنده و آشنایی عمیق تر با قلب آردوینو - میکروکنترلر Atmega - فراهم می کند.

علاوه بر این، از وب سایت Atmel می توانید بسته ای را برای کارکرد و اتصال LCD دانلود کنید. به عنوان نمونه ای برای مسترینگ، می توانید از LCD 1602 استفاده کنید؛ درس های زیادی در اینترنت در مورد آن وجود دارد و توسعه دهنده دارای 16 کاراکتر و 2 خط در صفحه نمایش است.

یادگیری را از کجا شروع کنیم؟

البته باید با خرید یک برنامه نویس شروع کنید. مقرون به صرفه ترین آنها USBASP است. برنامه نویس USBASP در Atmel Studio 7 پشتیبانی نمی شود.


درایورهای برنامه نویس و برنامه AVRdude را دانلود کنید و برای اینکه همه با هم کار کنند، می توانید از طریق خط فرمان از دستور زیر استفاده کنید:

"avrdude -c usbasp -p atmega32 -U flash:w: نام فایل سیستم عامل هگز -U fuse:w:0x6a:m -U hfuse:w:0xff:m"

و با ایجاد یک پروفایل در atmel studio 7 (عنوان – ابزارهای خارجی) پشتیبانی آن را فعال کنید و در آیتم Arguments “-c usbasp -p atmega32 -U flash:w:$(TargetName).hex” و غیره را برای هر کدام وارد کنید. نوع شما از میکروکنترلر استفاده می کنید.

این تنها راه برای اتصال استودیو و برنامه نویس USBASP است. هنگام چشمک زدن مراقب باشید - می توانید به امضای میکروکنترلر آسیب بزنید و فقط با یک برنامه نویس 12 ولت (ولتاژ بالا) قابل بازیابی است.

از چه ادبیاتی برای آموزش استفاده کنم؟

اول از همه، کتابچه راهنمای هر میکروکنترلر را از وب سایت رسمی دانلود کنید. توصیه یک کتاب درسی خاص دشوار است، اما "DI Halt - AVR" وجود دارد. دوره آموزشی" می توانید از آن استفاده کنید - خالق این مطالب یک پزشک، نویسنده مقالات بسیاری در مورد منابع مختلف اینترنتی و به سادگی یک فرد محترم در محافل تخصصی است.

من بیش از یکی دو بار گفته ام که مطالعه MK باید با اسمبلر شروع شود. یک دوره کامل در وب سایت به این اختصاص داده شده است (اگرچه خیلی سازگار نیست، اما به تدریج آن را به یک ظاهر مناسب تبدیل می کنم). بله، دشوار است، نتیجه در روز اول نخواهد بود، اما شما یاد خواهید گرفت که بفهمید در کنترلر خود چه اتفاقی می افتد. شما خواهید دانست که چگونه کار می کند، و مانند یک میمون از منابع دیگران کپی نکنید و سعی کنید بفهمید که چرا ناگهان کار نمی کند. علاوه بر این، برای C بسیار ساده تر است که کد redneck ایجاد کند که در نامناسب ترین لحظه با یک pitchfork بیرون بیاید.

متأسفانه همه خواهان نتیجه فوری هستند. بنابراین تصمیم گرفتم راه دیگری را بروم - یک آموزش در C، اما با نشان دادن لباس زیر او. یک برنامه نویس امبددر خوب همیشه قطعه سخت افزاری خود را محکم با پیچ و مهره نگه می دارد و اجازه نمی دهد یک قدم بدون اجازه بردارد. بنابراین ابتدا کد C وجود خواهد داشت، سپس کامپایلر چه چیزی را تولید کرده و واقعاً چگونه کار می کند :)

از سوی دیگر، نقطه قوت C، قابلیت حمل کد است. البته اگر همه چیز را درست بنویسید. تفکیک الگوریتم های کار و پیاده سازی سخت افزاری آنها در قسمت های مختلف پروژه. سپس، برای انتقال الگوریتم به یک میکروکنترلر دیگر، کافی است فقط لایه رابط را بازنویسی کنید، جایی که همه تماس‌های سخت‌افزاری در آن نوشته شده‌اند، و همه کدهای کار را به همان صورت باقی بگذارید. و البته خوانایی. کد منبع C در نگاه اول راحت تر قابل درک است (اگرچه... برای مثال، برایم مهم نیست که به چه چیزی اشاره کنم - C یا ASM :))، اما اگر همه چیز به درستی نوشته شده باشد. من هم به این نکات توجه خواهم کرد.

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

اولین برنامه C برای AVR

انتخاب کامپایلر و تنظیم محیط
کامپایلرهای C زیادی برای AVR وجود دارد:
اول از همه این IAR AVR C- تقریباً به طور قطع به عنوان بهترین کامپایلر برای AVR شناخته می شود، زیرا خود کنترلر با همکاری نزدیک بین Atmel و متخصصان IAR ایجاد شد. اما شما باید برای همه چیز هزینه کنید. و این کامپایلر نه تنها یک نرم افزار تجاری گران قیمت است، بلکه دارای تنظیمات بسیار زیادی است که برای کامپایل کردن آن به سادگی در آن تلاش زیادی می شود. من واقعاً با او دوستی نداشتم؛ پروژه به دلیل خطاهای عجیب در مرحله پیوند در حال پوسیدگی بود (بعداً متوجه شدم که یک شکاف کج بود).

دوم می آید WinAVR GCC- یک کامپایلر بهینه سازی قدرتمند کاملا متن باز، کراس پلتفرم، به طور کلی، تمام لذت های زندگی. همچنین کاملاً با AVR Studio ادغام می شود و به شما امکان می دهد همان جا اشکال زدایی کنید که بسیار راحت است. در کل من آن را انتخاب کردم.

نیز وجود دارد CodeVision AVR Cیک کامپایلر بسیار محبوب است. به دلیل سادگی اش محبوب شد. شما می توانید یک برنامه کار را در آن تنها در چند دقیقه دریافت کنید - جادوگر کد شروع تا حد زیادی این کار را با حذف استانداردهای اولیه برای انواع چیزها تسهیل می کند. صادقانه بگویم، من به نوعی به آن مشکوک هستم - زمانی که مجبور شدم برنامه ای را که توسط این کامپایلر نوشته شده بود را از بین ببرم، معلوم شد که یک جور آشفتگی است و کد نیست. حجم وحشتناکی از حرکات و عملیات غیر ضروری که منجر به مقدار قابل توجهی کد و عملکرد کند شد. با این حال، ممکن است در DNA شخصی که فریمور اصلی را نوشته است، خطایی وجود داشته باشد. به علاوه او پول می خواهد. نه به اندازه IAR، اما قابل توجه است. و در حالت دمو به شما امکان می دهد بیش از 2 کیلوبایت کد بنویسید.
البته یک شکاف وجود دارد، اما اگر قصد سرقت دارید، یک میلیون است، به معنای IAR :)

نیز وجود دارد Image Craft AVR Cو میکرو سیاز میکروالکترونیک من مجبور نبودم از هیچکدام استفاده کنم، اما S.W.G.بسیار تحسین برانگیز میکرو پاسکالآنها می گویند، یک محیط برنامه نویسی و کتابخانه های فوق العاده راحت. فکر می‌کنم MicroC بدتر نخواهد بود، اما پولی نیز دارد.

همانطور که گفتم من انتخاب کردم WinAVRبه سه دلیل: رایگان است، در AVR Studio ادغام می شود و فقط یک هزار کد آماده برای آن برای همه موارد نوشته شده است.

بنابراین نصب WinAVR را با AVR Studio دانلود کنید. در مرحله بعد، ابتدا استودیو نصب می شود، سپس WinAVR در بالا رول می شود و به صورت یک پلاگین به استودیو متصل می شود. من به شدت توصیه می کنم WinAVR را در یک مسیر کوتاه نصب کنید، چیزی مانند C:\WinAVR، به این ترتیب از مشکلات زیادی در مسیرها جلوگیری می کنید.

ایجاد یک پروژه
بنابراین، استودیو نصب شده است، C پیچ می شود، وقت آن است که سعی کنید چیزی را برنامه ریزی کنید. بیایید با ساده ترین، ساده ترین شروع کنیم. استودیو را راه اندازی کنید، یک پروژه جدید را در آنجا به عنوان کامپایلر AVR GCC انتخاب کنید و نام پروژه را وارد کنید.

یک فیلد کاری با یک فایل *.c خالی باز می شود.

اکنون پیکربندی نمایش مسیرها در نشانک‌های استودیو ضرری ندارد. برای این کار به آدرس زیر بروید:
Menu Tools - Options - General - FileTabs و گزینه "Filename Only" را از لیست کشویی انتخاب کنید. در غیر این صورت، کار غیرممکن خواهد بود - برگه شامل مسیر کامل فایل خواهد بود و بیش از دو یا سه برگه روی صفحه وجود نخواهد داشت.

راه اندازی پروژه
به طور کلی، ایجاد یک فایل make که در آن تمام وابستگی ها توضیح داده شده است، کلاسیک در نظر گرفته می شود. و احتمالاً درست است. اما برای من که با IDE های کاملاً یکپارچه مانند بزرگ شدم uVisionیا AVR Studioاین رویکرد عمیقاً بیگانه است. بنابراین، من آن را به روش خودم انجام خواهم داد، همه چیز با استفاده از استودیو به معنی است.

دکمه را با چرخ دنده فشار دهید.


اینها تنظیمات پروژه شما یا بهتر است بگوییم تنظیمات تولید خودکار یک فایل ساخت هستند. در صفحه اول فقط باید فرکانس عملکرد MK خود را وارد کنید. این به بیت فیوز بستگی دارد، بنابراین ما فرکانس ما را 8000000 هرتز فرض می کنیم.
به خط بهینه سازی نیز توجه کنید. اکنون -Os وجود دارد - این بهینه سازی اندازه است. فعلاً آن را همانطور که هست بگذارید، سپس می توانید سعی کنید با این پارامتر بازی کنید. -O0 اصلا بهینه سازی نیست.

مرحله بعدی پیکربندی مسیرها است. اول از همه، دایرکتوری پروژه خود را در آنجا اضافه کنید - کتابخانه های شخص ثالث را در آنجا اضافه خواهید کرد. مسیر ".\" در لیست ظاهر می شود.

فایل Make ایجاد شده است، می توانید آن را در پوشه پیش فرض پروژه خود نگاه کنید، فقط نگاهی بیندازید و ببینید چه چیزی در آنجا وجود دارد.


فعلاً همین است. همه جا OK را کلیک کنید و به منبع بروید.

فرمول بندی مسئله
یک ورق کاغذ خالی وسوسه انگیز است که ایده ای حیله گرانه را اجرا کند، زیرا پلک زدن پیش پا افتاده یک دیود دیگر کار نمی کند. بیایید فوراً گاو نر را از شاخ بگیریم و اتصال را با رایانه پیاده سازی کنیم - این اولین کاری است که انجام می دهم.

این کار به این صورت خواهد بود:
وقتی یک (کد 0x31) به پورت COM می رسد، دیود را روشن می کنیم و وقتی صفر می رسد (کد 0x30) خاموش می شود. علاوه بر این، همه چیز در وقفه ها انجام می شود و وظیفه پس زمینه چشمک زدن یک دیود دیگر خواهد بود. ساده و معنی دار.

مونتاژ مدار
ما باید ماژول مبدل USB-USART را به پین ​​های USART میکروکنترلر متصل کنیم. برای این کار از دو سیم یک جامپر بردارید و به صورت ضربدری روی پین ها قرار دهید. یعنی Rx کنترلر را به Tx مبدل و Tx مبدل را به Rx کنترلر وصل می کنیم.

در پایان، این نمودار است:


من اتصال پین‌های باقی‌مانده، برق یا تنظیم مجدد را در نظر نمی‌گیرم، این استاندارد است.

کد نوشتن

اجازه دهید فوراً رزرو کنم که به طور خاص به توصیف خود زبان C نپردازم. صرفاً حجم عظیمی از مطالب برای این کار وجود دارد، از "زبان برنامه نویسی C" کلاسیک از K&R گرفته تا کتابچه های راهنمای مختلف.

من یکی از این روش ها را در انبارم پیدا کردم؛ یک بار برای مطالعه این زبان از آن استفاده کردم. همه چیز در آنجا کوتاه، واضح و دقیق است. من به تدریج آن را کنار هم می گذارم و آن را به وب سایت خود می کشانم.

درست است که هنوز همه فصل ها منتقل نشده اند، اما فکر می کنم خیلی طول نکشید.

بعید است که بتوانم آن را بهتر توصیف کنم، بنابراین از دوره آموزشی، به جای توضیح دقیق جزئیات، به سادگی پیوندهای مستقیم به صفحات جداگانه این کتابچه راهنما ارائه خواهم کرد.

افزودن کتابخانه ها
ابتدا کتابخانه ها و هدرهای لازم را با تعاریف اضافه می کنیم. از این گذشته، C یک زبان جهانی است و باید به او توضیح دهیم که به طور خاص با AVR کار می کنیم، بنابراین خط را در کد منبع بنویسید:

1 #عبارتند از

#عبارتند از

این فایل در پوشه قرار دارد WinAVRو شامل توضیحاتی در مورد تمامی رجیسترها و پورت های کنترلر می باشد. علاوه بر این، همه چیز حیله گر است، با اتصال به یک کنترلر خاص، که توسط کامپایلر از طریق انتقال داده می شود. ساختنفایل در پارامتر MCUو بر اساس این متغیر، یک فایل هدر به پروژه شما متصل می شود که آدرس تمام پورت ها و رجیسترهای این کنترلر خاص را شرح می دهد. وای! بدون آن، این امکان نیز وجود دارد، اما پس از آن نمی‌توانید از نام‌های ثبت نمادین مانند SREG یا UDR استفاده کنید و باید آدرس هر یک مانند «0xC1» را به خاطر بسپارید، که باعث سردرد خواهد شد.

خود تیم #عبارتند از<имя файла> به شما امکان می دهد محتویات هر فایل متنی را به پروژه خود اضافه کنید، به عنوان مثال، یک فایل با شرح توابع یا یک قطعه کد دیگر. و برای اینکه دستورالعمل بتواند این فایل را پیدا کند، مسیر پروژه خود را مشخص کردیم (دایرکتوری WinAVR قبلاً به طور پیش فرض در آنجا ثبت شده است).

عملکرد اصلی
یک برنامه C کاملاً از توابع تشکیل شده است. آنها را می توان به هر ترتیب و به روش های مختلف تودرتو کرد و از یکدیگر فراخوانی کرد. هر تابع دارای سه پارامتر مورد نیاز است:

  • مقدار بازگشتی به عنوان مثال است. گناه (x)مقدار سینوس x را برمی گرداند. به طور خلاصه مانند ریاضیات.
  • پارامترهای ارسال شده همان X هستند.
  • بدن عملکرد.

همه مقادیر ارسال شده و برگردانده شده باید بسته به داده ها از نوعی باشند.

هر برنامه C باید حاوی یک تابع باشد اصلیبه عنوان نقطه ورود به برنامه اصلی، در غیر این صورت اصلا C نیست :). با وجود main در کد منبع شخص دیگری از میلیون ها فایل، می توانید درک کنید که این قسمت اصلی برنامه است که همه چیز از آنجا شروع می شود. پس بیایید بپرسیم:

1 2 3 4 5 int main(void) (return 0 ; )

int main(void) (return 0; )

همین است، اولین ساده ترین برنامه نوشته شده است، مهم نیست که کاری انجام نمی دهد، ما تازه شروع کرده ایم.

بیایید بفهمیم چه کردیم.
بین المللیاین نوع داده ای است که تابع اصلی برمی گرداند.

البته در میکروکنترلر اصلیدر اصل هیچ چیز قابل بازگشت نیست و در تئوری باید وجود داشته باشد خالی اصلی (باطل)، اما GCC در اصل برای رایانه شخصی طراحی شده است و در آنجا برنامه می تواند پس از تکمیل مقدار را به سیستم عامل برگرداند. بنابراین GCC روشن است خالی اصلی (باطل)قسم به هشدار.

این یک خطا نیست، کار خواهد کرد، اما هشدارها را دوست ندارم.

خالیاین نوع داده ای است که در این مورد به تابع ارسال می کنیم اصلیبنابراین نمی تواند چیزی را از بیرون بپذیرد خالی- یک ساختگی زمانی که نیازی به ارسال یا بازگرداندن چیزی نباشد از یک خرد استفاده می شود.

آن ها اینجا هستند { } بریس های فرفری یک بلوک برنامه هستند، در این مورد بدنه یک تابع اصلی، کد در آنجا قرار خواهد گرفت.

برگشت- این مقدار بازگشتی است که تابع main پس از تکمیل آن را برمی گرداند، زیرا ما یک int داریم، یعنی یک عدد، پس باید یک عدد را برگردانیم. اگرچه این هنوز منطقی نیست، زیرا ... در میکروکنترلر، ما فقط نمی توانیم از اصلی به جایی برسیم. من پوچ برمی گردم چون مهم نیست. اما کامپایلر معمولا هوشمند است و برای این مورد کد تولید نمی کند.
اگر چه، اگر منحرف، سپس از اصلیشما می توانید به MK بروید - به عنوان مثال، در بخش بوت لودر قرار بگیرید و آن را اجرا کنید، اما برای تصحیح آدرس های انتقال نیاز به دستکاری سطح پایین با سیستم عامل دارد. در زیر خودتان خواهید دید و متوجه خواهید شد که چگونه این کار را انجام دهید. برای چی؟ این یک سوال دیگر است، در 99.999٪ موارد این ضروری نیست :)

این کار را کردیم و ادامه دادیم. بیایید یک متغیر اضافه کنیم، ما واقعاً به آن نیاز نداریم و هیچ فایده ای برای معرفی متغیرها بدون آن وجود ندارد، اما ما در حال یادگیری هستیم. اگر متغیرها در داخل بدنه یک تابع اضافه شوند، آنگاه محلی هستند و فقط در این تابع وجود دارند. هنگامی که از تابع خارج می شوید، این متغیرها حذف می شوند و حافظه رم برای نیازهای مهم تر اختصاص داده می شود. .

1 2 3 4 5 6 int main(void) (char i بدون علامت؛ بازگشت 0؛ )

int main(void) ( char i بدون علامت؛ بازگشت 0؛ )

بدون امضایعنی بدون امضا واقعیت این است که در نمایش باینری، مهم ترین بیت به علامت اختصاص می یابد، به این معنی که عدد +127/-128 در یک بایت (char) قرار می گیرد، اما اگر علامت کنار گذاشته شود، از 0 تا 255. معمولاً علامت لازم نیست. بنابراین بدون امضا.
منفقط یک نام متغیر است. بیشتر نه.

حال باید پورت ها را مقداردهی اولیه کنیم و UART. البته، می توانید کتابخانه را بگیرید و متصل کنید و نوعی UartInit (9600) را فراخوانی کنید. اما پس از آن شما نمی دانید واقعا چه اتفاقی افتاده است.

ما این کار را انجام می دهیم:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void) ( char i بدون علامت؛ #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI(bauddivider) ; UCSRA = 0 ; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( char i بدون علامت؛ #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(bauddivider)؛ UBRRH = HI(bauddivider)؛ UCSRA = 0؛ UCSRB = 1<

ترسناک؟ در واقع، تنها پنج خط آخر کد واقعی وجود دارد. همه چیز، آن #تعريف كردناین یک زبان ماکرو پیش پردازنده است. تقریباً همان موارد در اسمبلی است، اما نحو کمی متفاوت است.

آنها عملیات معمول شما را برای محاسبه ضرایب لازم تسهیل می کنند. در سطر اول به جای آن می گوییم XTALمی توانید با خیال راحت 8000000 را جایگزین کنید، و L- نشانگر نوع، گفتن طولانی فرکانس ساعت پردازنده است. همینطور بادریت- فرکانس انتقال داده از طریق UART.

بوددیوادردر حال حاضر پیچیده تر است، به جای آن عبارت محاسبه شده با استفاده از فرمول دو فرمول قبلی جایگزین می شود.
خوب و L.O.و سلامبایت کم و زیاد از این نتیجه گرفته می شود، زیرا بدیهی است که ممکن است در یک بایت قرار نگیرد. که در سلام X (پارامتر ورودی ماکرو) هشت بار به سمت راست جابه جا می شود و در نتیجه تنها مهم ترین بایت باقی می ماند. و در L.O.با عدد 00FF به صورت بیتی AND انجام می دهیم، در نتیجه فقط بایت کم باقی می ماند.

بنابراین هر کاری که انجام می شود مانند است #تعريف كردنمی توانید با خیال راحت آن را دور بیندازید و اعداد لازم را روی یک ماشین حساب محاسبه کنید و بلافاصله آنها را در خطوط UBBRL = ... وارد کنید. و UBBRH = …..

می توان. ولی! این کار را انجام دهید کاملا غیر ممکن است!

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

سپس همه چیز ساده است:
همه این "UBRRL و Co" ثبت پیکربندی فرستنده UART هستند که با کمک آنها با جهان ارتباط برقرار خواهیم کرد. و اکنون مقادیر مورد نیاز را به آنها اختصاص داده ایم و آنها را روی سرعت و حالت دلخواه قرار می دهیم.

نوع ضبط 1<به معنی زیر است: 1 را بردارید و در جای خود قرار دهید RXENدر بایت RXENاین بیت چهارم ثبت است UCSRB، بنابراین 1<عدد باینری 00010000 را تشکیل می دهد، TXEN- این بیت 3 است و 1< 00001000 خواهد داد. تک "|" به صورت بیتی است یا، بنابراین 00010000 | 00001000 = 00011000. به همین ترتیب، بیت های پیکربندی لازم باقیمانده تنظیم شده و به هیپ عمومی اضافه می شوند. در نتیجه، تعداد جمع آوری شده در UCSRB ثبت می شود. جزئیات بیشتر در دیتاشیت MK در بخش USART توضیح داده شده است. بنابراین اجازه دهید با جزئیات فنی پرت نشویم.

تمام شد، وقت آن است که ببینیم چه اتفاقی افتاده است. روی compilation کلیک کنید و شبیه سازی را شروع کنید (Ctrl+F7).

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

واقعیت این است که در ابتدا، در واقع، در خط UBRRL = LO (bauddivider) قرار داشت. از این گذشته، آنچه ما در تعریف داریم کد نیست، بلکه محاسبات اولیه است، به همین دلیل است که شبیه ساز کمی کسل کننده است. اما حالا او متوجه شد، اولین دستور تکمیل شده است و اگر به درخت بروید نمای ورودی/خروجی، به بخش USART بروید و بایت UBBRL را در آنجا نگاه کنید، خواهید دید که مقدار از قبل وجود دارد! 0x33.

آن را یک قدم جلوتر ببرید. ببینید چگونه محتویات ثبت دیگر تغییر می کند. بنابراین همه آنها را مرور کنید، به این نکته توجه کنید که تمام بیت های نشان داده شده همانطور که به شما گفتم تنظیم شده اند و به طور همزمان برای کل بایت تنظیم شده اند. از بازگشت فراتر نمی رود - برنامه به پایان رسیده است.

افتتاح
حالا شبیه سازی را به صفر برگردانید. آنجا کلیک کنید بازنشانی (Shift+F5). لیست جدا شده را باز کنید، اکنون خواهید دید که در کنترلر چه اتفاقی می افتد. مشاهده -> Disassembler. و نه YYAAAAA!!! مونتاژ کننده!!! وحشت!!! و ضروری است. به طوری که بعداً، وقتی مشکلی پیش می‌آید، در کد احمق نباشید و در انجمن‌ها سؤالات لنگ نپرسید، بلکه بلافاصله وارد جرات شوید و ببینید کجا گیر کرده‌اید. اونجا هیچ چیز ترسناکی نیست

ابتدا تاپ های این سری وجود خواهد داشت:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 00000000 +: 940C002A JMP 0x0000002A پرش +00000002: 940C0034 JMP 0x00000034 پرش +00000004: 940C0034 JMP 0x0000000: JMP 0x0000000 0x00000034 پرش +00000008: 940C0034 JMP 0x00000034 پرش +0000000A: 940C0034 JMP 0x000000034 پرش +00000000C: 00000000C: 00000000C: 94000000C 0000000E: 940C0034 JMP 0x00000034 Jump +00000010: 940C0034 JMP 0x00000034 Jump +00000012: 940C0034 JMP 0x0000000C 0x00000034 پرش +00000016: 940C0034 JMP 0x00000034 پرش +00000018: 940C0034 JMP 0x00000034 پرش +00000001A: 940000001A: 940000001A: 94000001A: 94000000C : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x000000034 JMP 0x000000034 JMP 0x000000034 JMP 0x000000034 0x000000034 پرش +00000001E: 940C0034 JMP 0x0000000034 34 پرش + 00000024: 940C0034 JMP 0x00000034 پرش +00000026: 940C0034 JMP 0x00000034 پرش +00000028: 940C00304 Jump0x0

00000000: 940C002A JMP 0x0000002A پرش +00000002: 940C0034 JMP 0x00000034 پرش +00000004: 940C0034 JMP 0x3000000 0x00000034 Jump +00000008: 940C0034 JMP 0x00000034 Jump +0000000A: 940C0034 JMP 0x000000034 Jump +00000000C: 940C0034 JMP 0x000000034 : 940C0034 JMP 0x00000034 Jump +00000010: 940C0034 JMP 0x00000034 Jump +00000012: 940C0034 JMP 0x000000034 JMP 0x000000034 JMP 0x000000034 پرش +000000034 940C0034 34 پرش +00000016: 940C0034 JMP 0x00000034 پرش +00000018: 940C0034 JMP 0x00000034 پرش +0000001A: 940C00304 Jump +00000034 JMP000C : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x000000034 JMP 0x000000034 JMP 0x000000034 JMP 0x000000034 0x000000034 پرش +00000001E: 940C0034 JMP 0x0000000034 34 پرش + 00000024: 940C0034 JMP 0x00000034 پرش +00000026: 940C0034 JMP 0x00000034 پرش +00000028: 940C00304 Jump0x0

این جدول برداری وقفه است. بعداً به آن باز خواهیم گشت، اما در حال حاضر فقط نگاه کنید و به یاد داشته باشید که وجود دارد. ستون اول آدرس سلول فلش است که دستور در آن قرار دارد، دومی کد دستوری، سومی دستور mnemonic، همان دستورالعمل اسمبلی، سومی عملوندهای دستور است. خب نظر خودکار
بنابراین، اگر نگاه کنید، انتقال های مداوم وجود دارد. و کد دستور JMP چهار بایت است، حاوی آدرس پرش به عقب نوشته شده است - بایت کم در آدرس پایین و کد دستور پرش 940C

0000002B: BE1F OUT 0x3F، R1 خروجی به محل ورودی/خروجی

ثبت این صفر در آدرس 0x3F.اگر به ستون نمای ورودی/خروجی نگاه کنید، خواهید دید که آدرس 0x3F آدرس رجیستر SREG - ثبت پرچم کنترل کننده است. آن ها ما SREG را برای اجرای برنامه در شرایط صفر بازنشانی می کنیم.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F بارگیری فوری +0000002D: E0D4 LDI R29,0x04 بارگیری فوری +0000002E: خروجی BFDE OUT 0x3E,R29 خروجی به مکان ورودی/خروجی +00000002F موقعیت مکانی ورودی/خروجی +00000002F

0000002C: E5CF LDI R28,0x5F بارگیری فوری +0000002D: E0D4 LDI R29,0x04 بارگیری فوری +0000002E: خروجی BFDE OUT 0x3E,R29 خروجی به محل ورودی/خروجی +00000002F موقعیت مکانی ورودی/خروجی +000000002

این در حال بارگیری نشانگر پشته است. شما نمی توانید مستقیماً در رجیسترهای ورودی/خروجی بارگذاری کنید، فقط از طریق یک ثبات میانی. بنابراین، ابتدا LDI به متوسط، و سپس از آنجا OUT به I/O. همچنین در مورد پشته بعداً به شما خواهم گفت. در حال حاضر، بدانید که این یک ناحیه حافظه پویا است که در انتهای RAM آویزان است و آدرس ها و متغیرهای میانی را ذخیره می کند. حالا ما نشان دادیم که پشته ما از کجا شروع می شود.

00000032: 940C0041 JMP 0x00000041 پرش

به انتهای برنامه بروید، و در آنجا ممنوعیت وقفه ها و حلقه زدن محکم روی خود را داریم:

1 2 +00000041: 94F8 CLI وقفه جهانی غیرفعال کردن +00000042: CFFF RJMP PC-0x0000 پرش نسبی

00000041: 94F8 CLI وقفه جهانی غیرفعال کردن +00000042: CFFF RJMP PC-0x0000 پرش نسبی

این در شرایط پیش بینی نشده مانند خروج از عملکرد اصلی است. کنترلر را می توان با بازنشانی سخت افزاری یا به احتمال زیاد با بازنشانی از یک سگ نگهبان از چنین حلقه ای خارج کرد. خوب، یا، همانطور که در بالا گفتم، این را در ویرایشگر هگز تصحیح کنید و به هر جایی که دلمان می‌خواهد بریم. همچنین توجه داشته باشید که دو نوع انتقال وجود دارد: JMP و RJMP؛ اولین انتقال مستقیم به یک آدرس است. چهار بایت را اشغال می کند و می تواند مستقیماً از کل منطقه حافظه پرش کند. نوع دوم انتقال RJMP - نسبی است. دستور او دو بایت طول می کشد، اما او از موقعیت فعلی (آدرس) 1024 قدم به جلو یا عقب حرکت می کند. و پارامترهای آن نشان دهنده افست از نقطه فعلی است. بیشتر استفاده می شود زیرا در یک فلاش نیمی از فضا را اشغال می کند و به ندرت نیاز به انتقال طولانی است.

1 +00000034: 940C0000 JMP 0x00000000 پرش

00000034: 940C0000 JMP 0x00000000 پرش

و این یک پرش به همان ابتدای کد است. یک جورهایی راه اندازی مجدد می توانید بررسی کنید که همه بردارها در اینجا پرش می کنند. نتیجه این است که اگر اکنون وقفه ها را فعال کنید (آنها به طور پیش فرض غیرفعال هستند) و وقفه شما رخ دهد اما کنترل کننده ای وجود نداشته باشد، بازنشانی نرم افزار انجام می شود - برنامه به همان ابتدا بازگردانده می شود.

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

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 بارگیری فوری +00000037: B989 OUT 0x09,R24 خروجی به محل ورودی/خروجی 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 خروجی به محل ورودی/خروجی 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 خروجی به محل ورودی/خروجی 17: UCSRB = 1<

و این اشکال است:

1 2 3 +0000003E: E080 LDI R24.0x00 بارگیری فوری +0000003F: E090 LDI R25.0x00 بارگیری فوری +00000040: 9508 بازگشت زیربرنامه RET

0000003E: E080 LDI R24.0x00 بارگیری فوری +0000003F: E090 LDI R25.0x00 بارگیری فوری +00000040: 9508 بازگشت زیربرنامه RET

سوال اینجاست که چرا کامپایلر چنین تاپ هایی را اضافه می کند؟ و این چیزی بیش از Return 0 نیست، ما تابع را به عنوان int main(void) تعریف کردیم و بنابراین چهار بایت دیگر را بیهوده تلف کردیم :) و اگر void main(void) را ایجاد کنید، فقط RET باقی می ماند، اما یک هشدار ظاهر می شود. ، که تابع اصلی ما چیزی را بر نمی گرداند. در کل هر کاری که دوست داری انجام بده :)

دشوار؟ ظاهرا نه. روی اجرای گام به گام در حالت disassembler کلیک کنید و ببینید پردازنده چگونه دستورالعمل های جداگانه را اجرا می کند، چه اتفاقی برای ثبات ها می افتد. حرکت از طریق دستورات و حلقه نهایی چگونه اتفاق می افتد؟

تا یکی دو روز دیگر ادامه دارد...

آف تاپ:
الکسی 78من یک پلاگین برای فایرفاکس ایجاد کردم که به راحتی می توانید در سایت و انجمن من پیمایش کنید.
بحث و دانلود،

Atmel Studio یک پلت فرم توسعه یکپارچه است که توانایی طراحی و اشکال زدایی برنامه های توسعه یافته برای میکروکنترلرهای Atmel را بر اساس معماری پردازنده های سری ARM Cortex-M فراهم می کند. Atmel Studio یک محیط یکپارچه و با کاربری آسان است که امکان اشکال زدایی و ساخت برنامه های ایجاد شده در C/C++ یا زبان اسمبلی را فراهم می کند. این دارای یک کتابخانه حجیم داخلی از کد منبع کاملا رایگان Atmel Software Framework است که شامل بیش از 1600 پروژه برای معماری های ARM و AVR است. داشتن چنین کتابخانه ای یک امتیاز عالی برای هر برنامه نویسی است. این IDE را می توان برای برنامه ریزی طیف گسترده ای از میکروکنترلرهای مبتنی بر AVR و همچنین میکروکنترلرهای فلش مبتنی بر Atmel SAM3 که از هسته های Cortex-M3، Cortex-M4 استفاده می کنند، استفاده کرد.

Atmel Studio همچنین دارای ابزارهایی است که زندگی هر برنامه نویسی را بسیار آسان می کند. این پلتفرم شامل راه حل هایی مانند Atmel Spaces و Atmel Gallery است. گالری اتمل یک فروشگاه آنلاین ابزارهای توسعه و نرم افزارهای یکپارچه است. Atmel Spaces فضایی مبتنی بر ابر برای توسعه و ذخیره مشترک فایل های پروژه سخت افزاری و نرم افزاری برای میکروکنترلرهای Atmel است.

ویژگی ها و توابع کلیدی

  • یک محیط توسعه یکپارچه کاملا رایگان است.
  • پشتیبانی از زبان های C/C++ و اسمبلر.
  • همراه با مستندات دقیق؛
  • شامل یک کتابخانه گسترده با نمونه های کد منبع برای برنامه های مختلف.
  • طراحی شده برای برنامه نویسی میکروکنترلرهای Atmel.

نیازمندی های ویژه

  • فرکانس ساعت پردازنده 1.6 گیگاهرتز و بالاتر؛
  • برای سیستم های 32 بیتی از 1 گیگابایت رم؛
  • برای سیستم های 64 بیتی از 2 گیگابایت رم؛
  • هنگام اجرا بر روی یک ماشین مجازی، 512 مگابایت رم اضافی توصیه می شود.
  • 6 گیگابایت فضای خالی هارد دیسک.

چه چیزی در این نسخه جدید است؟

7.0.790 (25.02.2016)

  • پشتیبانی اضافه شده برای دیباگر توسعه یافته (EDBG)؛
  • پشتیبانی از پروفایل های تنظیمات رابط اضافه شده است. می توانید با استفاده از کلیدهای موجود در پانل تنظیمات بین پروفایل ها جابجا شوید.
  • امکان وارد کردن کتابخانه ها به پروژه های وارد شده قبلی را اضافه کرد. پشتیبانی از Arduino Zero و Zero Pro اضافه شده است.
  • ساخت موازی اکنون به طور پیش فرض فعال است.
  • سیستم عامل به روز شده برای Xplained Mini.
  • عملکرد "نمایش همه فایل ها" در Solution Explorer رفع شده است.