فهرست مطالب:

سوئیچ های خواندن با ATtiny2313: 9 مرحله
سوئیچ های خواندن با ATtiny2313: 9 مرحله

تصویری: سوئیچ های خواندن با ATtiny2313: 9 مرحله

تصویری: سوئیچ های خواندن با ATtiny2313: 9 مرحله
تصویری: نحوه خواندن کد سوئیچ ۲۰۶ از طریق آپشن tnm 2024, نوامبر
Anonim
سوئیچ های خواندن با ATtiny2313
سوئیچ های خواندن با ATtiny2313

چندین دستورالعمل مربوط به خروجی های ATtiny2313 و دستگاه های AVR مشابه وجود دارد. به عنوان مثال ، https://www.instructables.com/id/Ghetto-Programming٪3a-Getting-started-with-AVR-micro/ ، https://www.instructables.com/id/Drive-a-Stepper- موتور-با-یک-AVR-ریزپردازنده/. با کار بر روی آخرین نسخه از The Real Elliot ، که نحوه کنترل موتورهای پله ای را نشان می داد ، متوجه شدم که قادر به اجرای بخشهای متناوب کد در یک برنامه واقعاً مفید خواهد بود ، بنابراین مجبور نیستم هر کدام ATtiny2313 را دوباره برنامه ریزی کنم زمان می خواستم یک تغییر مختصر کد را امتحان کنم (مانند مرحله نیمه راه رفتن یا حرکت معکوس). در حالی که نوشتن کد با استفاده از دستور switch/case برای انتخاب تغییرات متناوب آسان است ، راهی برای انتخاب مورد نیاز است. این بدان معناست که نوعی دستگاه ورودی باید برای کنترل کیس خوانده شود. خوشبختانه ، ATtiny2313 دارای تعداد زیادی پین ورودی/خروجی است و برای خواندن ورودی ها از سوئیچ ها به خوبی طراحی شده است. این دستورالعمل نحوه خواندن ورودی ها و تصمیم گیری بر اساس وضعیت آنها را نشان می دهد. از آنجا که این امر به تنهایی می تواند یک دستورالعمل بسیار خسته کننده باشد ، من یک روش ساده برای استفاده از قابلیت تایمر/شمارنده ATtiny2313 برای رانندگی یک بلندگوی کوچک به عنوان بوق را توضیح خواهم داد. همچنین در مورد تکنیک های اشکال زدایی ساده یک انحراف کوچک وجود خواهد داشت.

مرحله 1: دستگاه ورودی

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

این دستورالعمل مبتنی بر کار عالی The Real Elliot است و از سیستم توسعه ATtoy2313 Ghetto که او توصیف می کند ، استفاده می کند. برگه اطلاعات ATtiny2313 از Atmel مرجع نهایی برای همه عملکردها است ، اما لزوماً خواندن آن آسان نیست. https://www.atmel.com/dyn/products/datasheets.asp؟family_id=607 (پیوند دارای تمام برگه های داده AVR است ، 2313 را پیدا کنید.) شکل مجموعه ساده ای از سوئیچ های ورودی را نشان می دهد. این فقط یک بسته چهار سوئیچ روشن/خاموش است. همچنین به عنوان سوئیچ تک قطبی ، تک پرتاب (SPST) شناخته می شود. به طور معمول ، یک اتصال یا قطب از هر سوئیچ به زمین متصل است در حالی که اتصال دیگر از طریق مقاومت محدود کننده جریان (10K یا بیشتر) به بالا کشیده می شود. ورودی میکروکنترلر با مقاومت به قطب متصل می شود. اگر سوئیچ باز باشد ، میکروکنترلر ورودی را به صورت HI می خواند. اگر سوئیچ بسته باشد ، میکروکنترلر LO ورودی را می خواند. برای جزئیات بیشتر به شکل شماتیک مراجعه کنید. ATtiny2313 با تنظیم مقاومت های کششی قابل برنامه ریزی در پین های ورودی/خروجی هنگامی که به عنوان ورودی پیکربندی می شوند ، کارها را ساده می کند. این بدان معناست که سوئیچ ها می توانند به سادگی یک قطب به زمین (LO) و قطب دیگر به ورودی پردازنده متصل باشند. مثال اول فقط دو سوئیچ را نشان می دهد. سوئیچ ها با کد زیر خوانده و پیکربندی می شوند. سوئیچ ها را به عنوان ورودی پیکربندی کنید: (بدون نیاز به کد ؛ این پیش فرض است.) مقاومت های کششی را روشن کنید: PORTB = _BV (PB0) | _BV (PB1) ؛ ورودی ها را بخوانید: but1 = ~ PINB & 0x03؛ برای بدست آوردن مقدار صحیح به استفاده از وارونگی و ماسک زدن توجه کنید.

