فهرست مطالب:

ژنراتور آردوینو بدون کتابخانه یا عملکردهای سریال (با وقفه): 10 مرحله
ژنراتور آردوینو بدون کتابخانه یا عملکردهای سریال (با وقفه): 10 مرحله

تصویری: ژنراتور آردوینو بدون کتابخانه یا عملکردهای سریال (با وقفه): 10 مرحله

تصویری: ژنراتور آردوینو بدون کتابخانه یا عملکردهای سریال (با وقفه): 10 مرحله
تصویری: #1 نمای کلی FLProg | برنامه نویسی Visual Embedded Arduino 2024, نوامبر
Anonim
Arduino Tone Generator بدون کتابخانه یا توابع سریال (با وقفه)
Arduino Tone Generator بدون کتابخانه یا توابع سریال (با وقفه)

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

این کد برای میکروکنترلر Atmega 2560 طراحی شده است ، بنابراین اگر می خواهید آن را روی برد دیگری پیاده سازی کنید ، باید بر اساس کتابچه راهنمای کاربر کنترلرهای خود ، رجیسترهای آدرس را در کد تغییر دهید. ایده اصلی پشت این کد این است که هر زمان که کلیدی را از صفحه کلید وارد مانیتور سریال می کنید ، arduino mega فرکانس خاصی را بر اساس کلیدی که فشار می دهید ، با "q" تنظیم مجدد ، خروجی می دهد. من آن را طوری تنظیم کردم که "a" فرکانس A تخت و "A" فرکانس A تند ، "b" خروجی B مسطح ، "c" برای C تخت ، "C" برای C تیز ، و غیره را نشان دهد. کد کامل در پایان بارگذاری می شود ، اما هر مرحله کد را به قطعات تقسیم می کند ، بنابراین توضیح آن آسان تر است.

مرحله 1: تعریف آدرس های ثبت نام

تعریف آدرس های ثبت نام
تعریف آدرس های ثبت نام

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

مرحله 2: آرایه ها و متغیرهای جهانی

آرایه ها و متغیرهای جهانی
آرایه ها و متغیرهای جهانی
آرایه ها و متغیرهای جهانی
آرایه ها و متغیرهای جهانی
آرایه ها و متغیرهای جهانی
آرایه ها و متغیرهای جهانی

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

مرحله 3: تابع "serial.begin"

این
این

ما تابع سفارشی خود را که عملکرد "serial.begin" را تکرار می کند (U0init) فراخوانی می کنیم. باودرات مورد نظر را به عنوان ورودی می گیرد و پورت سریال را در آن باودرات شروع می کند.

مرحله 4: تابع "serial.available"

این
این

ما تابع تقلید کننده "serial.available" U0kbhit () را فراخوانی می کنیم. ورودی نمی گیرد اما در عوض تشخیص می دهد که با استفاده از بیت وضعیت RDA تغییری در صفحه کلید ایجاد شده است و با تشخیص تغییر مقدار true برمی گردد.

مرحله 5: تابع "serial.read"

این
این

ما تابع تقلید کننده از تابع "serial.read" را U0getchar () می نامیم ، که هرگونه تغییر در صفحه کلید را که در رجیستر UDR0 ذخیره می شود ، ورودی و خروجی نمی گیرد.

مرحله 6: تابع "serial.write"

این
این

ما تابع تقلید کننده "serial.write" را U0putchar () می نامیم ، که در حالی که تغییری شناسایی و ذخیره می شود ، داده ها را از ثبت UDR0 می گیرد و خروجی هایی را که به مانیتور سریال تغییر می کند ، فراخوانی می کنیم.

مرحله 7: تابع راه اندازی

تابع راه اندازی
تابع راه اندازی

این اصلی ترین عملکرد راه اندازی است که از تقلید "serial.begin" ما برای راه اندازی پورت سریال استفاده می کند و تنظیمات بیت ما را برای رجیسترهای تایمر اولیه می کند و PB6 را برای خروج آهنگ های ما تنظیم می کند.

مرحله 8: توابع حلقه و ISR

توابع حلقه و ISR
توابع حلقه و ISR

حلقه به این صورت عمل می کند: اگر تغییری در عملکرد "serial.available" ما تشخیص داده شود ، عملکرد "serial.read" ما تغییر می کند و عملکرد "serial.write" ما این تغییر را در مانیتور سریال قرار می دهد. تا زمانی که یک متغیر i کمتر از اندازه آرایه فرکانس باشد ، خروجی را موقعیت i در آن آرایه تنظیم می کند و فرکانس را در آن موقعیت خروجی می دهد. ISR به عنوان تنظیم مجدد عمل می کند ، جایی که اگر موقعیت آرایه فرکانس برابر 0 نباشد (به عبارت دیگر اگر "q" فشار داده نشود) ، فرکانس را خروجی می دهد ، اما با فشار دادن "q" تنظیم مجدد می شود. لطفا توجه داشته باشید: این کد از وقفه ها استفاده می کند ، اما می توان با وقفه های غیرفعال انجام داد. در صورت دریافت هرگونه درخواست ، کد را بدون وقفه ارسال می کنم ، فقط فکر می کنم نسخه وقفه سرگرم کننده تر است.

مرحله 9: سیم کشی

سیم کشی
سیم کشی

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

مرحله 10: همه چیز را با هم ترکیب کنید

من کد کامل را به این مرحله اضافه کردم ، زیرا تمام قسمتهای آن را در مراحل قبلی توضیح داده ام. فقط یک ورودی صفحه کلید برای فرکانس های مختلف لازم است و این فرکانس را به PB6 خروجی می دهد. امیدوارم از خواندن روش دیگری برای کدگذاری با IDE لذت برده باشید!

همچنین ، لطفاً در مسابقه میکروکنترلر به این رای دهید: D

توصیه شده: