زنگ

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

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

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

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

وبلاگ Evil Mad Scientist اخیراً داستانی در مورد LED های مشابه داشت. در آنجا نشان داده شده است كه اگر شما تغییراتی در روشنایی را به صدا تبدیل كنید ، چگونه می خوانند. و همچنین - چگونه می توان با کمک آنها یک دیود قدرتمندتر کنترل کرد. این ترفندها مبتنی بر این واقعیت است که وقتی کنترلر آن را روشن تر می کند ، LED جریان بیشتری می گیرد. یک LED معمولی به صورت سری با یک لرزان ، تغییرات بسیار مشابه در روشنایی را نشان می دهد. به عبارت دیگر ، افت ولتاژ در طول مقاومت اضافی به نسبت روشنایی تغییر می کند.


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


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


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

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

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


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


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

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

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

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

چند بار تلاش شده است؟ طبق آمار ، سهم a \u003d 0.25 همه شماره ها باید دور ریخته و دوباره تولید شوند. احتمال آنچه برای ن هیچ تلاشی برای انتخاب شماره "صحیح" انجام نمی شود ، برابر است یک ن.
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.

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

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


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

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

بهترین الگوریتم سوسو زدن چیست؟ آیا این می تواند بهبود یابد؟

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

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

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

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

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

با این پرونده .hex چه باید کرد؟ و لازم است برنامه نویس کد برنامه را در ROM (حافظه فقط خواندنی) میکروکنترلر بنویسد. ما به جای برنامه نویس از برنامه استفاده خواهیم کرد پروتئوسکه مدولار یک مدار کار واقعی است.
که در AVR Studio 5 ویرایشگر ، کامپایلر ، دیباگر و برنامه نویس همه در یک!

دستورالعمل - این یک نسخه برای ویراستاری است که با آنها کار خواهیم کرد. در بیشتر قسمت ها ، نام بخشنامه و عملکرد آن در ویرایشگرهای مختلف یکسان است. به عنوان مثال ، اگر ویرایشگر را مقایسه می کنید MPLAB IDE برای میکروکنترلرهای PIC ، هیچ تفاوتی وجود ندارد!
اما تیم ها متفاوت هستند. لیست تیم ها توسط سازنده تشکیل می شود و تا حدودی به فناوری تولید بستگی دارد. حتی ممکن است همین تولید کننده در خانواده های مختلف با تغییر ساختار آنها ، لیست متفاوتی از دستورات داشته باشد.
فرمانیک عملکرد واحد است که با آن می توانیم میکروکنترلر را کنترل کنیم.
برنامهدنباله ای از دستورات مربوط به یک الگوریتم خاص (تهیه شده توسط ما) است.
هر برنامه با "سرصفحه" شروع می شود ، جایی که وظایف اصلی برنامه ، نویسنده آن ، نام کنترلر مورد استفاده ، فرکانس ساعت و سایر داده ها نوشته می شود. "کلاه" یک قانون "شکل خوب" در برنامه نویسی است.
معمولاً پرونده اولیه سازی.includeххххdef.inc در هدر نوشته می شود. دستورالعمل .device ،. لیست ، لیست جامع و سایر موارد.
که در AVR Studio 5 این بخشنامه ها بصورت پیش فرض نوشته شده اند. در نسخه قبلی AVR Studio 4 این دستورالعمل ها باید نوشته می شدند ، بنابراین من آنها را به عنوان نظر کنار گذاشتم.
نظرات به صورت دلخواه نوشته می شوند ، همانطور که دوست دارید و نکته اصلی این است که آنها برای شما قابل فهم باقی می مانند. غالباً به دلیل اظهار نظرهای ناقص ، پس از مدت زمانی مشخص ، خود نویسنده نمی تواند برنامه خود را بفهمد. نظرها قبل از علامت (؛) ثبت می شوند.
من "کلاه" را که توسط جان مورتون پیشنهاد شده است معرفی کردم ...

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

قبل از شروع کار ، اجازه دهید نگاهی به دستورالعمل های اسمبلر میکروکنترلر AVR بیندازیم.
هر دستورالعمل بر یک دوره مقدم است:
توضیحات دستورالعمل BYTE ذخیره بایت در بخش RAM CSEG Program Program DB یک بایت ثابت در حافظه فلش یا EEPROM را تعریف کنید. حافظه یا EEPROM .ENDM پایان macro.ENDMACRO پایان macro.EQU عبارت ثابت را تنظیم کنید. قسمت EES EEPROM .EXIT فایل را خارج کنید.INCLUDE فایل دیگری را ضمیمه کنید. لیست را فعال کنید لیست ایجاد کنید. لیست تنظیم موقعیت ORG در بخش تنظیم متغیر را با عبارت معادل تنظیم کنید

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

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

