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

سلام!
من می خواهم نشان دهم که چگونه برنامه ای برای کنترل تجهیزات تکنولوژیکی روی PLC نوشته می شود.
اغلب، من با PLC های تولید شده توسط اشنایدر الکتریک سروکار داشتم. کوانتومی که من برای این کار انتخاب کردم قدرتمندترین و گرانترین PLC این سازنده است. این می تواند تجهیزات را با هزاران سیگنال کنترل کند؛ البته در زندگی واقعی، هیچ کس از آن برای چراغ راهنمایی استفاده نمی کند.

من هرگز درگیر خودکارسازی چراغ های راهنمایی نبودم، بنابراین خودم الگوریتم را پیدا کردم. او اینجاست:
1. چراغ راهنمایی برای گذرگاه عابر پیاده قابل تنظیم. آن ها یک چراغ راهنمایی برای خودروها، یک چراغ راهنمایی برای عابران پیاده و یک دکمه برای عابران پیاده که با فشار دادن آن، عابر پیاده تمایل به عبور از جاده را اعلام می کند.
2. پس از شروع برنامه، چراغ سبز برای خودروها و قرمز برای عابران پیاده روشن می شود.
3. هنگامی که دکمه توسط یک عابر پیاده فشار داده می شود، سبز برای وسایل نقلیه چشمک می زند، سپس زرد و سپس قرمز. پس از آن، چراغ سبز برای عابران پیاده روشن می شود، پس از مدت زمان مشخصی شروع به چشمک زدن می کند، چراغ قرمز برای عابران پیاده، پس از آن چراغ های زرد و قرمز برای خودروها روشن می شود، سپس سبز می شود.
4. در مدت زمان مشخصی پس از چراغ سبز در چراغ راهنمایی عابر پیاده، فشار دادن دکمه توسط عابر پیاده، الگوریتم انتقال را شروع نمی کند. الگوریتم انتقال در این مورد تنها پس از سپری شدن زمان مشخص شده شروع می شود.
برنامه نویسی PLC در محیط برنامه نویسی Unity به زبان های استاندارد IEC 61131-3 انجام می شود. این استاندارد شامل 5 زبان است. به عنوان مثال، من زبان بلوک های تابع - FBD را انتخاب کردم.
در اینجا مرورگر پروژه در یونیتی است:

پیکربندی PLC:


PLC از یک پانل نصب، یک منبع تغذیه (1)، یک کنترلر (2)، یک ماژول ورودی گسسته برای 32 سیگنال 24 ولت DC (4)، یک ماژول ورودی گسسته برای 32 سیگنال 24 ولت DC (5) تشکیل شده است. در یک پروژه واقعی، می‌توان ده‌ها پانل نصب را از طریق شبکه‌های مختلف به یک کنترل‌کننده متصل کرد و صدها ماژول ورودی/خروجی را در اختیار داشت.
ایجاد متغیرهایی از انواع مورد نیاز در ویرایشگر متغیر:


متغیرهای متصل به کانال های ماژول I/O دارای آدرسی هستند که نشان می دهد سیگنال به کدام سطل، ماژول و کانال متصل است.
این برنامه شامل بخش هایی است که هر چرخه اسکن کنترلر به ترتیب اجرا می شود.
ساده شده، چرخه اسکن کنترلر به صورت زیر است:
1. خواندن سیگنال های ورودی از ماژول ورودی به متغیرهای دارای آدرس.
2. اجرای بخش ها.
3. نوشتن مقادیر از متغیرها با آدرس به سیگنال های خروجی ماژول های خروجی.
4. به مرحله 1 بروید.
یک بخش ساعت با یک مولد پالس با دوره زمانی 0.5 ثانیه ایجاد کنید. بلوک TP، هنگامی که سیگنال ورودی از 0 به 1 تغییر می کند، یک پالس با مدت زمان معین را در خروجی خروجی می دهد.