مرحله 2: چراغهای چشمک برای سیگنال

ما از این دو سوئیچ برای چشمک زدن یک LED چند بار برنامه ریزی استفاده می کنیم. LED هایی که استفاده خواهیم کرد ، چراغ های چشمک زن هستند که The Real Elliot آنها را مشهور کرد. سوئیچ های 1 و 2 به عنوان دو رقم دوتایی در نظر گرفته می شوند ، بنابراین این ترکیب می تواند اعداد 0 ، 1 ، 2 و 3 را نشان دهد. برنامه ما دو سوئیچ را می خواند و LED را به دفعات مناسب چشمک می زند ، اما فقط اگر سوئیچ تنظیمات تغییر کرده است سوئیچ ها 500 میلی ثانیه حذف می شوند (بهینه نشده اند). الگوریتم بازخورد بسیار ساده است. سوئیچ ها خوانده می شوند و قرائت یادداشت می شود. اگر با مقدار oldBut (آخرین مقدار ذخیره شده) متفاوت باشد ، برنامه 500 میلی ثانیه به تأخیر می افتد و سوئیچ ها دوباره خوانده می شوند. اگر مقدار مشابه خوانده شده قبلی باشد ، مقدار oldBut به روز می شود و LED تعداد دفعات دلالت شده توسط مقدار دودویی دو سوئیچ را چشمک می زند. به معکوس بودن مقدار توجه کنید زیرا سوئیچ "روشن" LO را می خواند. سوئیچ ها به طور مداوم برای تغییرات بیشتر اسکن می شوند. لطفاً برای کسب اطلاعات بیشتر در مورد چشمک زدن به Instructables قبلی The Real Elliot مراجعه کنید. به این https://www.ganssle.com/debouncing.pdf نگاهی بیندازید تا در مورد خاموش کردن سوئیچ ها بیشتر بدانید. در اینجا کد ATtiny2313 برای این مثال آمده است. در حین کار ، این برنامه LED را روی PB4 (پین فیزیکی 8) دو بار چشمک می زند تا نشان دهد که مقداردهی اولیه شده است. سپس کلیدهای یک و دو را می خواند و بسته به تنظیمات سوئیچ هر زمان که تعویض می شوند ، یک تا سه بار چشمک می زند. هنگامی که سوئیچ ها تغییر نمی کنند ، LED به آرامی چشمک می زند. برای اجرای این کد ، یک دایرکتوری جدید ایجاد کنید (اگر دوست دارید آن را "Basic" بنامید) و فایل کد C زیر را بارگیری کرده و در آن makefile کنید. نام Makefile1.txt را فقط Makefile تغییر دهید. با استفاده از WinAVR ، برنامه را کامپایل کرده و آن را در ATtiny2313 بارگذاری کنید.

مرحله 3: یک تغییر جزئی در اشکال زدایی