--
از توجه شما ممنونم!

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

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


شما فقط باید آن را باز کنید و آن را شروع کنید (البته به شرط آن پروتئوسقبلاً نصب شده است)
تصویر زیر باید ظاهر شود:

بریم بدویم AVR Studio 5، و در ویرایشگر ما یک برنامه کوچک با نظرات مفصل خواهیم نوشت:
.def temp \u003d r16؛ دستورالعمل .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\u003d\u003d\u003d\u003d\u003d\u003d\u003d؛ شروع برنامه.cseg؛ دستورالعمل .cseg آغاز قطعه ای را که در آن قرار دارد تعریف می کند. کد برنامه اصلی. در AVR Studio 5 ، این بخشنامه نیست؛ required.org 0؛ آغاز خط اول برنامه شروع rjmp؛ پرش نسبی به برچسب Start (در عکس مربوط به دستورات goto). \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\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\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؛ کلیه بیت های ثبت نام دما را به 1 DDRB ، دما تنظیم می کند. همه بیت های DDRD ، دما را ترجمه می کند. پورت های B و D برای پین کردن clr temp؛ رجیستری دما را پاک می کند (کلیه بیت های ثبت نام دما را بر 0 نشان می دهد) از PortB ، دما. مقاومتهای کشش PortD ، دما را غیرفعال می کند. بنادر B و D Cicle: ldi temp، 0b11001100؛ چراغ های LED را از PortB ، temp روشن می کند. بندر B rjmp Cicle؛ برگردید به برچسب Cicle ، حلقه

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


این پرونده به طور پیش فرض در My Document ، در پروژه AVR Studio 5 قرار دارد.

قابل اعتماد و متخصص پروتئوس، روی نقشه کنترلر کلیک کنید و مسیری را که پرونده .hex در آن قرار دارد وارد کنید:




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



برای متوقف کردن تقلید ، روی Stop کلیک کنید.
اگر میکروکنترلر را با یک برنامه نویس لمس کنید و مدار را مونتاژ کنید ، نتیجه همان خواهد بود.

بیایید سعی کنیم آن را با برنامه مشخص کنیم:

خط:
.def temp \u003d r16؛ دستورالعمل .def به r16 اختصاص می دهد نام دما را ثبت کند
برای راحتی ، ما ثبت نام r16 را به نام Temp اختصاص داده ایم ، به این معنی که در هر جای برنامه ، هنگام نوشتن کلمه temp ، برنامه به رجیستر 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؛ cseg بخشنامه آغاز قسمتی را که کد برنامه اصلی در آن قرار دارد تعریف می کند
در AVR Studio 5 این بخشنامه بصورت پیش فرض نوشته شده است.
در میکروکنترلرهای AVR ، مناطق مختلف حافظه برای ذخیره کد برنامه ، داده ها در حافظه دائمی یا EEPROM اختصاص داده شده است ، دایرکتوری هایی برای تعیین این منطقه وجود دارند:
.cseg - بخش برنامه
.dseg - بخش داده
.eseg - بخش EEPROM

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

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

خطوط:
سر دما؛ کلیه بیت های ثبت نام دما را به 1 clr temp تنظیم می کند. ثبت زمان را پاک می کند (کلیه بیت های ثبت نام دما را بر روی 0 تنظیم می کند)
فرمان ser با رجیسترهای r16… r31 اجرا می شود ، و دستور clr می تواند برای همه ثبت ها از جمله ثبت های I / O (ثبات های ویژه) اجرا شود. بعداً هدف این ثبت ها را بررسی خواهیم کرد.

خط:
ldi temp، 0b11001100
دستور ldi یک عدد باینری 11001100 را به ثبت نام دما ارسال می کند (خطا نخواهد بود اگر به جای 0b11001100 شما 204 یا CCh را بنویسید ، در یک مورد به صورت اعشاری در دیگری در شش ضلعی)

خط:
از DDRB ، دما
دستور out مقدار ثبت نام دما را به ثبت درگاه DDRB می نویسد.

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

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