در اینجا و پایین، اسکرین شات های بخش ها در حالت انیمیشن نشان داده می شوند، نه در حالت ویرایش. آنها هنگام اتصال به PLC با یک برنامه بارگذاری شده، مقادیر متغیرها را در زمان فعلی نمایش می دهند (اعداد برای متغیرهای عددی، رنگ سبز (1) - قرمز (0) برای بولی).
بخش Main منطق اصلی را مدیریت می کند.
بلوک SR وقتی S1=1 خروجی را روی 1 تنظیم می کند و زمانی که R=1 خروجی را روی 0 تنظیم می کند.
بلوک R_TRIG خروجی را برای 1 سیکل اسکن روی 1 تنظیم می کند که ورودی از 0 به 1 تغییر کند (ردیاب لبه بالارونده).
بلوک F_TRIG خروجی را برای 1 سیکل اسکن روی 1 تنظیم می کند که ورودی از 1 به 0 تغییر کند (ردیاب لبه عقب).
متغیر inButton محدود به کانال دکمه در بخش با inButtonForTest جایگزین شده است تا بتوان مقدار آن را در شبیه ساز کنترلر بدون سخت افزار واقعی تغییر داد.


بخش Outputs سیگنال های خروجی را برای کنترل چراغ های راهنمایی تولید می کند.


بارگذاری پروژه در شبیه ساز کنترلر:


مقدار هر متغیری را می توان در جدول انیمیشن مشاهده کرد:


اما برای راحتی اشکال زدایی، می توانید یک صفحه نمایش اپراتور با گرافیک ساده بسازید که انیمیشن آن به متغیرها گره خورده است:

بیایید سعی کنیم از جاده عبور کنیم:

من انتظار نداشتم که برای کنترل یک شی ساده مانند چراغ راهنمایی به 30 بلوک نیاز باشد.
در مقاله بعدی نحوه نوشتن این برنامه را با استفاده از تمام زبان های IEC 61131-3 به طور همزمان به شما نشان خواهم داد.

UPD یک خطا در نام استاندارد تصحیح شد.

(شکل ها)، (پانل).

قبل از ایجاد یک برنامه، باید توضیحات اجزای جدید را مرور کنید.

وظیفه.شبیه سازی چراغ راهنمایی هنگام شروع پروژه، تابلوی چراغ راهنمایی باید خالی باشد. پس از فشار دادن دکمه Start، لامپ های راهنمایی شروع به تغییر می کنند. بعد از زدن دکمه Stop دوباره تابلوی چراغ راهنمایی خالی می شود. با استفاده از یک تایمر، مطمئن شوید که علائم راهنمایی و رانندگی در فواصل زمانی معین تغییر می کند. فاصله تایمر را در قسمت Speed ​​وارد کنید.

پیشرفت پروژه

1. یک پروژه جدید ایجاد کنید. آن را در یک پوشه جداگانه ذخیره کنید، نام آن را "Traffic Light" بگذارید.

2. یک پانل (TPanel) با سه شکل (TShape)، دو دکمه (TButton)، یک فیلد متنی (TEdit)، یک نوشته (TLabel)، یک تایمر (TTimer) مطابق نمونه روی فرم قرار دهید:

می بایست شبیه به این باشه:

2. ساخت طرح:

مقادیر مشخصه داده شده را در بازرس شی تنظیم کنید:

مولفه ویژگی معنی
فرم 1 عنوان چراغ های راهنمایی و رانندگی
پانل 1 عنوان *خالی*
شکل 1 شکل stCircle
شکل 2 شکل stCircle
شکل 3 شکل stCircle
برچسب 1 عنوان سرعت
ویرایش 1 متن *جای خالی*
دکمه 1 عنوان شروع کنید
دکمه 2 عنوان متوقف کردن

3. یک رویداد برای Form1 در قسمت OnCreate ایجاد می کنیم - بیضی را فشار دهید

یک رویداد برای Timer1 در بخش OnTimer ایجاد کنید - بیضی را فشار دهید

4. رنگ ها را برای اشکال تنظیم کنید:

کار نهایی:

5. در حالی که فرم در حال بارگیری است، تایمر غیرفعال است، اشکال روی پانل نامرئی می شوند.

یک کنترلر رویداد برای رویداد FormCreate ایجاد کنید (روی مؤلفه Form1 دوبار کلیک کنید) و این کد را جایگذاری کنید:

vark:integer; روش TForm1.FormCreate(فرستنده: TObject); start Timer1.Enabled:=false; Shape1.Visible:=false; Shape2.Visible:=false; Shape3.Visible:=false; پایان؛

6. برای تعویض لامپ های راهنمایی، کد برنامه را در کنترل کننده رویداد Timer1Timer بنویسید. این کد در فاصله زمانی که کاربر در قسمت Speed ​​وارد می کند اجرا می شود. با توجه به تایمر، تعداد لامپی که باید در لحظه روشن شود مشخص می شود.

روی کامپوننت Timer1 دوبار کلیک کنید و این کد را قرار دهید:

6. کد دکمه شروع را بنویسید. با کلیک بر روی دکمه، فاصله زمانی تایمر از قسمت Speed ​​خوانده می شود، قرائت های تایمر روی صفر تنظیم می شود و تایمر روشن می شود.

روی کامپوننت Button1 دوبار کلیک کنید و کد را در آن قرار دهید:

رویه TForm1.Button1Click(فرستنده: TObject); start Timer1.Interval:=StrToInt(Edit1.text); k:=0; Timer1.Enabled:=true; پایان؛

7. کد برنامه را برای دکمه Stop بنویسید. پس از کلیک بر روی دکمه، تایمر باید خاموش شود، لامپ های چراغ راهنمایی دوباره نامرئی می شوند.

روی کامپوننت Button2 دوبار کلیک کنید و کد را در آن قرار دهید:

روش TForm1.Button2Click(فرستنده: TObject); start Timer1.Enabled:=false; Shape1.Visible:=false; Shape2.Visible:=false; Shape3.Visible:=false; پایان؛

8. پروژه را اجرا کنید. در قسمت Speed ​​عدد 1000 (1000ms=1s) را وارد کنید. چراغ های راهنمایی در فواصل یک ثانیه شروع به تغییر می کنند.

آرتم پوزنیاک، دانش آموز کلاس 10 "الف"، دبیرستان شماره 23، Ekibasbuz

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

هر کسی که با میکروکنترلرهای برنامه نویسی سر و کار دارد، اصول اولیه نوشتن کنترل کننده های وقفه را می داند: زمان اجرای کوتاه و کد کوتاه تا حد امکان، بدون حلقه و تماس از کنترل کننده به سایر زیر روال ها و غیره. در این مورد، وقفه ها فقط برای تغییر سطح مجاز هستند (ما نمی توانیم از وقفه های دیگر بگذریم، زیرا آنها به سادگی وجود ندارند)، و من برای ساده کردن برنامه و درک آن، امکان انحراف از این اصول را یافتم. در اینجا در کنترل کننده وقفه، حلقه ها، و فراخوانی به زیربرنامه دیگری، و (وحشتناک!) حتی انتقال به حالت SLEEP وجود دارد. بنابراین، در عنوان برنامه "اشتباه" نامیده می شود. در این حالت، از کنترل کننده وقفه به عنوان یک زیربرنامه معمولی استفاده می شود، اما در سایر موارد، البته اصول فوق به قوت خود باقی است.

مشخصات مختصر دستگاه:

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

بنابراین، اجازه دهید به شرح و بررسی مدار برویم.

مدار بر روی یک میکروکنترلر ارزان قیمت PIC12F629 مونتاژ شده است. خروجی های GP0-GP2، GP4، GP5 (پایه های 7، b، 5، 3، 2) که به عنوان خروجی برنامه ریزی شده اند، مستقیماً برای کنترل LED ها استفاده می شوند. LED ها در هر جهت به صورت سری دسته بندی می شوند تا مصرف جریان را به حداقل برسانند. مقاومت R3-R8 جریان LED را محدود می کند. در صورت تفاوت شدید در خروجی LED های رنگ های مختلف، باید مقاومت های مناسب را انتخاب کنید. به عنوان مثال، من دو گروه زرد دارم که به صورت موازی وصل شده اند و به همان مقاومت وصل شده اند و همان مقدار بقیه هستند و حتی کمی بیشتر از بقیه می درخشند (بازده بیشتر است).