اگر مانند من (و هر برنامه نویس دیگر در جهان) هستید ، احتمالاً زمان هایی را تجربه کرده اید که کد "عاری از خطا" که با دقت وارد کرده اید و کامپایل کرده اید آنچه را که از آن انتظار دارید انجام نمی دهد. شاید به سادگی هیچ کاری انجام ندهد! پس مشکل چیست؟ چگونه می خواهید متوجه شوید؟ خوشبختانه روشهای مختلفی برای به کار انداختن کارها وجود دارد. (این کتاب را برای درمان عالی در مورد اشکال زدایی دریافت کنید. آنچه شما می دانید. اگر یک بار برای چشمک زدن کار کرده اید ، دوباره از آن استفاده کنید تا ببینید در برنامه خود کجا هستید. من دوست دارم دوبار چشمک بزنم تا نشانه شروع برنامه باشد. می توانید برای انجام این کار ابتدا کد را در ابتدای برنامه خود قرار دهید. هنگامی که می دانید هیچ مشکلی در سخت افزار شما وجود ندارد ، یک تابع برای انجام پلک زدن ایجاد کنید. در اینجا عملکردی است که من استفاده می کنم. /---------------------------------------------- ------------------------------ ** blinkEm-عملکرد چشمک زدن LED با استفاده از PD4 ** PD4 باید به عنوان خروجی پیکربندی شود. ** ---------------------------------------------------- ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4)؛ _delay_ms (1000) ؛ PORTD = ~ _BV (PD4) ؛ _delay_ms (1000) ؛ شمردن--؛ }} اکنون می توانید از این تابع در نقاط مختلف کد خود به عنوان سیگنالی استفاده کنید که کد تا اینجا اجرا کرده است. دانستن اینکه کد در حال اجرا است به این معنی است که می توانید هر قسمتی را که اجرا شده است ، اما آنچه را که انتظار داشتید انجام نداده است ، با دقت بررسی کنید تا خطاها را بیابید. تغییر یک چیز در یک زمان نیز یک تکنیک کلیدی برای اشکال زدایی است (در مرجع بالا توضیح داده شده است). این روش کلاسیک همراه با "تقسیم و فتح" عمل می کند: برداشتن گام های کودک برای افزایش عملکرد بیشتر. این ممکن است رویکردی کند به نظر برسد ، اما تقریباً به اندازه تلاش برای اشکال زدایی بخش بزرگی از کدهای غیر فعال به طور همزمان نیست.

مرحله 4: اشکال زدایی بیشتر

موارد زیادی وجود دارد که ما می خواهیم قسمتی از کد را با رد کردن بیشتر خطوط موجود در آن بررسی کنیم ، سپس آنها را یکی یکی فعال کنیم ، در حالی که تأیید می کنیم هر یک از آنها کار می کند. به طور معمول ، ما این کار را با "اظهار نظر" در مورد خطوطی که می خواهیم از آنها بگذریم ، انجام می دهیم. گسترش این تکنیک عبارت است از برش و چسباندن یک بلوک کد ، اظهار نظر در مورد اصلی (بنابراین آن را از دست ندهیم) و حذف کپی. C چهار راه آسان برای اظهار نظر در مورد خطوط دارد. قرار دادن "//" در جلوی خط نظرات آن خط را بیان می کند. با بستن یک یا چند خط در "/*" و "*/" ، یک قسمت کامل کامنت می شود. برای اینکه این روش به طور م workثر کار کند ، نباید "*/" دیگری در بلوک کد (به جز مورد پایانی) وجود داشته باشد. بنابراین یک دستورالعمل م isثر این است که از // برای نظرات درون بلوک های کد استفاده کنید ، و ساختار / * * / را برای بلوک های نظر و برای اظهارنظر در بخش های کد رزرو کنید. قرار دادن "#if 0" در ابتدای بلاک برای اظهار نظر و پایان بخش با "#endif". کنترل انتخابی بیشتری با استفاده از "#ifdef (شناسه)" در ابتدای بلوک و "#endif" در پایان امکان پذیر است. اگر می خواهید بلاک کامپایل شود ، از "#define (identifier)" زودتر در برنامه استفاده کنید. توجه داشته باشید که علامت نقل قول فقط برای تأکید است و شامل نمی شود. ترکیب این تکنیک ها باید روشی مفید برای اشکال زدایی برنامه های ATtiny2313 شما ارائه دهد. ممکن است با انجام این دستورالعمل ، این ابزارها مفید واقع شوند.

مرحله 5: استفاده از تایمر/شمارنده 0 برای بوق

استفاده از تایمر/شمارنده 0 برای بوق
استفاده از تایمر/شمارنده 0 برای بوق

ATtiny2313 دارای دو منبع زمان سنج/شمارنده قدرتمند است: یکی 8 بیتی و دیگری 16 بیتی. اینها ممکن است به عنوان مولد فرکانس ، کنترل کننده های مدولاسیون عرض پالس متغیر و ثبت کننده های خروجی پیکربندی شوند. عملکرد کامل این موارد در 49 صفحه برگه داده توضیح داده شده است. با این حال ، ما از یک مورد ساده استفاده می کنیم. فقط از تایمر/شمارنده 0 (8 بیتی) استفاده می شود و به سادگی به عنوان مولد فرکانس مورد استفاده قرار می گیرد. فرکانس به بلندگوی کوچک هدایت می شود تا بوق تولید شود. تایمر/شمارنده 0 به طور کامل در صفحات 66 تا 83 برگه اطلاعات ATtiny2313 شرح داده شده است. خواندن دقیق این مطالب به درک کامل زمان/شمارنده 0 کمک می کند. خوشبختانه ، یک حالت نسبتاً ساده ، Clear Timer on Compare (CTC) ، تنها چیزی است که برای تولید صدای بوق مورد نظر ما لازم است.

