زنگ.

کسانی هستند که این خبر را قبل از شما خوانده اند.
مشترک شدن برای دریافت مقالات تازه.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید
بدون هرزنامه
  • منتقل کردن

به تازگی به نظر می رسد که "شمع های ارزان قیمت" به نظر می رسد در همه جا. من بر آنها اضافه نکردم توجه ویژهتا زمانی که اشاره کرد که در واقع LED ویژه در آنها استفاده می شود - با یک کنترل کننده ساخته شده در "چشمک زدن" ساخته شده است. در حال حاضر چیزی کاملا متفاوت است: چه کسی LED های مرموز را دوست ندارد؟ نیم ساعت بعد من قبلا از LED های تولید چینی به ثمر رسانده بودم.

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

دستگاه نسبتا ساده است. مورد استاندارد 5-میلی متر حاوی یک کریستال LED و یک تراشه است که کمی بیشتر از اندازه اول است. مدار کنترل کننده هر دو با نتیجه مثبت و منفی متصل می شود. آند از رهبری به جهنده سوم به آن متصل است، در حالی که کاتد "نشسته" بر روی خروجی منفی است.

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


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


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


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

کنجکاو است که فرکانس سیگنال حدود 440 هرتز است، مانند Chateneton استاندارد ( یادداشت اول اکتاو - تقریبا ترجمه کردن ) اتفاقی؟ یا توسعه دهنده به سادگی ژنراتور را از نوعی طرح موسیقی گرفت؟ بنابراین برخی از حقیقت در داستان های "موزیکال" این LED ها وجود دارد. هر "قاب" روشنایی ثابت دقیقا 32 برابر است و حدود 72 میلی ثانیه طول می کشد. این مربوط به فریم های 13-14 در ثانیه است.

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


برنامه روشنایی، بسته به زمان، منجر به برخی از افکار می شود: تغییرات در روشنایی تصادفی، گسسته هستند و توزیع ناهموار دارند. به نظر می رسد که 16 سطح روشنایی وجود دارد، پایین تر از 4 که از آن به ندرت استفاده می شود. این تنها به 13 مورد از 3600 نمونه مربوط می شود.


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

چگونه می توان این را در سطح سخت افزاری اجرا کرد؟ این احتمال وجود دارد که ژنراتور به صورت یکنواخت اعداد تصادفی توزیع شده، که از طریق یک تابع فرمول ساده منتقل می شود استفاده می شود. برای توزیع که ما مشاهده می کنیم حداقل 12x2 \u003d 24 سطح گسسته مورد نیاز است. نیمی از آنها در یک نمایش داده می شود. این بسیار کنجکاو است، زیرا ژنراتور به احتمال زیاد اعداد باینری صادر می شود. منطقی ترین تخلیه تعدادی از 5 بیت است، و این 32 ایالت است. نمایش یک مقدار تصادفی گسسته 32 سطح در 24 سطح بدون تغییر توزیع، نه به همان اندازه ساده به نظر می رسد. فراموش نکنید که این یک طرح بحرانی نیست و توسعه دهنده احتمالا زمان زیادی را در یک راه حل زیبا نداشت. بنابراین، او ساده ترین، نوع هک را اعمال کرد.

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

پیاده سازی در ANSI-C می تواند اینگونه باشد:
تلاش های Char \u003d 0؛ char out؛ در حالی که (تلاش ++ 15) خارج \u003d 15؛ // نیمه بالای دامنه مربوط به حداکثر روشنایی است

شما می توانید ببینید که چقدر تلاش می کنید؟ با توجه به آمار، به اشتراک بگذارید a \u003d 0.25 تمام اعداد باید پرتاب شوند و دوباره تولید شوند. احتمال این که n. تلاش ها شماره "صحیح" را انتخاب نخواهند کرد یک N..
n \u003d 1 0.25 n \u003d 2 0،0625 n \u003d 3 0،015625 n \u003d 4 0.003906