برای خروج داده ها به پورت X ، باید ثبت DDRX را به حالت خروجی تغییر دهید (1 را بنویسید) و داده ها را به ثبت PortX ارسال کنید.
اگر ثبت DDRX به حالت ورودی (0 را بنویسید) از رجیستری PinX می توانید مقدار پورت X را بخوانید. برای اتصال مقاومتهای کشش در حالت ورودی ، باید داده ها را به PortX ارسال کنید.
مقاومتهای کشش ما را از لزوم اتصال مقاومتهای خارجی به سیم مثبت برطرف می کنند و به کمک یک دستور ، خودشان یک واحد منطقی را به ورودی وارد می کنند.

رای خواننده

مقاله توسط 23 خواننده تصویب شد.

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

در این مقاله اتصال LED ها به میکروکنترلر ، کار با درگاه ها و نوشتن یک برنامه در SI بررسی خواهد شد. مقاله در درجه اول برای مبتدیانی است که به تازگی کار روی میکروکنترلرهای AVR را آغاز کرده اند.

ابتدا باید یک میکروکنترلر را انتخاب کنید. در مورد من ، این ATmega8535 است. در این حالت ، شما می توانید از هر میکروکنترلر استفاده کنید ، زیرا این کار به راحتی برای هر MC انجام می شود. می توانید یک برنامه برای میکروکنترلر در Assembler ، SI ، Pascal و Bascom بنویسید. من از زبان C استفاده کردم ، همه این زبانها متفاوت هستند.
تفاوت خاص بین C و Pascal را می توان در زیر مشاهده کرد.

// چراغهای اصلی Blinking LED void main () (ddrB \u003d 0b11111111؛ // تنظیم پورت B به درگاه خروجیB \u003d 0b11111111؛ // به طور پیش فرض همه چیز خاموش است در حالی که (1) (portB \u003d ˜portB؛ // حالت LED را به خلاف تأخیر تبدیل کنید (100 ) ؛ // تاخیر 100 میلی ثانیه ای ایجاد کنید))

برنامه اول؛ شروع ddrB: \u003d $ FF؛ // تنظیم پورت B به خروجی portB: \u003d $ FF؛ // به طور پیش فرض هیچ چیزی روشن نیست در حالی که (1) portB را شروع می کنیم: \u003d not (portB)؛ // وضعیت LED را به خلاف تأخیر (100) تغییر دهید. // یک پایان تاخیر کمی انجام دهید؛ پایان.

لیست رادیوها

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

ATmega8535

1 داخل دفترچه یادداشت
R1-R8 مقاومت

220 اهم - 1 کیلومتر

8 داخل دفترچه یادداشت
R9-R11 مقاومت

10 کیلوΩ

3 داخل دفترچه یادداشت
V1-V8 دیود ساطع نور 8 داخل دفترچه یادداشت
دکمه تاکتیکی 3

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

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

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

به طور پیش فرض ، ATmega8 ژنراتور فرکانس داخلی مخصوص به خود را دارد ، یا поточно یک مدار RC ، که با فرکانس 1000000 هرتز \u003d 1 مگاهرتز کار می کند. بنابراین ، زمان اجرای یک دستور عبارت است از:

از این مسئله بدست می آید که اگر دو دستور را در یک ردیف بنویسیم ، که هر کدام یک چراغ جداگانه را روشن می کنند ، از نظر بصری خواهیم دید که هر دو به طور همزمان روشن می شوند.

#عبارتند از

int اصلی (باطل)

DDRD \u003d 0b000000011؛

در حالی که (1)

PORTD \u003d 0b000000001؛ // روشن کردن 1 چراغ LED

PORTD \u003d 0b000000010؛ // روشن کردن چراغ 2

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

برای اینکه هر دو چراغ با اختلاف زمان 0.5 ثانیه روشن شوند ، لازم است بین دو دستور مربوطه (PORTD \u003d 0b000000001؛ و PORTD \u003d 0b000000010؛) برای قرار دادن 500000 دستور خالی تک چرخه دیگر ، یعنی اینکه MK را به مدت نیم ثانیه دستورات مفیدی را اجرا نکنید. عمل. یا همانطور که می گویند ، شما باید 500،000 کنه را بکشید. اگر کد در اسمبلر نوشته شده باشد ، برنامه نویسان از حلقه های مختلفی استفاده می کنند که تعداد مشخصی از چرخه ساعت را "غذا می دهند" و در نتیجه فواصل زمانی مختلفی را بدست می آورند.

#عبارتند از

int اصلی (باطل)

DDRD \u003d 0b000000011؛

در حالی که (1)

PORTD \u003d 0b000000001؛ // روشن کردن 1 چراغ LED

برای تأخیر در 0.5 ثانیه ، باید در اینجا وارد کنید