برای حالت مورد استفاده ما ، عملکرد تایمر/شمارنده مستقیم است. هنگامی که سیگنال ساعت انتخاب می شود ، شمارنده از صفر شروع می شود و هر پالس ساعت را افزایش می دهد. هنگامی که مقدار شمارنده به مقدار موجود در ثبت خروجی (TOP) می رسد ، شمارنده به صفر بازنشانی می کند و شمارش دوباره شروع می شود. بیت خروجی مربوط به تایمر/شمارنده برای تولید خروجی موج مربعی ضامن می شود. این به طور مستقیم یک مبدل صوتی را به سمت ایجاد صدای بوق سوق می دهد. یک مبدل صوتی کوچک TDK بوق تولید می کند. واحد مناسب Digikey 445-2530-ND ، TDK SD1209T3-A1 است (من از نسخه اولیه آن استفاده کردم). این نسخه 3 ولت است. نسخه 5 ولت نیز انتظار می رود کار کند. من این را مستقیماً از درگاه خروجی Attiny2313 خارج می کنم و به نظر می رسد خوب کار می کند. Sparkfun دستگاه مشابهی دارد.

مرحله 6: پیکربندی تایمر/شمارنده 0

از حالت CTC می توان برای تغییر OC0A خروجی در پین 2 ، پورت B (پین فیزیکی 14) استفاده کرد. برای فعال کردن خروجی در این پین ، DDRB باید به درستی تنظیم شود. کد C برای این درست مانند تنظیم خروجی برای چشمک زن است. DDRB = _BV (PB2) ؛ // پورت B2 یک خروجی است. گام بعدی این است که یک سیگنال ساعت را بارگذاری کرده و ثبات مقایسه ای خروجی را بارگذاری کنید تا شکل موجی به عنوان فرکانس تولید شود. معادله فرکانس حاصله در برگه داده (صفحه 72) آورده شده است. شرایط موجود در معادله در زیر شرح داده می شود. در اینجا این معادله وجود دارد: fOC0A = fclk_I/O/2*N*(1+OCR0A) جایی که fOC0A: = فرکانس خروجی fclk_I/O: = فرکانس منبع ساعت N: = فاکتور پیش فرض ساعت OCR0A: = مقدار خروجی برای ثبت تایمر/ شمارنده 0A. فرکانس منبع ساعت ، fclk_I/O این فرکانس ساعت سیستم است. مقدار پیش فرض 1 مگاهرتز است. بیت های CS00 ، CS01 و CS02 از TCCR0B این انتخاب را کنترل می کنند. از آنجا که این بیت ها مقدار N را نیز انتخاب می کنند ، در ادامه توضیح داده می شود. Precaler Value ، NN مقداری است که برای تقسیم یا پیش مقیاس بندی ساعت سیستم استفاده می شود. بیت های CS00 ، CS01 و CS02 از TCCR0B این انتخاب را کنترل می کنند. جدول 41 در صفحه 81 برگه اطلاعات ATtiny2313 ترکیب ها را شرح می دهد. از آنجا که فرکانسی نزدیک به 1 کیلوهرتز مورد نظر است ، بیت های CS00 و CS01 از TCCR0B تنظیم می شوند. توجه داشته باشید که تنظیم هر سه بیت روی 0 ، در نتیجه انتخاب هیچ منبع ساعت ، خروجی را به طور موثری متوقف می کند. این روشی است که برای شروع و توقف بیپ مورد استفاده قرار می گیرد. مقدار TOP ، OCR0 این مقدار مقدار TOP برای شمارنده است که در ثبت خروجی مقایسه برای تایمر/شمارنده 0A بارگیری می شود. هنگامی که این مقدار به دست آمد ، شمارنده به صفر بازنشانی می شود و شمارش مجدد شروع می شود تا زمانی که TOP رسیده و چرخه تکرار شود. TOP به راحتی قابل تغییر است ، بنابراین فرکانس بیپر به راحتی قابل تغییر است. از آنجا که فرکانسی نزدیک به 1 کیلوهرتز مطلوب است ، TOP روی 7 تنظیم شده است (توجه داشته باشید که پیش فروشنده می تواند روی 8 تنظیم شود و TOP را روی 63 تنظیم کنید. همان نتیجه - به انتخاب شما.) فرکانس خروجی ، fOC0A استفاده از معادله برای محاسبه نتایج فرکانس خروجی در: fOC0A = 1 ، 000 ، 000 /2 * 64 * (1+7) fOC0A = 977Hz هر قدر نزدیک باشید! در اینجا کد بارگیری خروجی Compare Register و Timer Counter Control Register 0B را مشاهده می کنید. لطفاً کد واقعی برنامه را ببینید تا نحوه استفاده از آنها را درک کنید. OCR0A = 7 ؛ // مقدار زمان TCCR0B = _BV (CS01) | _BV (CS00) ؛ // ساعت داخلی و پیش مقیاس = 8 TCCR0B = 0 را انتخاب کنید؛ // هیچ منبع ساعت صدا را خاموش نمی کند تنظیم زمان/شمارنده به عنوان آخرین جزئیات ، ما با تنظیم بیت های مناسب در تایمر/Counter Control Register 0A حالت Timer/Counter را که می خواهیم مشخص می کنیم. حالت CTC با تنظیم بیت WGM01 مطابق جدول 40 ، صفحه 79 برگه داده انتخاب می شود. از آنجا که ما می خواهیم خروجی هر چرخه را تغییر دهد ، بیت COM0A0 نیز باید مطابق جدول 34 در صفحه 77 تنظیم شود. در اینجا کد: TCCR0A = _BV (COM0A0) | _BV (WGM01) ؛ // حالت تعویض CTC

