مدل دیفرانسیل جلو ساخته شده با پرینت سه بعدی
برای تهیه فایل های STL جهت پرینت، به شماره 09391907175 پیام بدهید.
برای تهیه فایل های STL جهت پرینت، به شماره 09391907175 پیام بدهید.
اگر به دنبال برنامه نویسی برای ESP8266 هستید و مثل بنده از IDE ساده و ضعیف آردینو رنج میبرید. میتوانید اکستنشن آردینو را برای ویژوال استودیو نصب کنید و در محیط قدرتمند ویژوال استودیو برنامه نویسی ESP8266 و یا آردینو را انجام بدهید و از برنامه نویسی لذت ببرید.
فایل افزونه آردینو برای ویژوال استودیو:
سفارشات چاپ سه بعدی پذیرفته میشود.
ابعاد قابل چاپ طول: 220 - عرض: 220 - ارتفاع:250 میلی متر
آدرس کانال تلگرام: @designer2013_3dp
نرم افزار طراحی سه بعدی فیوژن 360 از زیرمجموعه های اتودسک ، با محیطی یوزر فرندی ، یادگیری آسان ، حجم کم و در عین حال حرفه ای که برای طراحی قاب، قالب، محصول ، طراحی قطعات جهت چاپ سه بعدی بسیار کاربردی میباشد و یادگیری آن برای مهندسین قطعا مفید هست.
برای یادگیری میتوانید از آموزش های لیندا و ویدئوهای موجود در یوتیوب ، همینطور ویدئو های خود سایت اتودسک استفاده کنید.
ویدئوی معرفی:
سلام به دوست داران الکترونیک و دنیای برنامه نویسی.
در این مطلب می خواهم که اطلاعات مربوط به ساخت رباتی که ویدئوی آن را قرار دادم برایتان منتشر کنم.
1 - مدار و شماتیک
لیست قطعات:
AMS1117 - ,MC34063 - LM324 - ATXMEGA32A4U - SRF05 - ESP8266 - L293
1-1 : واحد تغذیه: برای مدار نیاز به ولتاژ 3.3 ولت و 5 میباشد. رگولاتور 3.3 ولت AMS1117 تغذیه میکرو و ماژول WIFI را تامین میکند. رگولاتور MC34063 نیز ولتاژ 5 ولت سایر قطعات را تامین میکند. که به دلیل کوچک بودن سایز این رگولاتور و سلفش انتخاب شده است.
1-2 : پردازنده: برای این مورد هم از پردازنده محبوبم یعنی ATXMEGA32A4U استفاده کردم.
1-3: ESP8266: ارزان ترین و در دسترس ترین و کوچکترین و محبوب ترین ماژول وای فای موجود در دنیا میباشند.
1-4: SRF05: ماژول فاصله سنج آلتراسونیک با حداکثر اندازه گیری 5 متر
1-5: LM324: خروجی آنالوگ سنسورهای مادون قرمز TCRT5000 با استفاده از حالت مقایسگر آپ امپ تبدیل به دیجیتال شده و به میکرو منتقل میشود. از سه سنسور برای حالت مسیریاب استفاده شده است. و سنسور چهارمی هم پیش بینی شده که بتوان کنار چرخ نصب کرد و تعداد چرخیدن چرخ را شمرد که فعلا از آن استفاده نشده است.
1-6: L293 : راه اندازی موتورها به عهده درایور L293D میباشد. که امکان کنترل دو موتور را به صورت چپ-گرد / راست-گرد با جریان خروجی برای هر موتور 600 میلی آمپر را دارد.
شماتیک کل مدار:
2- PCB: برد ربات با استفاده از نرم افزار EAGLE و به صورت یک رو طراحی شده است. آموزش های این نرم افزار را از اینجا میتوانید دانلود کنید.
3 -توضیحات برنامه:
برنامه به زبان C و نرم افزار اتمل استودیو نوشته شده است. با فرض بر اینکه دوستان با برنامه نویسی زبان C آشنا هستند، قسمتهایی که بیشتر مربوط به تنظیمات سخت افزاری ATXMEGA میباشد را شرح میدهم.
3-1: در ابتدای برنامه تابع init فراخوانی شده و فرکانس میکروکنترلر با اجرای تابع osc_extclk_pll_init از کتابخانه osilator config.h در حالت اسیلاتور متصل به کریستال خارجی تنظیم میشود و با استفاده از واحدد PLL فرکانس 8 مگاهرتز ضربدر 4 شده و به 32 مگاهرتز میرسد و با توجه به این که ضرایب Prescaler A و Prescaler B و Prescaler C بدون تغییر با مقدار پیش فرض 1 میباشند فرکانس کاری CPU هم 32 مگاهرتز خواهد بود.
3-2: کنترل دور موتور: برای کنترل دور موتورها تایمر/کانتر 1 از پورت C در حالت Single-slop PWM Generation قرار داده شده و فرکانس خروجی PWM با قرار دادن مقدار 800 در رجیستر پریود تایمر بر روی 156 هرتز تنظیم شده ، خروجی PWM بر روی پایه های OC1A و OC1B فعال و تایمر با Prescaler 256 شروع به کار کرده است.
3-3: اندازه گیری فاصله با استفاده از ماژول SRF05: به صورت خلاصه با تحریک کردن پایه Trigger و اندازه گیری مدت زمان تغییر وضعیت پایه echo می توان فاصله تا مانع را بدست آورد. با تحریک پایه تریگر؛ پایه اکو به وضعیت یک تغییر میکند و بعد از دریافت برگشت امواج فراصوت وضعیت پایه به صفر برمیگردد. با توجه به اینکه اندازه گیری فاصله با مانع؛ برای جلوگیری از برخورد با مانع؛ باید پشت سر هم تکرار شود در صورتی که اندازه گیری طول پالس را CPU انجام دهد باعث مشغول شدن CPU و کاهش استفاده مفید از آن میشود. به این خاطر اندازه گیری طول پالس به قابلیت Pulse Width Capture از تایمر صفر پورت C واگذار میشود. برای این کار باید وقفه بر روی پایه میکرو که به خروجی اکو ماژول متصل است در حالت both edges فعال شود و از طریق Event به عنوان ورودی واحد کپچر تایمر متصل شود. نحوه کار تایمر در حالت اندازه گیری عرض پالس به این شکل است که با لبه بالا رونده پالس، تایمر ریست شده و از مقدار صفر شروع به شمارش میکند و با لبه پایین رونده پالس، مقداری که در شمارنده تایمر قرار دارد در رجیستر کپچر(CCX) ذخیره میشود.
در اینجا کانال صفر ایونت به PIN2 از PORTA متصل و وقفه خارجی پایه در حالت both edges به عنوان تریگر ایونت انتخاب میشود.
تنظیم تایمر در حالت کپچر:
لینک ویدئو در آپارات:
برای ساخت یک قاب یا جعبه برای مداری که طراحی کردید یا هدیه ای که میخواهید برای کسی ببرید. میتوانید یک سر به سایت زیر بزنید شکل قاب مورد نظرتون را انتخاب کنید. ابعاد را وارد کنید و در عرض چند ثانیه فایل SVG را تحویل بگیرید. برای برش فایل را به یک برش لیزر ببرید
https://www.festi.info/boxes.py/
نرم افزار طراحی PCB با محیطی یوزر فرندی، دارای کتابخانه بسیار قوی، امکان ساخت قطعات جدید بسیار سریع و آسان، یک از قابلیت های کاربردی جدید که به نرم افزار اضافه شده امکان ذخیره یک شماتیک و pcb از قبل طراحی شده به عنوان یک بلاک دیزاین هست (مشابه کتابخانه قطعات) که به طراح این امکان را میده که مداراتی را که زیاد استفاده میکنه (مثلا مدار تغذیه) یک بار طراحی و ذخیره کنه و در پروژه های بعدی از طرح آماده استفاده کنه.
ویدئو:
https://www.aparat.com/v/2Adb1
دما و رطوبت با استفاده از کتابخانه I2C نرم افزاری از سنسور خوانده میشود و میتوانید سنسور را به هر پایه ای از میکرو متصل کنید.
با استفاده از این کتابخانه میتوانید ماژول RTC با آی سی DS3231 را به پایه های دلخواه از میکرو وصل کنید. و نیازی به استفاده از I2C سخت افزاری میکرو نیست.
تایمر دو رنگ
زمان 5 دقیقه تا 60 دقیقه، با تفکیک 5 دقیقه قابل انتخاب میباشد. (بنا به خواست سفارش دهنده)
تغییر زمان ها از طریق ریموت و کلیدهای روی برد امکان پذیر است.
بعد از شمارش تا زمان تعیین شده. رنگ تایمر از سبز به قرمز تغییر میکند.
درایور RGB پیکسل داراری wifi و اپلیکیشن اندروید و وینفون جهت:
1- نورپردازی تابلو چلنیوم
2- نورپردازی نما
3- نور مخفی
پشتیبانی از آی سی های:
WS2811 - WS2812 - WS2812B - UCS1903 - UCS1912 - xh6897
دارای افکتهای متنوع
امکان ساخت لیست افکت
امکان تغییر نام و رمز وای فای
درایو 8۰۰ پیکسل
اپلیکیشن اندروید
قیمت ۹۰ هزار تومان
You may see a do loop with the conditional expression set to a constant value of zero (0). This creates a loop that will execute exactly one time. This is a coding idiom that allows a multi-line macro to be used anywhere that a single statement can be used.
Since the conditional expression of the do loop is a constant value, the compiler will not generate any additional code to process the loop, so this idiom does not add any overhead to the code when it is executed.
This technique is frequently used in macro definitions where the body of the macro is not a single or simple statement. Since you do not know where the macro will be used, it is important that body of the macro has a syntax that is equivalent to the statement it replaces. For example, the following macro will replace a single statement with two statements.
#define foo \
statement_1; \
statement_2
If this macro is used in an if statement like the one below, it will not have the intended effect.
if (condition)
foo;
After replacing the macro in this code, the if condition will be followed by two statements rather than one. This is probably not what you want because the if condition will only control the execution of the first statement.
if (condition)
statement_1;
statement_2;
The following example shows what the macro looks like when it is rewritten using the do loop idiom. Notice there is no ending semicolon in the definition; the semicolon will be provided by the statement that is replaced.
#define foo \
do { \
statement_1; \
statement_2; \
} while (0)
Now, when the macro is used, the if condition is followed by a single, compound statement, which will behave as you would expect.
if (condition)
do {
statement_1;
statement_2;
} while (0);
A similar problem occurs when the body of the macro contains an if statement without an else statement.
#define foo \
if (condition) \
statement
If this macro is used in another if statement that does have an else statement, the if statement in the macro body will steal the else that follows it.
if (condition)
foo;
else
bar;
Although the indentation of the else statement shows the intention that it should belong to the first if statement, it will actually be associated with the second if statement.
if (condition)
if (condition)
statement;
else
bar;
Using the do loop idiom in this instance, will terminate the if statement in the macro, so that it will not steal an else statement that happens to follow it.
if (condition)
do {
if (condition)
statement;
} while (0);
else
bar;
Using an empty do-while(0) loop is also a common way to write an empty statement in a macro definition. In older compilers, this was necessary to prevent the compiler from issuing a warning. For example:
#define do_nothing do {} while (0)
The current gcc compiler provides another method that can be used in place of the do-loop idiom as shown in the following example.
#define foo ({ \
statement_1; \
statement_2; \
})
برای تبدیل رشته به عدد مجموعه ای از توابع در stdlib.h (در بعضی کامپایلر ها cstdlib.h) تعریف شده که نحوه استفاده شان تقریبا یکسان است، یک پارامتر ورودی دریافت می کنند که همان رشته *char است و خروجی شان یک عدد که البته در هر کدام از این توابع نوع داده خروجی فرق می کند.
تابع ()atoi یک رشته را به عددی از نوع داده int تبدیل می کند که طبیعتا بدون اعشار خواهد بود، مثلا :
char a[] = "1234";
int i = atoi(a);
تابع ()atol یک رشته را به عددی از نوع داده long int تبدیل می کند که آن هم بدون اعشار خواهد بود، مثلا :
char a[] = "123456789";
long int i = atol(a);
تابع ()atof یک رشته را به عددی از نوع داده double تبدیل می کند که عددی اعشاری خواهد بود، مثلا :
char a[] = "1234.56";
double i = atof(a);
تابعی با نام ()strtol می تواند یک رشته را از مبنای عددی مشخصی به معادل عددی در مبنای 10 تبدیل کند،
مثلا یک رشته A3E که در مبنای 16 (هگزادسیمال) است را معادل عددی 2622 تبدیل کند.
پارامتر اول رشته مورد نظر است.
پارامتر دوم اختیاری است و می تواند انتهای رشته عددی را مشخص کند که غالبا با null یا 0 مشخص می شود.
پارامتر سوم مبنای عددی رشته است، مثلا 2 برای باینری (Binary) و 10 برای دسیمال (Decimal) و 8 برای اکتال (Octal) و ...
خروجی این تابع یک عدد صحیح در مبنای long int است.
مثلا:
char a[] = "A3E";
long int i = strtol(a, 0, 16);
تابعی با نام ()strtod شبیه ()atof است، با این تفاوت که پارامتر اختیاری دوم می تواند انتهای رشته عددی
را مشخص کند که البته عموما با همان مقدار 0 نادیده گرفته می شود.
مثلا :
char a[] = "3.14159";
double i = strtod(a, 0);
تابعی هم با نام ()strtoul شبیه به ()strtol می باشد، فقط فرق شان در این است که strtoul اعداد را بدون علامت
مثبت و منفی (unsigned) محاسبه می کند، یعنی خروجی اش unsigned long int است.
مثلا :
char a[] = "1010011";
unsigned long int i = strtoul(a, 0, 2);
برنامه ای که قرار داده میشود تست شده و به خوبی کار میکند. منبع برنامه از سایت sisoog.com میباشد. با کمی تغییرات برای مگا64 تست شده.
تغییراتی که در برنامه باید ایجاد کنید با توجه به سخت افزار خودتان: 1- تغییر در شماره وقفه ( Any change وقفه مورد استفاده باید قابلیت تشخیص هر تغییر در پایه را داشته باشد) 2- تغییر در خواندن وضعیت پایه وقفه در کتابخانه EV17xx_Decoder.c خط 57.
از این کتابخانه برای خواندن ریموت های کد فیکس هم میتوانید استفاده کنید.
متن توضیح گرفته شده از سایت sisoog.com :
متأسفانه سورس های زیادی وجود دارند که از منابع متنباز (OpenSource) کپی شدهاند و بهصورت تجاری در فضای اینترنت به فروش میرسند. سورس ریموت های کدلرن نیز از این دسته است. اگر سورس های متنباز وجود نداشتند شاید این میزان از پیشرفت در حوزه علم و تکنولوژی حاصل نمیشد. پس شایسته است که بهجای منفعت شخصی خود به منفعت جمعی بیندیشم و سورس هایی ازایندست را بفروش نرسانیم و با انتشار رایگان آنها نقشی در بالا بردن سطح دانش داشته باشیم.
ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموتهای درب بازکن تا ریموتهای دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی میکنند و آنهم ارسال اطلاعات بهصورت بیسیم است. بسترهای متفاوتی برای ارسال اطلاعات وجود دارد که از پرکاربردترین آنها، امواج مادونقرمز است که نمونهاش را همگی در ریموتهای تلویزیون و وسایل خانگی دیدهایم و نوع دیگر، ریموتهای رادیویی هستند که از امواج رادیویی برای ارسال دادهها استفاده میکنند. موضوع بحث ما، مورد دوم است: ریموتهای رادیویی. این ریموتها برای اینکه بتونند اطلاعات را منتقل کنند نیاز دارند که اول اطلاعات را روی یه موج دیگر که به آن موج حامل گفته میشود سوار (مدولاسیون) کنند. با این کار اطلاعات قابلیت انتشار در فضا را بهدست خواهند آورد.
مدلاسیون دو نوع آنالوگ و دیجیتال دارد که خود به انواع دیگری تقسیمبندی میشوند. در مدولاسیون، سیگنال فرکانس بالا (حامل) بر اساس سیگنال پیام تغییر داده میشود. سیگنال حامل خواص مختلفی ازجمله دامنه، فرکانس و فاز دارد که میتوانند بر اساس سیگنال پیام تغییر داده شوند و ازاینرو انواع مختلفی از مدولاسیون پدید میآید. (عکس زیر)
انواع مدلاسیون
همانطور که در عکس فوق مشاهده میکنید، در مدلاسیون AM سیگنال داده بر روی دامنهی موج حامل تأثیر میگذارد و در مدلاسیون FM سیگنال داده بر روی فشردگی سیگنال حامل (فرکانس) تأثیر میگذارد. این مدلایسون بهمراتب داری برد بیشتری نسبت به مدلاسیون AM است؛ چراکه در مدلاسیون AM کاهش دامنه به معنی کاهش توان فرستنده است. نوع بعدی مدلاسیون دیجیتال (Keying) است که درواقع نوعی از مدلاسیون FM محسوب میشود.
در مدارات دیجیتال ما با دو منطق صفر و یک سروکار داریم که برای انتقال به فرکانسهای F0 و F1 تبدیل میشوند. فرکانس F0 یعنی منطق 0 و فرکانس F1 یعنی منطق 1. در این روش کار گیرنده خیلی ساده است و باید بتواند تفاوت بین فرکانس F0 و F1 را تشخیص دهد و آشکار کند. در ریموتکنترلهای رادیویی برای ارسال داده از این نوع مدلاسیون یا مدلاسیون های مشابه استفاده میشود.
ریموتهای کدلرن از مدلایسون ASK برای ارسال داده استفاده میکنند. مدلاسیون ASK زیرشاخهی سادهشدهای از مدلاسیون دیجیتال است؛ فرکانس F0 از آن حذف شده است و فقط فرکانس F1 در آن استفاده میشود. یعنی وقتیکه منطق 1 باشد فرکانس F1 تولید میشود و وقتیکه منطق صفر است فرستنده خاموش میشود و هیچ سیگنالی تولید نمیشود.
مدلاسیون ASK
ترفند هم باعث سادهسازی فرستنده و هم گیرنده میشود؛ چراکه در فرستنده فقط باید فرکانس حامل با فرکانس F1 تولید شود و در گیرنده هم فقط باید فرکانس F1 شناسایی شود.
تا اینجا با نحوهی ارسال اطلاعات آشنا شدیم. برای ساخت یک ریموت کنترل ابتدا لازم است که امواج ارسالی از ریموت (فرستنده) را دریافت کنیم که بعد از پردازش بتوانیم عملی مناسب با درخواست کاربر را اجرا کنیم. با توجه به نوع فرستنده نیاز داریم که یک گیرنده ASK داشته باشیم که فرکانس آن با فرکانس ریموت یکی باشد، یعنی اگر از ریموت با فرکانس 433 مگاهرتز استفاده میکنیم گیرنده ASK نیز باید با همان فرکانس کار کند. در غیر این صورت مدار بهدرستی کار نخواهد کرد.
مطابق عکس زیر میتوانیم مدار گیرنده را خودمان بسازیم؛ اما با توجه به پیچیدگیهای بحث RF این کار توصیه نمیشود و بهتر است که از مدارها و ماژولهای آمادهی موجود در بازار استفاده کنید.
مدار گیرنده ask
معمولاً ریموتها در دو فرکانس 433 و 315 مگاهرتز موجود هستند. در خرید گیرنده دقت کنید که گیرندهی تهیهشده با فرکانس ریموت شما همخوانی داشته باشد. در حال حاضر دو نوع گیرنده ASK در بازار ایران یافت میشود:
مدل قدیمیتر درواقع یک گیرندهی ترانزیستوری ساده از نوع super regenerative است که دارای حساسیت و دقت کمتر و قیمت پایینتری است. این گیرنده نیاز به ولتاژ کاری 55 ولت دارد و خروجی داده صفر و یک دارد، ولی به دلیل ساختار و نحوه آشکارسازی، بسیار تحت تأثیر نویزهای محیطی قرار میگیرد. (عکس زیر)
مدل جدیدتر درواقع یک گیرنده super heterodyne است و دارای مدار پیچیدهتری برای آشکارسازی داده است. این گیرنده از کریستال کوارتز استفاده می کند؛ همین امر سبب میشود که هم کیفیت گیرندگی و هم دقت بالاتری داشته باشد.
این گیرندهها علاوه بر 5 ولت قادرند با 3.3 ولت نیز به خوبی کار کنند و خروجی داده هم دارند. درواقع چینش پایههای این دو نمونه گیرنده به نحوی است که بهراحتی میتوان آنها را جایگزین هم کرد. پس اگر گیرندهای دارید که از برد آن راضی نیستید میتوانید فقط ماژول ASK را به super heterodyne تغییر دهید و شاهد برد بهتر باشید.
بعد از دریافت دادهها و هموار شدن مسیر، نیاز است که پروتکل ارسال اطلاعات اینگونه ریموت ها را بشناسیم تا قادر به رمزگشایی آنها باشیم. اولین نکتهی مبهی که در خصوص ریموتهای کدلرن به ذهن میآید، خود واژه کدلرن است. درواقع تا قبل از فراگیر شدن این نوع ریموتها، ریموتهایکدفیکس وجود داشتند. ریموتهای کدفیکس دارای 8 پایه بودند که برای کد کردن آنها باید این پایهها را در حالات مختلفی به صفر و یک وصل میکردید و همین کار را در گیرنده نیز تکرار میکردید تا گیرنده و فرستنده باهم همخوانی داشته باشند و کار کنند. این عمل را کد دادن میگفتند.
کد دادن ریموت مد فیکس
دلیل نامگذاری کدفیکس هم این است که گیرندههای این نوع ریموت، کد ثابتی دارند و اگر بخواهید ریموت دیگری نیز با این گیرنده کار کند باید دقیقاً مطابق دیگر ریموتها کددهی شود. که البته این موضوع به لحاظ امنیتی مساله ساز است؛ چراکه اگر کد انتخابی شما را کسی متوجه شود بهراحتی میتواند یک ریموت سازگار با گیرنده شما بسازد.
اما ریموتهای کدلرن دارای امنیت بالاتری هستند. به این معنی که توسط شرکت یک کد 20 بیتی اتفاقی در حافظه آنها نوشته شده است. هر ریموت یک کد منحصربهفرد دارد و دو ریموت با کد یکسان وجود ندارد: بنابر این برای همگام کردن ریموتها با گیرنده، گیرنده باید قادر باشد که کد هر ریموت را در خود ذخیره کند تا در مواقع درخواست، چک کند که آیا ریموت معتبر هست یا نه. این عمل را اصطلاحاً لرن کردن میگویند. یعنی شما باید ریموت موردنظر خود را در گیرنده لرن کنید و برای همین هم به آنها ریموتهای کدلرن میگویند.
خوشبختانه پروتکل مورداستفاده در ریموتهای کد لرن مشابه است و فرقی نمیکند که شما از آیسی HS1527 یا EV1527 یا خانوادههای مشابه استفاده میکنید. همه از انکدر OTP استفاده میکنند.
OTP ENCODER
در این روش 24 بیت داده از ریموت ارسال میشود که بیست بیت اول همان کد منحصربهفرد برای هر ریموت است و 4 بیت انتهایی مربوط به وضعیت کلیدهای فشردهشده ریموت است. در ابتدای هر ارسال، یک وضعیت همزمانی (Preamble) ارسال میشود که ما با دریافت این همزمانی باید منتظر دریافت 24 بیت داده باشیم. با توجه به توضیحات ارائهشده، ما نیاز 3 حالت منحصربهفرد داریم: حالت اول برای ایجاد سیگنال همزمانی (Preamble)، حالت دوم برای ایجاد وضعیت 1 منطقی و حالت سوم برای ایجاد 0 منطقی.
توجه داشته باشید زمانهای ذکرشده بهعنوان مثال هستند. برای روشنتر شدن موضوع و درواقع میزان این زمانها با توجه به نوسانساز داخلی آیسی تعیین میشود ولی نسبتها بهصورت توضیح داده شده حفظ میشوند.
با توجه به اینکه کتابخانهی ریموت کدلرن در سال 2009 نوشته شده و بعدازآن هیچ تصحیحی روی آن صورت نگرفته بود، بخشهایی از کتابخانه برای عملکرد بهتر و اصولیتر شدن کد نوشتهشده، بازنویسی شد. اصلیترین قسمت بازنویسی شده مربوط به روال دکد کتابخانه است. در کتابخانهی قدیمی، حداکثر و حداقل طول پالس بر اساس میکروثانیه در برنامه تعریف شده بود. این مقادیر هنگام تغییر فرکانس کاری تایمر، مشکلساز میشدند و با تغییر این فرکانس، کد دیگر بهدرستی کار نمیکرد.
فرکانس 1 مگاهرتز و 2 مگاهرتز بهعنوان فرکانس شمارش تایمر مورد تست قرار گرفت که در هیچکدام مشکلی وجود نداشت و برنامه بهدرستی کار میکرد.
تغییر صورت گرفتهی بعدی، مربوط به روال ذخیرهسازی بیتهای دریافتی از ریموت است. در کتابخانه قدیمی از یک آرایه برای نگهداری هر بیت استفاده میشد که 24 بایت از حافظه Ram را اشغال میکرد.
برنامه دارای 3 حالت مختلف، جهت عملکرد است:
بعد از روشن شدن مدار، دستگاه در حالت نرمال است. در این حالت، LED بر روی برد، یک ثانیه روشن و یک ثانیه خاموش است.
در حالت نرمال، با فشردن هر یک از کلیدهای ریموت خروجی مربوطه تغییر وضعیت میدهد.
برای استفاده از یک یا چند ریموت خاص در کنترل خروجیها، لازم است ریموتها را به دستگاه معرفی کنیم. برای معرفی هر ریموت دستگاه باید در مود لرن باشد.
برای اینکه دستگاه وارد حالت لرن شود، کلید دستگاه را به مدت 1.5 ثانیه نگهدارید و سپس رها کنید. LED دستگاه شروع به چشمک زدن با سرعت زیاد خواهد کرد. بعدازآن یکی از کلیدهای ریموتی که قصد داریم از آن استفاده کنیم را میفشاریم تا دستگاه کد آن را به خاطر بسپارد. بعد از لرن کردن، ریموت دستگاه به حالت نرمال بازخواهد گشت.
برای حذف ریموتهای ذخیرهشده در حافظهی دستگاه، باید کلید را به مدت 10 ثانیه بفشارید و سپس رها کنید. LED به مدت 3 ثانیه روشن میشود و خاموش میشود. بعد از این کار تمام ریموتهای ذخیرهشده از حافظهی دستگاه پاک خواهند شد.
for (int i=0; i<2; i++)
{
DMA.CTRL = 0;
DMA.CTRL = DMA_RESET_bm;
while ((DMA.CTRL & DMA_RESET_bm) != 0)
DMA.CTRL = DMA_ENABLE_bm;
DMA.CH0.SRCADDR0 = (((uint16_t)addr[i]) >> 0) & 0XFF;
DMA.CH0.SRCADDR1 = (((uint16_t)addr[i]) >> 8) & 0XFF;
DMA.CH0.SRCADDR2 = 0;
DMA.CH0.DESTADDR0 = (((uint16_t)&USARTC0.DATA)>>0 & 0XFF);
DMA.CH0.DESTADDR1 = (((uint16_t)&USARTC0.DATA)>>8 & 0XFF);
DMA.CH0.DESTADDR2 = 0;
DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc;
DMA.CH0.TRFCNT = 5;
DMA.CH0.REPCNT = 0;
DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_DRE_gc;
DMA.CH0.CTRLA = DMA_CH_ENABLE_bm | DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc /*| DMA_CH_REPEAT_bm*/;
while(!(DMA.INTFLAGS & DMA_CH0TRNIF_bm));
_delay_ms(500);
}