نسبت سطح روشنایی غیر طبیعی کم است 13/3600=0,0036 چه چیزی با گزینه همخوانی دارد n \u003d 4. به این ترتیب، max_attempts \u003d\u003d 4..

توجه داشته باشید که بیشتر تصمیم ساده اگر یک شماره نامعتبر برآورده شود، از مقدار از مقدار قبلی استفاده می شود. این گزینه را می توان بر اساس autocorrelations حذف کرد (نگاه کنید به زیر). ساده ترین، احتمالا، راه حل تغییر طرح Phim است - در اینجا استفاده نشده است.

آخرین قطعه پازل، ژنراتور شماره تصادفی است. یک روش معمول برای تولید توالی های تصادفی در مدارهای دیجیتال، استفاده از ثبت های برشی با بازخورد خطی است. چنین ثبت نامی یک توالی گنجانده شده شبه تصادفی دارد که بعد از آن تکرار نخواهد شد 2 x -1. ساعت ها، جایی که ایکس. - تخلیه ثبت نام یکی از ویژگی های چنین توالی ها (و توالی های شبه تصادفی خوب به عنوان یک کل) این است که عملکرد خودکار همبستگی آنها برابر تنها در نقطه 0 و مختصات، طول چندگانه توالی است. در تمام فواصل دیگر، صفر است.


من همبستگی کامل کل دنباله ای را محاسبه کردم. خود شباهت به 3500 فریم یافت نشد (گراف بالا تنها 1200 را نشان می دهد)، یعنی منحصر به فرد بودن سوسو زدن حداقل 4 دقیقه. مشخص نیست که آیا تکرار بیشتر دنباله مشاهده شد، یا تجزیه و تحلیل منطقی نویسنده به سادگی اجازه نمی داد ضبط طولانی تر - تقریبا ترجمه کردن از آنجا که هر فریم نیاز به حداقل 5 بیت داده های تصادفی دارد (و با توجه به مکانیزم دور انداختن اعداد ناخواسته - حتی بیشتر)، توالی شبه تصادفی دارای طول حداقل 17،500 بیت است. این نیاز به ثبت نام تخلیه حداقل 17 یا یک ژنراتور سخت افزاری واقعی از اعداد تصادفی دارد. در هر صورت، جالب است که توجه به توسعه داده شد که فیلم فلیکر تکرار شد.

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

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

مکمل: من در نهایت زمان برای نوشتن شبیه ساز پیدا کردم. نوشته شده در برنامه ANSI-C تقلید رفتار این LED،

ما اولین برنامه را بنویسیم!

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

الگوریتم، (به نمایندگی از طرف فارسی ریاضیات AL-Khorezmi) - مجموعه ای دقیق از دستورالعمل توصیف روش برای اقدامات پیمانکار برای رسیدن به نتایج حاصل از حل مشکل برای یک زمان خاص.
برای به درستی نوشتن برنامه ها، شما باید بدانید که چگونه میکروکنترلر کار می کند، که ما انجام خواهیم داد، اما هنوز اولین برنامه را در مونتاژ قرار می دهیم.

به طور کلی، شما می توانید یک برنامه را در هر یک بنویسید ویرایشگر متندرست همانطور که یک نامه به یک دوست بنویسید، به عنوان مثال. پس از آن، متن باید کامپایل شود (گاهی اوقات آنها می گویند - مونتاژ شده) I.E. ترجمه به شکل، پردازنده قابل فهم. پیش از این، فرمت فایل text.txt تغییر نام V.ASM و پردازش شد برنامه ویژه، کامپایلر نامیده می شود. ماهیت کار کامپایلر، ترجمه کاراکترهای نوشته شده است که برای انسان ها در کد دستگاه (در کد و واحد های Zerule) روشن است و یک فایل جدید را با فرمت ایجاد می کند. هگزا

چه باید بکنید. فایل HEX؟ و آن را برای برنامه نویس برای ضبط کد برنامه در ROM (دستگاه ذخیره سازی ثابت) از میکروکنترلر مورد نیاز است. ما از برنامه به جای برنامه نویس استفاده خواهیم کرد Proteusکه مدار کار واقعی را مدولاسیون می کند.
که در AVR Studio 5. سردبیر، کامپایلر، اشکال زدایی و برنامه نویس همه در یک بطری!