در این مدار، LED ها با 1.5 ولت بیشتر از میکروکنترلر از یک عنصر اضافی تامین می شوند (در این حالت، هنگامی که خروجی خاموش می شود، جریان به خروجی ریز مدار نمی رسد، زیرا ولتاژ بسیار بیشتری برای انتقال دو ال ای دی بیش از 1.5 ولت (حداقل 2.5 درجه سانتیگراد) را باز کنید و حتی با شکستن هر دو LED (که بعید است)، جریان عبوری از دیود محافظ داخلی به مثبت منبع تغذیه حدود 7.5 میلی آمپر خواهد بود که بسیار کمتر از حد مجاز مصرف جریان ال ای دی ها بسیار بیشتر از مصرف MK است بنابراین می توان از تفاوت دبی المان ها (از طریق یکی جریان مصرفی MC جریان نمی یابد) چشم پوشی کرد. به طور تجربی ثابت شده است که، با وجود کاهش جریان از طریق LED ها هنگام تخلیه باتری، روشنایی درخشش آنها در سطح قابل قبولی در کل محدوده ولتاژ باتری باقی می ماند. مدار بسیار ساده شده است و تثبیت کننده ولتاژ وجود ندارد. که جریان اضافی را مصرف می کند، که امکان رها کردن کلید برق را فراهم می کند (مصرف جریان در حالت خواب - 1-3 متر kA).

دکمه کنترل حالت های عملکرد دستگاه به پین ​​GP3 (پایه 4) متصل است که به عنوان ورودی دیجیتال در بیت های پیکربندی اعلام می شود. هنگامی که دکمه فشار داده می شود، یک وقفه رخ می دهد که در کنترل کننده آن موارد زیر رخ می دهد. هنگامی که برای مدت طولانی (بیش از 4 ثانیه) فشار داده شود، دستگاه وارد حالت خواب می شود. با فشارهای کوتاه تر، سرعت چراغ راهنمایی به صورت متوالی در یک دایره با نشان دادن سرعت فعلی مطابق شکل تغییر می کند.

در آخرین حالت (ال ای دی های قرمز روشن هستند)، حالت سیگنال چشمک زن زرد فعال می شود. هنگامی که دکمه برای مدت طولانی فشار داده می شود (با خاموش شدن همه LED ها تأیید می شود)، با تغییر حالت به حالت جدید، به عملکرد عادی تغییر می کنیم، اما اگر دکمه بیش از 6 ثانیه فشار داده نشود، حالت کار باقی می ماند. مانند قبل از فشار دادن دکمه.

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

توضیحات کوچکی برای برنامه که در ضمیمه آمده است.

پردازش فشار دکمه ها در زیر روال ها انجام می شود: wait_butt__ - انتظار برای فشار دادن و ثبت 6 ثانیه. بدون فشار دادن، push_butt__ - ثبت مدت زمان فشار دادن، wait_nobutt__ - منتظر یک دکمه فشرده نشده است. در لحظه تغییر وضعیت چراغ راهنمایی (زرد و سبز چشمک زن)، مقادیر روی درگاه خروجی از جدول زیر روال tact__ خوانده می شود (نیبله های کم یا زیاد). به طور مشابه، نشانگر وضعیت هنگامی که یک دکمه فشار داده می شود از زیر روال ind__ است. برای وارد شدن به حالت خواب پس از سپری شدن زمان اجرا، یک انتقال اجباری به روال کنترل کننده وقفه با تنظیم برنامه ای پرچم وقفه رخ می دهد. با تغییر ثابت‌های CONST_MIN، CONST_REG، CONST_SL، می‌توانید به ترتیب دوره سبز چشمک زدن، حالت اولیه هنگام اتصال باتری، زمان کار بدون تأثیر قبل از تغییر به حالت SLEEP را تغییر دهید.

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

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

کلمه پیکربندی به طور خودکار در هنگام بارگیری سیستم عامل وارد حافظه می شود (پرنده فقط در مورد "PWRT" تنظیم می شود، بقیه موارد "بازنشانی" هستند، ستون "نوسانگر" روی "intOSC GP4" تنظیم می شود. ). ابتدا باید سفت‌افزار را از یک ریزمدار خالی بخوانید و مقدار کلمه را در انتهای حافظه برنامه در آدرس 03FF بنویسید، که برای تنظیم فرکانس نوسان‌گر داخلی یک نمونه ریز مدار خاص لازم است. پس از بارگذاری فایل HEX در برنامه، باید این مقدار را به صورت دستی در آدرس 03FF وارد کنید. در این دستگاه، انحراف فرکانس حیاتی نیست، اما باید بدانید که چنین رویه‌ای برای این میکرو مدار لازم است. در موارد شدید، اگر مقدار کارخانه از بین برود، نمی توانید کاری انجام دهید - برنامه اقداماتی را برای درست کار کردن در این مورد نیز انجام داده است.

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

این برنامه شامل: یک مدل، یک برد مدار چاپی با فرمت LAY، یک برنامه اسمبلر MPASM، یک فایل سیستم عامل HEX است.

فهرست عناصر رادیویی

تعیین تایپ کنید فرقه تعداد توجه داشته باشیدخرید کنیددفترچه یادداشت من
IC1 MK PIC 8 بیتی

PIC12F629

1 DIP به دفترچه یادداشت
R1 مقاومت

3 کیلو اهم

1 0.125 وات به دفترچه یادداشت
R2 مقاومت

100 اهم

1 0.125 وات به دفترچه یادداشت
R3-R8 مقاومت

200 اهم

6 0.125 وات به دفترچه یادداشت
HL1، HL2، HL9، HL10 دیود ساطع نور

AL307A

4 قرمز به دفترچه یادداشت
HL3، HL4، HL11، HL12 دیود ساطع نور

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

هر کسی که با میکروکنترلرهای برنامه نویسی سر و کار دارد، اصول اولیه نوشتن کنترل کننده های وقفه را می داند: زمان اجرای کوتاه و کد کوتاه تا حد امکان، بدون حلقه و تماس از کنترل کننده به سایر زیر روال ها و غیره. در این مورد، وقفه ها فقط برای تغییر سطح مجاز هستند (ما نمی توانیم از وقفه های دیگر بگذریم، زیرا آنها به سادگی وجود ندارند)، و من برای ساده کردن برنامه و درک آن، امکان انحراف از این اصول را یافتم. در اینجا در کنترل کننده وقفه، حلقه ها، و فراخوانی به زیربرنامه دیگری، و (وحشتناک!) حتی انتقال به حالت SLEEP وجود دارد. بنابراین، در عنوان برنامه "اشتباه" نامیده می شود. در این حالت، از کنترل کننده وقفه به عنوان یک زیربرنامه معمولی استفاده می شود، اما در سایر موارد، البته اصول فوق به قوت خود باقی است.

مشخصات مختصر دستگاه:

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

بنابراین، بیایید به شرح و بررسی طرح بپردازیم:

مدار بر روی یک میکروکنترلر ارزان قیمت مونتاژ می شود. خروجی های GP0-GP2، GP4، GP5 (پایه های 7، b، 5، 3، 2) که به عنوان خروجی برنامه ریزی شده اند، مستقیماً برای کنترل LED ها استفاده می شوند. LED ها در هر جهت به صورت سری دسته بندی می شوند تا مصرف جریان را به حداقل برسانند. مقاومت R3-R8 جریان LED را محدود می کند. در صورت تفاوت شدید در خروجی LED های رنگ های مختلف، باید مقاومت های مناسب را انتخاب کنید. به عنوان مثال، من دو گروه زرد دارم که به صورت موازی وصل شده اند و به همان مقاومت وصل شده اند و همان مقدار بقیه هستند و حتی کمی بیشتر از بقیه می درخشند (بازده بیشتر است).

در این مدار، LED ها با 1.5 ولت بیشتر از میکروکنترلر از یک عنصر اضافی تامین می شوند (در این حالت، هنگامی که خروجی خاموش می شود، جریان به خروجی ریز مدار نمی رسد، زیرا ولتاژ بسیار بیشتری مورد نیاز است تا انتقال دو ال ای دی بیش از 1.5 ولت (حداقل 2.5 درجه سانتیگراد) را باز کنید و حتی با شکستن هر دو LED (که بعید است)، جریان عبوری از دیود محافظ داخلی به مثبت منبع تغذیه حدود 7.5 میلی آمپر خواهد بود که بسیار کمتر از حد مجاز مصرف جریان ال ای دی ها بسیار بیشتر از مصرف MK است بنابراین می توان از تفاوت دبی المان ها (از طریق یکی جریان مصرفی MC جریان نمی یابد) چشم پوشی کرد. به طور تجربی ثابت شده است که، با وجود کاهش جریان از طریق LED ها هنگام تخلیه باتری، روشنایی درخشش آنها در سطح قابل قبولی در کل محدوده ولتاژ باتری باقی می ماند. مدار بسیار ساده شده است و تثبیت کننده ولتاژ وجود ندارد. که جریان اضافی را مصرف می کند، که امکان رها کردن کلید برق را فراهم می کند (مصرف جریان در حالت خواب - 1-3 متر kA).

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

در آخرین حالت (ال ای دی های قرمز روشن هستند)، حالت سیگنال چشمک زن زرد فعال می شود. هنگامی که دکمه برای مدت طولانی فشار داده می شود (با خاموش شدن همه LED ها تأیید می شود)، با تغییر حالت به حالت جدید، به عملکرد عادی تغییر می کنیم، اما اگر دکمه بیش از 6 ثانیه فشار داده نشود، حالت کار باقی می ماند. مانند قبل از فشار دادن دکمه.

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

توضیح مختصری در مورد برنامه که در ضمیمه آمده است:

پردازش فشار دکمه ها در زیر روال ها انجام می شود: wait_butt__ - انتظار برای فشار دادن و ثبت 6 ثانیه. بدون فشار دادن، push_butt__ - ثبت مدت زمان فشار دادن، wait_nobutt__ - منتظر یک دکمه فشرده نشده است. در لحظه تغییر وضعیت چراغ راهنمایی (زرد و سبز چشمک زن)، مقادیر روی درگاه خروجی از جدول زیر روال tact__ خوانده می شود (نیبله های کم یا زیاد). به طور مشابه، نشانگر وضعیت هنگامی که یک دکمه فشار داده می شود از زیر روال ind__ است. برای وارد شدن به حالت خواب پس از سپری شدن زمان اجرا، یک انتقال اجباری به روال کنترل کننده وقفه با تنظیم برنامه ای پرچم وقفه رخ می دهد. با تغییر ثابت‌های CONST_MIN، CONST_REG، CONST_SL، می‌توانید به ترتیب دوره سبز چشمک زدن، حالت اولیه هنگام اتصال باتری، زمان کار بدون تأثیر قبل از تغییر به حالت SLEEP را تغییر دهید.

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

تمام مقاومت ها 0.125 وات هستند. شما می توانید هر LED داخلی یا وارداتی، ترجیحا از همان نوع را با افت ولتاژ مستقیم در جریان 10 میلی آمپر، حدود 2 ولت، بگیرید. دکمه - هر بدون تثبیت. میکروکنترلر روی بلوک نصب شده است.

کلمه پیکربندی به طور خودکار در هنگام بارگیری سیستم عامل وارد حافظه می شود (در IC-Prog، یک "bird" فقط در مورد "PWRT" تنظیم می شود، بقیه موارد "reset"، "intOSC GP4" در ستون "نوسانگر"). ابتدا باید سفت‌افزار را از یک ریزمدار خالی بخوانید و مقدار کلمه را در انتهای حافظه برنامه در آدرس 03FF بنویسید، که برای تنظیم فرکانس نوسان‌گر داخلی یک نمونه ریز مدار خاص لازم است. پس از بارگذاری فایل HEX در برنامه، باید این مقدار را به صورت دستی در آدرس 03FF وارد کنید. در این دستگاه، انحراف فرکانس حیاتی نیست، اما باید بدانید که چنین رویه‌ای برای این میکرو مدار لازم است. در موارد شدید، اگر مقدار کارخانه از بین برود، نمی توانید کاری انجام دهید - برنامه اقداماتی را برای درست کار کردن در این مورد نیز انجام داده است.

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

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

IDE برای اسمبلر

سوال اول این است: در چه محیط توسعه ای در اسمبلر برنامه ریزی می کنید؟ پاسخ روشن است - MASM32. این برنامه استانداردی است که برای این PL استفاده می شود. می‌توانید آن را در وب‌سایت رسمی masm32.com به‌عنوان آرشیو دانلود کنید، که باید آن را باز کنید و سپس نصب‌کننده install.exe را اجرا کنید. به عنوان یک جایگزین، می توانید از FASM استفاده کنید، اما کد آن به طور قابل توجهی متفاوت خواهد بود.

قبل از کار، نکته اصلی این است که فراموش نکنید که خط را به متغیر سیستم PATH اضافه کنید:

C:\masm32\bin

برنامه سلام دنیا در اسمبلر

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

386 .model flat، stdcall گزینه casemap: none lib/kernel32.lib .data msg_title db "Title"، 0 msg_message db "Hello world"، 0 .code start: invoke MessageBox, 0, addr msg_mssage invok_message invoke, MB_message OK, , 0 پایان شروع

ابتدا ویرایشگر qeditor.exe را در پوشه ای با MASM32 نصب شده راه اندازی می کنیم و کد برنامه را در آن می نویسیم. پس از اینکه آن را به عنوان یک فایل با پسوند ".asm" ذخیره می کنیم و برنامه را با استفاده از آیتم منو "Project" → "Build all" می سازیم. اگر هیچ خطایی در کد وجود نداشته باشد، برنامه با موفقیت کامپایل می شود و در خروجی یک فایل exe آماده دریافت می کنیم که یک پنجره ویندوز با کتیبه "Hello world" را نشان می دهد.

اضافه کردن دو عدد روی اسمبلر

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

486 .model flat, stdcall گزینه casemap: none lib/kernel32.lib شامل /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov ebx, -9ebx add test eax، eax jz zero invoke MessageBox، 0، chr$("In eax 0 نیست!")، chr$("Info")، 0 jmp lexit zero: invoke MessageBox، 0، chr$("در eax 0!" ), chr$("اطلاعات")، 0 lexit: فراخوانی ExitProcess، 0 پایان شروع

در اینجا ما از برچسب ها و دستورات خاص با استفاده از آنها (jz, jmp, test) استفاده می کنیم. بیایید نگاه دقیق تری بیندازیم:

  • تست - برای مقایسه منطقی متغیرها (عملوندها) در قالب بایت، کلمات یا دو کلمه استفاده می شود. برای مقایسه، دستور از ضرب منطقی استفاده می کند و به بیت ها نگاه می کند: اگر آنها برابر با 1 باشند، بیت نتیجه برابر با 1 خواهد بود، در غیر این صورت - 0. اگر 0 دریافت کردیم، پرچم ها با ZF تنظیم می شوند ( پرچم صفر)، که برابر با 1 خواهد بود. نتایج بیشتر بر اساس ZF تجزیه و تحلیل می شوند.
  • jnz - اگر پرچم ZF در جایی تنظیم نشده باشد، پرش به این برچسب انجام می شود. اغلب این دستور در صورتی استفاده می شود که برنامه عملیات مقایسه ای داشته باشد که به نحوی بر نتیجه ZF تأثیر بگذارد. اینها فقط شامل تست و cmp هستند.
  • jz - اگر پرچم ZF هنوز تنظیم شده بود، برچسب پرش می شود.
  • jmp - صرف نظر از اینکه ZF وجود دارد یا خیر، یک پرش روی برچسب انجام می شود.

برنامه جمع آوری اسمبلر

یک برنامه ابتدایی که روند جمع دو متغیر را نشان می دهد:

486 .model flat، stdcall گزینه casemap: none lib/kernel32.lib شامل /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h buffer8 DBd ?) قالب db "%d"، 0 شروع کد: MOV AL، A ADD AL، B فراخوانی wsprintf، بافر addr، فرمت addr، MessageBox فراخوانی eax، 0، بافر addr، addr msg_title، MB_OK فراخوانی ExitProcess، 0 شروع پایان

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

دریافت مقدار از خط فرمان در اسمبلر

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

486 .model flat، stdcall گزینه casemap: none lib/kernel32.lib شامل /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: call GetCommandLine ; نتیجه در eax push قرار می گیرد 0 push chr$("خط فرمان") push eax ; ما متن را برای خروجی از eax push 0 call می گیریم MessageBox push 0 call ExitProcess پایان شروع

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

486 .model flat، stdcall گزینه casemap: none lib/kernel32.lib شامل /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: call GetCommandLine ; نتیجه در eax invoke GetCommandLine Invoke MessageBox، 0، eax، chr$("خط فرمان")، 0 فراخوانی ExitProcess، 0 فشار 0 فراخوانی ExitProcess پایان شروع قرار می گیرد.

Invoke در اینجا استفاده می شود - یک ماکرو ویژه که کد برنامه را ساده می کند. در زمان کامپایل، دستورات ماکرو به دستورالعمل های اسمبلی تبدیل می شوند. به هر حال، ما از پشته استفاده می کنیم - یک روش ابتدایی برای ذخیره داده ها، اما در عین حال بسیار راحت. طبق قرارداد، stdcall، در تمام توابع WinAPI، متغیرها فقط به ترتیب معکوس از پشته عبور داده می شوند و در ثبات eax مربوطه قرار می گیرند.

حلقه ها در اسمبلر

مورد استفاده:

داده msg_title db "Title", 0 A DB 1h buffer db 128 dup(?) format db "%d",0 .code start: mov AL, A REPEAT inc AL .UTIL AL==7 فراخوانی wsprintf, addr buffer, فرمت addr، جعبه پیام فراخوانی AL، 0، بافر addr، msg_title addr، MB_OK فراخوانی ExitProcess، 0 پایان شروع .data msg_title db "Title"، 0 buffer db 128 dup(?) format db "%d"،0 .code start: mov eax, 1 mov edx, 1 .WHILE edx==1 inc eax .IF eax==7 .BREAK .ENDIF .ENDW فراخوانی wsprintf, adr buffer, addr format, MessageBox invoke eax, 0, addr buffer, addr msg_title, MB_OK فراخوانی ExitProcess، 0

دستور تکرار برای ایجاد یک حلقه استفاده می شود. علاوه بر این، با استفاده از inc، مقدار متغیر بدون توجه به اینکه در RAM یا در خود پردازنده باشد، 1 افزایش می یابد. برای قطع کردن حلقه، از دستورالعمل ".BREAK" استفاده می شود. هم می تواند چرخه را متوقف کند و هم بعد از "مکث" به عمل خود ادامه دهد. همچنین می توانید اجرای کد برنامه را قطع کرده و با استفاده از دستور ".CONTINUE" وضعیت تکرار و while را بررسی کنید.

مجموع عناصر آرایه در اسمبلر

در اینجا ما مقادیر متغیرهای آرایه را با استفاده از یک حلقه "for" جمع می کنیم:

486 .model flat، stdcall گزینه casemap: none lib/kernel32.lib شامل /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h, 2, x d 3,4,5,6,7, 8,9,10,11 n dd 12 بافر db 128 dup(?) قالب db "%d",0 .code start: mov eax, 0 mov ecx, n mov ebx, 0 L: اضافه کردن eax، x افزودن ebx، نوع x dec ecx cmp ecx، 0 jne L فراخوانی wsprintf، بافر addr، فرمت addr، MessageBox فراخوانی eax، 0، بافر addr، addr msg_title، MB_OK فراخوانی ExitProcess، 0 شروع پایان

دستور dec، مانند inc، مقدار عملوند را تنها در جهت مخالف، یک عدد به -1 تغییر می دهد. اما cmp متغیرها را با استفاده از روش تفریق مقایسه می‌کند: یک مقدار را از مقدار دوم کم می‌کند و بسته به نتیجه، پرچم‌های مناسب را تعیین می‌کند.

دستور jne بر اساس نتیجه مقایسه متغیر به یک برچسب می پرد. اگر منفی باشد، انتقال رخ می دهد و اگر عملوندها با هم برابر نباشند، انتقال انجام نمی شود.

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

تعداد بازدید پست: 767