500000 دستورات یک چرخه

PORTD \u003d 0b000000010؛ // قدرت در 2

تابع _delay_ms () و چراغ چشمک زن

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

در پرانتزهای این عملکرد می توانید زمان را در میلی ثانیه تنظیم کنید ، سپس لازم است قبل از براکت ها ، یا ما را در میکرو ثانیه ها ms بنویسید:

هنگام استفاده از این تابع ، به گونه ای که آتلیه استملی در هنگام تلفیق هیچگونه اخطاری ایجاد نمی کند ، باید فرکانس را با استفاده از عبارت # تعریف تعریف کنید. از آنجا که پیش فرض برای ATmega8 1000،000 هرتز است ، ما این مقدار را اعلام می کنیم. این با خط زیر انجام می شود:

#تعریف کردن F_CPU 1000000UL

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

بگذارید برنامه خود را بهبود ببخشیم تا ابتدا یک چراغ روشن شود ، بعد از نیم ثانیه خارج شود و بعد از نیمه دوم ثانیه دوم روشن شود و بعد از 0.5 ثانیه دوباره بیرون بیاید.

# تعریف کردن

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

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

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

# تعریف MIG 300

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

با استفاده از کاراکترها و اعداد لاتین می توان نام ثابت را تقریباً در هر چیزی تنظیم کرد. در این حالت ، نام MIG نشان می دهد که ما برای تأخیر استفاده می کنیم لحظهبا LED.

پس از خط با دستورالعمل # پردازش_define ، هیچ نقطه ای وجود ندارد. فضایی بین نام ثابت و عددی درج شده است.

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

#تعریف کردن و ثبت می کند

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

#define VD PORTD

VD \u003d 0b00000001؛

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

#تعریف کردن F_CPU 1000000UL

#عبارتند از

#عبارتند از

اضافه شده: 28/06/2017 ساعت 13:00

در این مثال ، ما اولین برنامه C خود را برای میکروکنترلر ATtiny13 می نویسیم. فرض بر این است که ما قبلاً همه موارد مورد نیاز شما را برای کار آماده کرده ایم: محیط توسعه ، کامپایلر و غیره. به عنوان یک آزمایش ، یک صفحه اشکال زدایی خانگی خواهم داشت ، بنابراین تمام کد ها را در رابطه با آن استناد می کنم.
به عنوان یک برنامه آزمایشی ، ما یک نمونه کلاسیک ، ساده ترین نمونه از "چشمک زدن" را خواهیم نوشت که یک چراغ را با فرکانس خاصی به خود می گیرد.

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

/ * * tiny13_board_blink * سیستم عامل آزمایشی هیئت مدیره اشکال زدایی در ATtiny13 * به منظور بررسی عملکرد MK. * ما LED را چشمک می زنیم. * / #define F_CPU 1200000UL // فرکانس ساعت MK #define LED PB2 // مشخص کنید از LED استفاده کنید به PB2 (7 پین) # استفاده کنید // شامل تعاریف I / O # شامل شوید // اتصال کتابخانه توابع تأخیر int main (اعتبار) (// DDRB LED | \u003d (1<

در همان ابتدا مقادیر ثابت را تنظیم می کنیم و پرونده های هدر و کتابخانه ها را نیز شامل می شود.
فایل avr / io.h تعاریف I / O را برای نوع خاصی از میکروکنترلر (نوع MC به عنوان گزینه ای برای کامپایلر مشخص می کند) متصل می کند.
کتابخانه استفاده / تأخیر.ح ما برای استفاده از توابع تأخیر متصل می شویم ، در مورد ما: _delay_ms ()... برای کارکردن عملکردهای تأخیر ، باید سرعت ساعت پردازنده را مشخص کنیم. از این رو قبل از اتصالات استفاده / تأخیر.ح ثابت را تعریف کنید F_CPU (در این حالت - 1.2 مگاهرتز).

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

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

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

DDRB | \u003d (1<

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

PORTB و \u003d ~ (1)<

برای روشن کردن (دادن سطح سیگنال بالا) - بر این اساس ، ما یکی را یادداشت می کنیم:

PORTB | \u003d (1<

اکنون که درگاه I / O پیکربندی شده است ، ما حلقه اصلی را اجرا می کنیم که در آن خروجی PB2 (متناوب بالا و پایین) را با تاخیر 500ms معکوس می کنیم. بنابراین ، چراغ ما با سرعت 1 بار در هر ثانیه چشمک می زند.

زنگ

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