دستورالعمل - این نسخه از سردبیر است که ما کار خواهیم کرد. در بیشتر موارد، نام این دستورالعمل و عملکرد آن در ویراستاران مختلف همخوانی دارد. به عنوان مثال، اگر شما ویرایشگر را مقایسه کنید MPLAB IDE برای pic microcontrollers، پس از آن عملا تفاوت وجود دارد!
اما تیم ها متمایز هستند. لیست دستورات توسط سازنده تشکیل شده است و تا حدودی به تکنولوژی تولید بستگی دارد. حتی یک تولید کننده در خانواده های مختلف ممکن است فهرستی از تیم های مختلفی داشته باشد، زیرا آنها ساختار آنها را تغییر می دهند.
تیم- این یک عملکرد واحد است که ما می توانیم میکروکنترلر را کنترل کنیم.
برنامه- این یک دنباله ای از دستورات مربوط به یک الگوریتم خاص است (کامپایل شده توسط ما).
هر برنامه با "کلاه" آغاز می شود، جایی که توابع اساسی برنامه تجویز می شوند، نویسنده آن، نام کنترل کننده، که از آن استفاده می شود، فرکانس ساعت و سایر داده ها استفاده می شود. "CAP" یک "قانون تون خوب" در برنامه نویسی است.
معمولا فایل اولیه سازی در "CAP" تجویز می شود .includehxhxdef.inc. Directive.Device، .List، .nolist، و دیگران.
که در AVR Studio 5. این دستورالعمل ها به طور پیش فرض تجویز می شود. که در نسخه پیشین AVR Studio 4. این دستورالعمل ها مورد نیاز برای تجویز، بنابراین من آنها را به شکل نظرات ترک کردم.
نظرات به صورت دلخواه به عنوان دوست دارید و مهمتر از همه به طوری که آنها برای شما دست نخورده باقی می ماند. اغلب، با توجه به نظرات ناقص، پس از یک دوره زمانی خاص، نویسنده خود را نمی توان درک کرد برنامه. قبل از نظرات نشانه گذاری (؛).
من یک "کلاه" را پیشنهاد دادم که توسط جان مورتون پیشنهاد شده است ...

ویرایشگر AVR Studio 5 - درک نوشته شده، دستورالعمل ها و تیم های برجسته آنها را در آبی، داده های عددی باقی می ماند سیاه و سفید، عبارات غیر قابل درک برجسته قرمز، نظرات در سبز.

قبل از شروع، چیزی را بنویسید تا دستورالعمل های اسمبلر را در نظر بگیرید microcontrollers AVR.
قبل از هر دستورالعمل یک نقطه است:
توصیف دستورالعمل. Back Back Bytes در RAM.CSEG Segment.db تعریف بایت - ثابت در حافظه فلش یا EEPROM .DEF یک نام نمادین را تعیین می کند در حافظه فلش و یا EEPROM .endm پایان Macro.Endmacro پایان macro.equ نصب دائمی file.include بیان .Seg بخش EEPROM .Exit خروج به سرمایه گذاری file.list یکی دیگر از فعال کردن آگهی ListMac نسل فعال کردن ماکروها macro.nolist لیست Listing.macro شروع خاموش کردن نسل Listing.org تنظیم موقعیت در مجموعه segment.set برای بیان معادل متغیر

توضیحات کامل تیم ها و دستورالعمل های اسمبلر در ترجمه روسی روسلانا Shimkevich شما می توانید اینجا را ببینید:
🕗 24/09/11 ⚖️ 397،28 کیلو بایت ⇣ 244 سلام، خواننده! نام من ایگور است، من 45 ساله هستم، من یک ایمیل سیبری و مشتاق هستم. من اختراع کردم، ایجاد شده و شامل این سایت فوق العاده از سال 2006.
برای بیش از 10 سال، مجله ما فقط به بودجه من وجود دارد.

خوب هالیوا به پایان رسید. شما می خواهید فایل ها و مقالات مفید - به من کمک کنید!

--
از توجه شما سپاسگزارم!

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

--
از توجه شما سپاسگزارم!
ایگور کوتوف، سردبیر مجله "Datgorod"


شما فقط نیاز به باز کردن و شروع آن دارید (ارائه شده است Proteusدر حال حاضر نصب شده است)
چنین تصویری باید وجود داشته باشد:

شروع کردن AVR Studio 5.و در ویرایشگر ما یک برنامه کوچک با نظرات دقیق بنویسیم:
.def temp \u003d r16؛ اختصاص Directive.Def ثبت نام R16 TEMP. \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d؛ شروع program.cseg؛ دستورالعمل CSEG شروع بخش را تعریف می کند، جایی که آن را قرار می دهد؛ کد اصلی برنامه در Avr Studio 5، این یک دستورالعمل نیست؛ اجباری .org 0؛ آغاز اولین ردیف برنامه RJMP؛ انتقال نسبی به برچسب شروع (در Pic Commands؛ Goto Command)؛ \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d شروع: SER TEMP؛ تمام بیت های ثبت شده Temp را در 1 از DDRB، Temp تنظیم می کند؛ تمام بیت ها را از DDRD ترجمه می کند؛ پورت B و D به خروجی TEMP CLR؛ بازنشانی Temp Register (تنظیم تمام بیت های ثبت شده Temp را در 0) از PARTB، TEMP؛ مقاومت در برابر مقاومت را از بین می برد، Temp؛ بنادر B و D CICLE: LDI TEMP، 0B11001100؛ شامل PORTB، LED های TEMP؛ بندر B RJMP CCLE؛ بازگشت به برچسب Cicle، Looped

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


این فایل پیش فرض در اسناد من، در پروژه AVR Studio 5 ارسال شده است.

برو به ب Proteus، بر روی طراحی کنترلر کلیک کنید و مسیر را وارد کنید. فایل HEX:




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



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

بیایید سعی کنیم بفهمیم، با برنامه:

خط:
.def temp \u003d r16؛ Directive.def اختصاص به ثبت نام R16 نام Temp
برای راحتی، ما نام Temp را به ثبت نام R16 اختصاص دادیم، به این معنی که در هر مکان از برنامه، هنگام نوشتن یک سرعت کلمه، برنامه به ثبت نام R16 دسترسی پیدا خواهد کرد.
این ثبت نام - R16 چیست؟
او به ثبت نام اشاره می کند همه منظوره، که به عنوان R0 نامیده می شود ... .r31، یعنی آنها فقط 32 تا 8 بیت هستند. نیمه دوم هدف کلی R16 ... R31 عملکرد ذخیره سازی موقت را انجام می دهد (به عنوان باتری، می تواند دریافت کند و می تواند اطلاعات را برای مقایسه مقایسه کند - کنترل کننده های PIC تنها یک باتری W است). آخرین 6 ثبت نام عمومی به طور مشروط در سه رقم 16 ساله ترکیب شده است:

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

r27: R26 نامیده می شود ثبت نام X،
r29: R28 نامیده می شود ثبت نام Y،
r31: R30 نامیده می شود ثبت نام z
این برنامه همچنین کار خواهد کرد اگر کلمه TEMP به هر کدام از دیگر ثبت نام عمومی از R16 به R31 اختصاص داده شود به عنوان مثال .def temp \u003d r20. پس از کامپایل (کلید F7 در AVR Studio 5)، هیچ تفاوتی در برنامه وجود ندارد.
(شما می توانید سعی کنید، حالا شما می دانید که چگونه آن را انجام دهید!)

خط:
.cseg؛ Directive.cseg شروع آغاز بخش را تعیین می کند که کدام برنامه اصلی برنامه قرار دارد
در Avr Studio 5، این دستورالعمل به طور پیش فرض تجویز می شود.
در Microcontrollers AVR، مناطق حافظه مختلف برای ذخیره سازی کد برنامه اختصاص داده می شود، داده ها در حافظه دائمی یا EEPROM، دایرکتوری ها برای تعیین این منطقه وجود دارد:
.cseg - بخش نرم افزار
.dseg - بخش داده
.seg - بخش EEPROM

خط:
.org 0؛ آغاز خط اول برنامه
این برنامه با یک خط از دستورالعمل مشخص شده آغاز می شود و پس از اتمام به آن بازگردانده می شود.

خط:
rjmp شروع؛ انتقال نسبی به برچسب شروع (Pic با فرمان GOTO مطابقت دارد)
این انتقال نسبی به برچسب شروع است.
این برنامه به صورت متوالی از بالای تخلیه به پایین انجام می شود. اگر می خواهید به قسمت دیگری از برنامه بروید، دستور RJMP استفاده می شود.

ردیف:
SER TEMP؛ تمام بیت های ثبت شده Temp را در 1 CLR TEMP تنظیم می کند؛ ثبت نام Temp را حذف می کند (تمام بیت های ثبت شده Temp را در 0 تنظیم می کند)
دستور SER با ثبت R16 R31 ... اعدام و دستور CLR را می توان به تمام ثبات، از جمله I / O ثبت (ثبت لنزهای استفاده های ویژه) انجام شد. انتصاب این ثبت نام ها بعدا نگاه خواهیم کرد.

خط:
LDI TEMP، 0B11001100
فرمان LDI در شماره 11001100 باینری Temp ثبت می شود (اگر به جای 0B11001100 به جای 0B11001100 ارسال شود، در یک مورد در شکل دهدهی در سایر هگزادسیمال، هیچ خطایی وجود نخواهد داشت.

خط:
خارج از DDRB، temp
فرمان OUT نشان می دهد ارزش ثبت نام Temp به ثبت نام پورت DDRB.

پورت چیست و چگونه کار می کند؟

اگر به حداقل ساده تر شود، پورت را می توان به عنوان یک پایه از میکروکنترلر نشان داد، که در حالت خروجی شما می توانید به طور خودسرانه ولتاژ یا غیر فعال را ارسال کنید، و در حالت ورودی، ممکن است تعیین شود اگر یک ولتاژ از خارج وجود داشته باشد یا نه.
سه حالت عملیاتی پورت وجود دارد: این خروجی، ورودی و حالت قطع شده است.
مدیریت پورت PINX، Portx، DDRX ثبت نام کنید.
X - به معنای پورت است که این رجیسترها مدیریت می شوند.
DDRX ثبت نام کنترل I / O حالت به عنوان رله - روشن (ثبت 1) - متصل به خط خروجی، خاموش (ثبت 0) - روشن به خط ورودی (پیش فرض).

برای نمایش داده ها را به پورت X، شما نیاز به یک DDRX ثبت نام برای سوئیچ به حالت خروجی (چاپ 1) و ارسال داده ها به PORTX ثبت نام کنید.
شما می توانید مقدار از پورت ایکس به عنوان خوانده شده، اگر DDRX ثبت نام سوئیچ به حالت ورودی (تجویز 0)، از ثبت نام PINX. برای اتصال مقاومت به کشش در حالت ورودی، شما باید داده ها را به Portx ارسال کنید.
مقاومت روابط ما را از نیاز به اتصال مقاومت خارجی به سیم مثبت و با کمک یک فرمان تغذیه توسط واحد منطقی به ورودی از بین بردن.

رأی خواندن

مقاله 23 خواننده را تصویب کرد.

برای شرکت در رای گیری، ثبت نام کنید و با ورود و رمز عبور خود وارد شوید و وارد شوید.

این مقاله LED های متصل به میکروکنترلر را در نظر خواهد گرفت، کار با پورت ها و نوشتن برنامه در C. این مقاله عمدتا برای مبتدیان است که فقط میکروکنترلرهای AVR را در نظر گرفته اند.

ابتدا باید یک میکروکنترلر را انتخاب کنید. در مورد من، این atmega8535 است. در این مورد، میکروکنترلر را می توان از آن استفاده کرد این وظیفه به راحتی تحت هر MK اجرا می شود. شما می توانید یک برنامه برای یک میکروکنترلر در یک اسمبلر، C، Pascal-E و Bascom بنویسید. من از زبان C استفاده کردم، همه این زبان ها متفاوت هستند.
یک تفاوت خاص بین SI و پاسکال را می توان در زیر مشاهده کرد.

// Flashing LED Void Main () (DDRB \u003d 0B1111111111؛ // تنظیم پورت ها B به portb \u003d 0B11111111111 خروجی؛ // به طور پیش فرض، همه چیز خاموش است در حالی که (1) (portb \u003d ~ portb؛ // وضعیت LED را تغییر دهید به delay_ms معکوس (100)؛ // یک تاخیر 100 میلی ثانیه))

برنامه اول؛ شروع DDRB: \u003d $ ff؛ // پورت B را به خروجی PORTB تنظیم کنید: \u003d $ FF؛ // به طور پیش فرض، هیچ چیز روشن نیست (1) شروع به پورت: \u003d نه (PortB)؛ // وضعیت LED را به تاخیر معکوس تغییر دهید (100)؛ // پایان دادن به تاخیر کوچک؛ پایان.

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

تعیین یک نوع اسمی عدد توجه داشته باشیدنمرهدفترچه من
U1 MK AVR 8 بیتی

atmega8535

1 در نوت بوک
R1-R8. مقاومت

220 OHM - 1 com

8 در نوت بوک
R9-R11 مقاومت

10 com

3 در نوت بوک
v1-v8. دیود ساطع نور 8 در نوت بوک
دکمه ساعت 3

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

اکثر دستورات Microcontrollers AVR در یک ساعت فرکانس فرکانس ساعت انجام می شود. که به طور گسترده ای توسط زنجیره RC جاسازی شده در MK مورد استفاده قرار می گیرد یا رزوناتور کوارتز را به نتیجه گیری XTAL1 و XTAL2 متصل می کند.

به عنوان مثال، اگر MK با فرکانس 1 هرتز کار کند، یک فرمان در یک ثانیه انجام خواهد شد

به طور پیش فرض، ATMEGA8 MK در ژنراتور فرکانس داخلی خود و یا به جای زنجیره RC، که در فرکانس 1000،000 hz \u003d 1 مگاهرتز عمل می کند، دخیل است. بنابراین، زمان اجرای یک فرمان عبارت است از:

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

#عبارتند از.

int main (void)

DDRD \u003d 0B000000011؛

در حالی که (1)

Portd \u003d 0B000000001؛ // به 1 LED اعمال می شود

Portd \u003d 0B000000010؛ // هزینه در رهبری دوم

اما در واقع، LED دوم با یک تفاوت زمانی 0.000001 ثانیه از اول روشن خواهد شد. چشم ما نمی تواند چنین تفاوت زمانی کوچک را ببیند. در حال حاضر در فرکانس تصاویر بیش از 24 هرتز (T \u003d 1/24 ≈ 0.042 درجه سانتیگراد)، دیدگاه ما یک فیلم پیوسته از تصاویر فردی را تشکیل می دهد. بنابراین، در اغلب موارد، ما قاب 25 را تشخیص نمی دهیم.

به منظور هر دو LED ها تا نور با یک تفاوت زمان 0.5 ثانیه، آن را بین دو دستور مربوطه لازم است (portd \u003d 0B000000001 و portd \u003d 0B000000010؛) قرار 500،000 دستورات خالی خالی، یعنی به زور MK نیمه amende نیست به انجام هر گونه اقدامات مفید است. یا، همانطور که می گویند، شما باید 500،000 ساعت را بکشید. اگر کد در اسمبلر نوشته شده است، برنامه نویسان سپس با استفاده از چرخه های مختلف است که "خوردن" یک تعداد معینی از ساعت و در نتیجه به دست آوردن فواصل زمانی مختلف.

#عبارتند از.

int main (void)

DDRD \u003d 0B000000011؛

در حالی که (1)

Portd \u003d 0B000000001؛ // به 1 LED اعمال می شود

برای به دست آوردن تاخیر 0.5 ثانیه شما باید اینجا را وارد کنید

500،000 دستورات تک

Portd \u003d 0B000000010؛ // اعمال قدرت در دوم

تابع _delay_ms () و فلش LED

هنگام نوشتن کد در C در Atmel Studio یک ویژگی بسیار راحت وجود دارد. _delay_ms(). برای کار این ویژگی، باید توسط دستورالعمل پیش پردازنده از پیش تعیین شده باشد .

در پرانتز از این ویژگی، شما می توانید زمان در میلی ثانیه تنظیم، و سپس شما را به MS رکورد نیاز در مقابل براکت، و یا در میکروثانیه - ایالات متحده:

هنگام استفاده از این ویژگی، به طوری که Atmel Studio هشدار را در هنگام کامپایل Atmel Studio نمی دهد، باید فرکانس را با استفاده از اپراتور #define اعلام کنید. از آنجا که پیش فرض برای ATMEGA8 1،000،000 هرتز است، ما این مقدار را اعلام خواهیم کرد. این خط بعدی انجام شده است:

#تعريف كردن f_cpu 1000000

در آینده، هنگامی که ما یک رزوناتور کوارتز را به MK متصل می کنیم، بدون این خط دیگر انجام نمی شود. این ساختار باقی خواهد ماند، تنها به جای 1،000،000 نیاز به ثبت فرکانس رزوناتور کوارتز دارد.

بیایید برنامه ما را بهبود ببخشیم، به طوری که یکی از LED ها برای اولین بار روشن می شود، پس از نیم ثانیه، او رفته و پس از آن در سراسر نیمی از نیمی از آن نگاه دوم و دوباره در 0.5 ثانیه Gully.

# تعريف كردن.

بیایید به کد بالا نگاه کنیم، دوباره. اگر ما باید ارزش تاخیر زمانی را در تابع تغییر دهیم _ تاخیر انداختن. از 500، به عنوان مثال، 300، ما باید تمام ردیف را با نام آن پیدا کنیم و جایگزین مناسب را انجام دهیم. در حال حاضر تصور کنید که صدها نفر از این ردیف ها یا حتی یک هزار. ارزش هر عدد را به طور جداگانه تغییر دهید بسیار ناراحت کننده و طولانی است. علاوه بر این، شما به طور تصادفی رشته را پر می کنید. بنابراین، لازم است که یک رویکرد دیگر، راحت تر و عملی تر اعمال شود.

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

با استفاده از اپراتور #define، ما مقدار عددی هر نام را اختصاص می دهیم. این نام نامیده می شود مقدار ثابت. بر خلاف یک متغیر، ثابت نمی تواند در برنامه تغییر کند. به نظر می رسد این است:

#define mig 300.

_ تاخیر انداختن._ خانم.(MIG)؛

نام ثابت را می توان تقریبا هر، با استفاده از کاراکترهای لاتین و اعداد مشخص کرد. در این مورد، نام MIG می گوید که ما تاخیر را اعمال می کنیم لحظهlED های آنیا

پس از یک رشته با دستورالعمل preprocessor #define، یک نقطه کاما قرار داده نشده است. بین نام ثابت و مقدار عددی شکاف است.

این رشته به شرح زیر عمل می کند. قبل از شروع کامپایل، تعداد 300 از تمام ثابت ها با نام MIG انجام می شود.

#تعريف كردن و ثبت نام

همچنین، اپراتور #define خوب است که ممکن است نام های ثبت نام را تنظیم کنید. به عنوان مثال، اگر ما به پورت D LED متصل شویم، سپس به جای پورت می توانیم سوختیم، به عنوان مثال VD:

#define vd portd.

VD \u003d 0B00000001؛

بیایید برنامه را با استفاده از دستورالعمل #define بازنویسی کنیم:

#تعريف كردن f_cpu 1000000

#عبارتند از.

#عبارتند از.

اضافه شده: 06.28.2017 در ساعت 13:00

در این مثال، ما اولین برنامه SI خود را برای میکروکنترلر Attiny13 نوشتیم. فرض بر این است که ما قبلا برای کار همه چیز نیاز داریم: محیط توسعه، کامپایلر و غیره آنچه که من یک هیئت مدیره اشکال زدایی دارم، به ترتیب تمام کد به آن اعمال می شود.
مانند برنامه تست ما کلاسیک، ساده ترین مثال از "چشمک زدن" را نوشتیم، که منجر به LED با فرکانس خاصی می شود.

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

/ * * tiny13_board_blink * نسخه ی نمایشی از هیئت مدیره اشکال زدایی در Attiny13 * به منظور بررسی عملکرد MK. * فلش LED. * / #define f_cpu 1200000ul // نشان می دهد فرکانس ساعت MK #Define LED PB2 // از LED متصل به PB2 (7 پین) #include استفاده کنید // تعاریف I / O را متصل کنید #include // ما کتابخانه توابع تاخیری اصلی را متصل می کنیم (void) (/ / ddrb LED | \u003d (1<

در ابتدا، ما مقادیر ثابت را مشخص می کنیم و فایل های هدر و کتابخانه ها را متصل می کنیم.
فایل aVR / IO.H. تعاریف ورودی / خروجی را برای یک نوع خاص از میکروکنترلر متصل می کند (نوع MK به عنوان یک گزینه برای کامپایلر مشخص شده است).
کتابخانه uTIL / تاخیر. ما به استفاده از توابع تاخیر، در مورد ما ارتباط برقرار می کنیم: _delay_ms (). برای استفاده از توابع تاخیر، ما باید فرکانس ساعت پردازنده را مشخص کنیم. از این رو قبل از اتصالات uTIL / تاخیر. تعیین ثابت f_cpu (در این مورد، 1.2 مگاهرتز).

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

در حالی که (1) (...)

برای شروع، ما باید پورت I / O را پیکربندی کنیم. در MK AVR از مدل های ارشد پورت ها در / ممکن است چندین (A، B، C، D) باشد. هر پورت می تواند به هشت پا متصل شود. هر یک از پاها را می توان هر دو در ورودی و خروج پیکربندی کرد. Attiny13 تنها یک پورت (ب) دارد که شش پا متصل می شوند (PB0-PB5، به داده ها مراجعه کنید). به طور پیش فرض، تمام پاها به ورودی پیکربندی شده اند و برای کنترل LED، ما باید از پایه مناسب به عنوان خروجی استفاده کنیم. در Microcontrollers AVR، کل سخت افزار توسط ثبت های هشت بیتی پیکربندی شده است. جهت (ورودی) توسط Registers DDRX تنظیم شده است (جایی که X نامه پورت، در مورد ما B) است. بیت ارزش "0" - مربوط به ورودی، "1" - خروجی است. بنابراین، برای استفاده از پا PB2 به عنوان خروجی، ما باید بیت دوم ثبت نام را تنظیم کنیم DDRB یک واحد:

DDRB | \u003d (1<

Registers Portx برای مدیریت وضعیت خروجی طراحی شده اند. به عنوان مثال، برای خاموش کردن LED متصل به پای PB2 (ارسال یک سطح سیگنال کم)، ما باید صفر را در بیت دوم ثبت نام ضبط کنیم پورت:

Portb & \u003d ~ (1<

برای فعال کردن (ارسال سطح بالایی از سیگنال) - به ترتیب، یک واحد بنویسید:

PARTB | \u003d (1<

در حال حاضر این پورت در / در پیکربندی شده است، ما چرخه اصلی را اجرا می کنیم که در آن ما وضعیت خروجی PB2 را به طور انحصاری (سطح سیگنال بالا و پایین) را با تأخیر 500ms تغییر خواهیم داد. بنابراین، LED با فرکانس 1 بار در ثانیه فلاش می دهد.

زنگ.

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