مرحله 7: استفاده از چهار سوئیچ

وقتی پیکربندی را اجرا می کنیم ، اجازه دهید سخت افزار و نرم افزار خود را برای اداره چهار سوئیچ گسترش دهیم. از آنجا که خروجی تایمر شمارنده 0A در پورت B ، پین 2 است ، نمی توانیم سوییچ های بیشتری را به طور پی در پی به پورت B متصل کنیم. راه حل آسان استفاده از پورت D است ، اما اجازه دهید آن پورت را برای سایر عملکردها در دسترس نگه داریم (شاید یک موتور پله ای) بنابراین اجازه دهید سوئیچ های اضافی را به PB3 و PB4 متصل کنیم. خواندن سوئیچ ها عمدتا بدون تغییر است. مقدار ماسک به 0x1B (00011011 باینری) به ماسک بیت 2 به همراه 5 ، 6 و 7 تغییر می کند. یک ترفند دیگر برای ایجاد یک عدد باینری 4 بیتی استفاده می شود. بیت های 3 و 4 را یک بیت راست تغییر دهید و آنها را با بیت های 0 و 1 به یک عدد باینری 4 بیتی ترکیب کنید. این نحو استاندارد C برای تغییر و ترکیب بیت ها است ، اما ممکن است برای مبتدیان چندان شناخته شده نباشد. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1)؛ // but1 دارای خواندن سوئیچ است. در عملکرد ، برنامه دوبار چشمک می زند و دوبار برای شروع سیگنال بوق می زند. هر زمان که سوئیچ ها تغییر می کنند ، عددی که نشان می دهند بوق می شود. هنگامی که سوئیچ ها تغییر نمی کنند ، LED چشمک می زند. برای اجرای این کد ، یک دایرکتوری جدید ایجاد کنید (اگر دوست دارید آن را Beep بنامید) و فایل کد C زیر را بارگیری کرده و در آن makefile کنید. نام Makefile2.txt را فقط Makefile تغییر دهید. با استفاده از WinAVR ، برنامه را کامپایل کرده و آن را در Attiny2313 بارگذاری کنید.

مرحله 8: استفاده از Switch/case Construct

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

برای اجرای این کد ، یک دایرکتوری جدید ایجاد کنید (در صورت تمایل آن را تغییر دهید) و فایل کد C زیر را بارگیری کرده و در آن makefile کنید. نام Makefile3.txt را فقط Makefile تغییر دهید. با استفاده از WinAVR ، برنامه را کامپایل کرده و آن را در Attiny2313 بارگذاری کنید.

مرحله 9: نتیجه گیری

نتیجه
نتیجه

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

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

توصیه شده: