ریموت کنترل 4 کاناله
در مقالههای قبل راجع به ریموت کدلرن و نحوه دکد کردن آن بهتفصیل توضیح دادهایم و سورس کتابخانهی مربوط به دکد ریموتهای مبتنی بر چیپست EV15xx را منتشر کردهایم. سورس مربوطه به زبان C و برای میکروکنترلر atmega8 نوشته شده بود. البته سورس فقط مربوط به نحوه دکد کردن کد ریموت بود و برای ساخت یک ریموت واقعی باید قسمتهای موردنظر را خود به آن اضافه میکردید. با توجه به استقبال و درخواست دوستان در خصوص تکمیل کد کتابخانه و همچنین ایجاد یک پروژه عملی، بر آن شدیم که با استفاده از کتابخانه مذکور، یک ریموت کنترل 4 کاناله کاملاً عملی بسازیم. برای ساخت ریموت کنترل 4 کانالهی رادیویی با سیسوگ همراه باشید.
شاید برای شما مفید باشد: آموزش AVR از 0 تا 100 به همراه جزوه PDF و ویدئو آموزشی
مجوز انتشار
قبلا در خصوص نرمافزار آزاد . آزادی نرمافزار توضیح دادهایم. بر همین اساس این پروژه را نیز کاملاً تحت همین مضمون است و آن را با مجوز GPL V3 منتشر میکنیم. تمام سورسکد و داکیومنتها در دسترس خواهند بود و کاربران برای ساخت و تغییر آن مجاز هستند. باوجود چنین مجوزی باز افرادی پیدا میشوند که نام نویسنده اصلی و ایجادکننده را از کد حذف میکنند و آن را به نام خود منتشر میکنند و یا حتی به فروش نیز میرسانند. ایجاد تغییرات و فروش این سورسکد مشکلی ندارد ولی حذف نام ایجادکننده و نویسندهی اصلی غیراخلاقی و غیرقانونی است. خواهشمندیم اگر با چنین مواردی مواجه شدید، حتماً آن را به ما اطلاع دهید.
شاید برای شما مفید باشد: کدلرن و نحوه ساخت ریموت
توضیح اجمالی در خصوص پروژه ریموت کنترل 4 کاناله:
برای ساخت پروژه از میکروکنترلر ATmega328p استفاده شده است. البته بهراحتی و با کمترین تغییر میتوان کد را برای دیگر میکروکنترلرها ازجمله mega8 نیز تغییر داد. دلیل استفاده از این میکروکنترلر وجود آن بر روی بردهای آردوینو است تا استفادهکنندگان قادر باشند در کمترین زمان ممکن با استفاده از بردهای آردوینو مدار را بسازند. در نمونه تستشده از برد Arduino Nano استفاده شده است با فرکانس کاری 16 مگاهرتز؛ چراکه مقدار پیشفرض بردهای آردوینو همین مقدار است ولی بهسادگی و با تعویض مقدار فرکانس در کامپایلر میتوان کد را روی پردازندههای دیگر نیز کامپایل کرد.
شاید برای شما مفید باشد: پروژه های آردوینو
جهت نوشتن کد از کامپایلر GCC و محیط توسعه Eclipse استفاده شده است. اما در صورت نیاز و با ساخت یک Makefile ساده میتوان کد را در محیط Shell یا کامپایلر Winavr نیز کامپایل کرد. البته برای استفاده در شبه کامپایلر کدویژن لازم است تغییرات مربوط به کامپایلر را در کد لحاظ کنید. البته تغییرات زیاد نخواهد بود و این کار بهراحتی قابل انجام است.
اصلاحات مربوط به کتابخانهی ریموت کدلرن
با توجه به اینکه کتابخانهی ریموت کدلرن در سال 2009 نوشته شده و بعدازآن هیچ تصحیحی روی آن صورت نگرفته بود، بخشهایی از کتابخانه برای عملکرد بهتر و اصولیتر شدن کد نوشتهشده، بازنویسی شد. اصلیترین قسمت بازنویسی شده مربوط به روال دکد کتابخانه است. در کتابخانهی قدیمی، حداکثر و حداقل طول پالس بر اساس میکروثانیه در برنامه تعریف شده بود. این مقادیر هنگام تغییر فرکانس کاری تایمر، مشکلساز میشدند و با تغییر این فرکانس، کد دیگر بهدرستی کار نمیکرد.
1 2 | #define Min_Pulse_Len 200 /* In us */ #define Max_Pulse_Len 15000 /* In us*/ |
مقادیر فوق بهکلی از برنامه حذف شد تا در صورت نیاز و تغییر فرکانس کاری تایمر موردنظر، خللی در اجرای برنامه و دکد به وجود نیاید. در بخش جایگزین شده، فقط از نسبت پالسها برای شناسایی نوع آنها استفاده شده است. با این راهکار شما میتوانید فرکانس کاری تایمر را با خیال آسوده تغییر دهید.
1 2 3 | #define IS_Sync_Start_Pulse(T1,T2) (T2 > (T1*29) && T2 < (T1*32)) #define Bit_IS_Zero(T1,T2) (T2 > (T1*2) && T2 < (T1*4)) #define Bit_IS_One(T1,T2) (T1 > (T2*2) && T1 < (T2*4)) |
فرکانس 1 مگاهرتز و 2 مگاهرتز بهعنوان فرکانس شمارش تایمر مورد تست قرار گرفت که در هیچکدام مشکلی وجود نداشت و برنامه بهدرستی کار میکرد.
تغییر صورت گرفتهی بعدی، مربوط به روال ذخیرهسازی بیتهای دریافتی از ریموت است. در کتابخانه قدیمی از یک آرایه برای نگهداری هر بیت استفاده میشد که 24 بایت از حافظه Ram را اشغال میکرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | uint8_t Remode_Data[24]; . . . . if(Start_Sync==1) // Start Sended { if(Bit_Index < 24) { Remode_Data[Bit_Index] = !Bit_IS_Zero(Time_Rising,Time_Falling); Bit_Index++; } else { // All Bit Recive Bit_Index = 0; Start_Sync = 0; Revice_Flag = 1; } } // End of Start Sync Send . . . |
در بازنویسی کتابخانه، هر بیت واقعاً یک بیت از حافظه را اشغال میکند و دادهها در یک متغییر Long ذخیره میشوند که تنها 4 بایت از حافظه را اشغال میکند. البته جدول lookup برای افزایش سرعت اضافه شده است که 128 بایت از حافظه Flash را اشغال میکند که با توجه به حجم 32 کیلوبایتی فلش، مقدار زیادی نیست.
شاید برای شما مفید باشد: ریموت هاپینگ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | volatile uint32_t EV_Code = 0; const uint32_t Bit_Shift[32] PROGMEM = { 0x00000001,0x00000002,0x00000004,0x00000008, 0x00000010,0x00000020,0x00000040,0x00000080, 0x00000100,0x00000200,0x00000400,0x00000800, 0x00001000,0x00002000,0x00004000,0x00008000, 0x00010000,0x00020000,0x00040000,0x00080000, 0x00100000,0x00200000,0x00400000,0x00800000, 0x01000000,0x02000000,0x04000000,0x08000000, 0x10000000,0x20000000,0x40000000,0x80000000, }; . . . . if(Start_Sync==1) // Start Sended { if(Bit_Index < 23) { if(Bit_IS_Zero(Time_Rising,Time_Falling)) { Bit_Index++; } else if(Bit_IS_One(Time_Rising,Time_Falling)) { Receive_Code |= pgm_read_dword(&Bit_Shift[(23-Bit_Index)]); Bit_Index++; } else { Start_Sync = 0; Bit_Index = 0; } } . . . |
و البته چند تغییر کوچک دیگر که باعث بهبود عملکرد کتابخانه شده است.
توصیه میشود که برای پروژههای خود، از کتابخانهی اصلاحشده استفاده نمایید.
سخت افزاری
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #define Key_Pin 3 #define Key_PORT PORTD #define Key_DDR DDRD #define Key_PIN PIND #define LED_Pin 4 #define LED_PORT PORTC #define LED_DDR DDRC #define CH0_Pin 0 #define CH1_Pin 1 #define CH2_Pin 2 #define CH3_Pin 3 #define CH_PORT PORTC #define CH_DDR DDRC RF_IN -> PORTD.2 Key -> PORTD.3 LED -> PORTC.4 CH0 ~ CH3 -> PORTC.0 ~ PORTC.3 |
شماتیک ریموت 4 کاناله را میتوانید از لینک زیر دانلود نمایید.
جهت مونتاژ و فراگیری اتصالات، میتوانید توضیحات فوق را مشاهده کنید. تمام پایهها بهجز RF_IN در برنامه قابلتغییر هستند.
در برنامه از Timer1 بهعنوان شمارنده استفاده شده است. دقت داشته باشید که به خاطر مسئله دقت در اندازهگیری طول پالسها، نیاز به یک تایمر 16 بیتی است. پس اگر قصد تغییر تایمر را دارید حتماً یک تایمر 16 بیتی را جهت انتقال انتخاب کنید.
توضیح عملکرد برنامه ریموت 4 کاناله
برنامه دارای 3 حالت مختلف، جهت عملکرد است:
1 2 3 4 5 6 | enum { Nurmal = 0, Learn, Erase, }; |
- حالت نرمال
- حالت لرن
- حالت پاک کردن
حالت نرمال:
بعد از روشن شدن مدار، دستگاه در حالت نرمال است. در این حالت، LED بر روی برد، یک ثانیه روشن و یک ثانیه خاموش است.
در حالت نرمال، با فشردن هر یک از کلیدهای ریموت خروجی مربوطه تغییر وضعیت میدهد.
حالت لرن:
برای استفاده از یک یا چند ریموت خاص در کنترل خروجیها، لازم است ریموتها را به دستگاه معرفی کنیم. برای معرفی هر ریموت دستگاه باید در مود لرن باشد.
برای اینکه دستگاه وارد حالت لرن شود، کلید دستگاه را به مدت 1.5 ثانیه نگهدارید و سپس رها کنید. LED دستگاه شروع به چشمک زدن با سرعت زیاد خواهد کرد. بعدازآن یکی از کلیدهای ریموتی که قصد داریم از آن استفاده کنیم را میفشاریم تا دستگاه کد آن را به خاطر بسپارد. بعد از لرن کردن، ریموت دستگاه به حالت نرمال بازخواهد گشت.
شاید برای شما مفید باشد: همه چیز درباره دیکد نرمافزاری MP3 به کمک میکروکنترلر
حالت پاک کردن:
برای حذف ریموتهای ذخیرهشده در حافظهی دستگاه، باید کلید را به مدت 10 ثانیه بفشارید و سپس رها کنید. LED به مدت 3 ثانیه روشن میشود و خاموش میشود. بعد از این کار تمام ریموتهای ذخیرهشده از حافظهی دستگاه پاک خواهند شد.
دانلود سورس کد پروژه ریموت کنترل 4 کاناله
برای سهولت در دسترسی به کد و مشاهده بخشهای مختلف بدون نیاز به دانلود، همچنین امکان ارتقاء، سادگی در رفع عیوب احتمالی و نگهداری تاریخچه کد، کدهای پروژه در سرور Github آپلود شده و هماکنون در دسترس است.
برای مشاهده repositorie میتوانید به این آدرس مراجعه کنید.
و برای دانلود کد کامپایل شده و سورسکد می توانید به این آدرس مراجعه کنید.
سلام .. ممنون از لطف زیادتون …. یه سوال… با یان کتابخانه ماکزیمم ریموت کنترل چند کانال رو میتونه دیکد کنه ؟ به 4 تا محدوده یا بیشتر میشه ؟
ببینید خود کتابخانه که محدودیتی نداره ولی حافظه میکرو رو باید نگاه کرد
فکر میکنم همین کد بتونه ۱۰ تا ریموت رو ذخیره کنه
مشکلی که دارم اینه که من میخام کل کد ریموت رو به صورت بیت 0 و 1 داشته باشم که بتونم همون کد رو با میکرو تولید کنم و با فرستنده ریموت ارسال کنم و یعنی اون ریموت رو در اصل من کپی کرده باشم
اول اینکه الان با این تیکه کدی که نوشتم داخل main :
if(IS_Recive_Valid_Remote()){ /*If Have Code For Remote*/
uint32_t Rcode = Get_Remote_Code_long();
unsigned int bytes[4];
bytes[0] = Rcode & 0xFFFFFFFF;
bytes[1] = (Rcode >> 8) & 0xFFFFFFFF;
bytes[2] = (Rcode >> 16) & 0xFFFFFFFF;
bytes[3] = (Rcode >> 24) & 0xFFFFFFFF;
sprintf(char_arr, “%d”,bytes[0]);
SendString(char_arr);
sprintf(char_arr, “%d”,bytes[1]);
SendString(char_arr);
sprintf(char_arr, “%d”,bytes[2]);
SendString(char_arr);
sprintf(char_arr, “%d”,bytes[3]);
SendString(char_arr);
SendString(“\r”);
بنده از 2 ریموت مختلف ، کد های زیر رو دریافت میکنم:
3490-143232000
3490-143232000
3496-143232000
3496-143232000
3496-143232000
3492-143232000
3492-143232000
3489-143232000
3490-143232000
-6172-87292210
-6172-87292210
-6172-87292210
-6172-87292210
-6175-87292210
-6175-87292210
-6172-87292210
-6172-87292210
-6172-87292210
که همینطور که مشخصه بنده بیت هارو ندارم ، باید چیکار کنم؟
مثلا اگر از اون قسمت جدول لوکاپ استفاده نکنم میشه بیت هارو به دست آورد؟ به چه صورت؟
تشکر و ممنونم ازتون
سلام
اینگونه سوالات رو که در مورد خود مطلب نیست رو در انجمن سیسوگ مطرح کنید تا دوستان راهنمایی کنند
ask.sisoog.com
سلام
خسته نباشید ، بعد از دیکد کردن ریموت ، میتونیم با فرستنده همین کد رو ارسال بکنیم؟
یعنی همون ریموت رو کپی کنیم دقیقا
بله
ولی خوب برنامه اون قسمت رو باید خودتون بنویسید
درود برشما
بالاخره درست شد
مشکل از ماژول گیرنده ام بود
بعد از تعویض چند عدد حل شد مشکل _متاسفم برای فروشگاههایی که اجناس خراب یا تقلبی عرضه میکنن
و
ممنون از شما بابت برنامه درجه یک تون
ممنونم.برنامه رو آوردم داخل اتمل استودیو تا برای اتمگا8 پورتش کنم و تاجایی که چشمام دید رجیسترهای وقفه صفر نسبت به اتمگا328 متفاوت بود و تغییرات رو اعمال کردم _ یوزارت و کلیه خطوط مربوطه روو هم کامنت شون کردم چون فعلا نیاز به راه اندازی اولیه داشتم و یک چک کلی کردم همچنین یک هدرglobal هم دارم که خودم برای avr مقدارF_CPU رو اونجا تنظیم میکنم و روی 16مگاهرتز دیفایت کردم __سپس بیلد و توی تنظیمات دیوایس برای برنامه ریزی،،، فیوزبیت کلاک رو_روی high frequency بامقدار استارت 64 میلی ثانیه قرار دادم مابقی فیوزبیت ها رو هم دستکاری نکردم و سپس برنامه ریزی با stk500 انجام دادم _طرح مشکل = حالت نرمال روی چشمک زن سریعی داره و اصلا روی لرن نمیره کلا بنظر میرسه انگاری کلاک اشتباهه چون که وقتی مقادیر کلاک رو روی 1 مگاهرتز داخلی تنظیم میکنم اون سه حالت نرمال لرن و پاک کردن براساس مقدار چشمک زن درست اجرا میشه ولی لرن نمیکنه و باز گفتم شاید 1 مگ اشتباهه آوردم روی 16مگ که =اینطوری شد ___کجا اشتباه کرده ام ؟
سلام و تشکر
بنده متاسفانه از کدویژن استفاده می کنم. فایل EV17xx_Decoder رو با نوت پد باز کردم.
اون قسمتش که 23 بیت رو داخل if و بیت آخر رو داخل else دریافت می کنید معادل سه واحد برنامه نویسیه. حسن اون کار حذف یک شرطیه که قرار بود داخل if اصلی 24 بار بررسی بشه و فقط یک دفعه اجرا بشه. دمت گرم.
فقط یه سوال چرا لوک آپ 32 تایی تشکیل دادید؟ فکر می کنم 24 تایی هم جوابگو بود!
سلام دوست عزیز
متشکرم، احتمالا قصد داشتم کار دیگری کنم که بعد پشیمان شدم و لوک آپ تیبل رو به حال خودش رها کردم
سلام این برنامه با 315 کار میکنه یا 433 ؟ و اینکه اگر بخوایم تغییر بدیم باید چیکار کنیم چون من با 315 جواب گرفتم چجوری تبدیل به 433 بکنم؟
سلام با هر دو کار میکنه
فقط کافیه ماژول گیرنده رو عوض کنید.
سلام من نتونستم باهر طرفندی راش بندازم کسی هست راهنمایی کنه
سلام دوست عزیز الان دقیقا مشکل شما کجاست ؟
درود برشما
تعریف تمجید(…)==(زیاد هست جا نمیشه)
هنوز برنامه رو ندیدم
ی سوالی از خوندن مطالب این پست و پست قبلی برام پیش اومد :
اینکه میگین پاک کردن ریموت ها دقیقا یعنی چی؟
یعنی مثلا ۱۰تا ریموت که میشه با ۱۰نوع کدآیدی (۲۰بیت اول)متفاوت رو میگیره و با هر ۱۰تاش جواب میده ؟عدد ۱۰ رو مثال گفتم..
یا هربار که کلید لرن یک و نیم ثانیه ای رو میفشاریم چی میشه اگر یک ریموت رو با آیدی منحصربفردخودش قبلا بهش شناسونده باشیم؟
درود بر شما دوست عزیز
خواهش میکنم نظر لطف شماست، با معرفی ما به دوستان خودتون به ما اندگیزه برای ادامه میدهید 🙂
ببینید فرایند اینطوریه که کد مقدار مشخصی ریموت رو در حافظه اش نگه میداره، مثلا ۱۰۰ تا، شما می تونید ۱۰۰ ریموت منحصر به فرد رو توی حافظه ذخیره کنید، اگر ریموتی تکراری باشد ذخیره نمی شود یعنی همون یک باری که ذخیره شده کفایت میکنه و مجدد خانه جدیدی از حافظه رو اشعال نمی کند
پاک کردن هم یعنی کل حافظه رو خالی میکنه و دیگه هیچ ریموتی رو نمیشناسه تا ریموت های جدید بهش داده بشه
ممنونم.برنامه رو آوردم داخل اتمل استودیو تا برای اتمگا8 پورتش کنم و تاجایی که چشمام دید رجیسترهای وقفه صفر نسبت به اتمگا328 متفاوت بود و تغییرات رو اعمال کردم _ یوزارت و کلیه خطوط مربوطه روو هم کامنت شون کردم چون فعلا نیاز به راه اندازی اولیه داشتم و یک چک کلی کردم همچنین یک هدرglobal هم دارم که خودم برای avr مقدارF_CPU رو اونجا تنظیم میکنم و روی 16مگاهرتز دیفایت کردم __سپس بیلد و توی تنظیمات دیوایس برای برنامه ریزی،،، فیوزبیت کلاک رو_روی high frequency بامقدار استارت 64 میلی ثانیه قرار دادم مابقی فیوزبیت ها رو هم دستکاری نکردم و سپس برنامه ریزی با stk500 انجام دادم _طرح مشکل = حالت نرمال روی چشمک زن سریعی داره و اصلا روی لرن نمیره کلا بنظر میرسه انگاری کلاک اشتباهه چون که وقتی مقادیر کلاک رو روی 1 مگاهرتز داخلی تنظیم میکنم اون سه حالت نرمال لرن و پاک کردن براساس مقدار چشمک زن درست اجرا میشه ولی لرن نمیکنه و باز گفتم شاید 1 مگ اشتباهه آوردم روی 16مگ که =اینطوری شد ___کجا اشتباه کرده ام ؟
منم هرچه تلاش کردم از تعویض میکرو و آردینوهای مختلف و دستکاری فیوزبیت ها_چک اتصالات و خیلی موارد دیگه اما ریموت رو لرن نمیکنه _ آردینو گذاشتم و فقط کدهگز پروگرام کردم _ همه چی اوکی کار میکنه ولی لرن نمیکنه
باسلام و درود،توضیحات میگه تایمر ۱۶ بیتی باش ولی اینجاشو نمیفهمم مگه منظورش ورودی میکرو از گیرنده نیس پس چرا خودش تو شماتیک لحاظ نکرده
تایمر 1 oc1A,Bو هیچی بهش وصل نیستش
بلاخره جواب گرفتم
گفتم تشکر کنم ازین سایت عالی
واقعا زحمت می کشید و با صبر جوابگو هستید.امیدوارم همیشه موفق باشید
خبره خیلی خوبیه
موفق باشید
سلام میش منم کمک کنید بعد از کلی تلاش موفق نشدم
ببخشید میشه این خط رو توضیح بدید چیکار می کنه
Receive_Code |= pgm_read_dword(&Bit_Shift[(23-Bit_Index)]);و
واینکه Bit_Shift چیکار قراره بکنه
سلام دوست عزیز در واقع shiftbit یه ارایه است که توی فلش تعریف شده
این خط در مجموع معادل خط زیر رو انجام میده
Receive_Code |= 1<<(23-Bit_Index);
اما با سرعت بیشتر چون میکروی ما ۸ بیتی است برای شیفت دادن از اون مکانیسم استفاده کردیم
EE_Format
EE_FindFreeIndex
EE_StoreCode
EE_StoreCode
EE_ISValidCode
سلام میشه این 5 تا زیر برنامه رو توضیح بدید چجوری أخیره انجام میشه با تشکر
سلام دوست عزیز
ببینید سورس تک تک فانکشن هایی که گفتید موجود و با خواندنش به راحتی خواهید فهمید چکار میکنند
و چطور کار میکنند، این مجموعه توابع در واقع کار ذخیره سازی آدرس ریموت ها رو توی حافظه انجام میدن – حالا به راحتی شما با هر ساختار دیگری که دوست دارید میتوانید بازنویسیش کنید
منظورم این کتابخانه (زیربرنامه)eeprom_store.c بود
سلام میشه این کتابخونه رو توضیح بدید اولا چرا پسوند c , h داره و با هم فرق می کنند و چطوری کار می کنن
سلام دوست عزیز
مساله اینه که هر کتابخانه استانداری نیاز به هر دوی این فایل ها دارد ولی چون شما از کدویژن استفاده می کنید مساله پیش آید چون کدویژن از قالب استاندارد کتابخانه های سی پشتیبانی نمیکند قبلا در این رابطه مقاله ای نوشتم
چرا کدویژن نه!
اما چکار باید بکنید – ساده است در انتهای فایل h فایل c را اینکلود کنید فکر میکنم مشکل حل بشه
سلام
لطفا برنامه keeloq tool v2.00.04 یا همین نسخه 05 رو اگه دارید بزارید لینکشو یه جایی تا دانلود کنم.
یه مطلب نوشتید در این مورد که پیداش نکردم زیر اون بنویسم
اگر لطفا کنید ممنون میشم یه جا آپلود کنید
واینکه این پروژه هم که اینجا گذاشتید دستتون درد نکنه ولی همه بحثش روی آردوینو است ومیکرو هم avr atmega پس چرا سورسش به mplab هست؟
بابت سایت خوبتون تشکر
سورس که برای avr نوشته شده فقط از سخت افزار arduino استفاده شده فقط همین
سلام.
خیلی ممنونم از آموزش خوبتون.
من با توجه به توضیحات شما یه برنامه نوشتم و برنامه به درستی کار کرد فقط مشکل من استفاده از وقفس گیرنده نویز داره و همینطور داره به میکرو 0 و 1 میده و به ازای هر لبه هم در میکرو یک وقفه ایجاد میشه برنامه ای که من دارم روش کار میکنم فقط ریموت نیست چیزهای دیگه هم داره که میشه چندین هزار خط کد! پس جالب نیست در برنامه هر چند میلی ثانیه وقفه ایجاد بشه برنامه ریموت رو بدون وقفه نوشتم درست کار میکرد در محتوای برنامم هم هیچ delay ای هم نذاشتم ولی به مرور که حجم کدهام زیاد شد دیگه کار نکرد میخواستم بدونم راهی هست برای حذف نویز گیرنده به طوری که اگر فقط ریموت فشرده بشه پالس ها ایجاد بشن و همینطوری نویز نده که من بتونم از وقفه استفاده کنم؟
سلام دوست عزیز
متاسفانه این وقفه ها هست و هیچ کارش نمیشه کرد
نویزهای محیطی است که خیلی روی ماژول های ASK تاثیر داره
تنها راهش بهینه کردن تا جای ممکنه برنامه درون اینتراپت است و هیج راه دیگه ای نیست که معقول باشه البته
درود.
سپاس بابت کد بسیار مفیدتان.
یک سوال دارم .
من کد رو روی Atmega8 پیاده کردم و ظاهرا مشکلی نداشت ولی چون فرستنده ریموت در دسترس نبود خود فرستنده رو با یک میکرو دیگه شبیه سازی کردم .
تایمینگ پالسهای تولیدی رو با لاجیک آنالایزر برسی کردم که درست بود . از طریق ماژول که اصلا کار نکرد و بعد از بررسی در نهایت برای جلوگیری از هر شبه ای در انتقال درست بیتها فرستنده رو بدون واسطه و با سیم به گیرنده وصل کردم . !!!
و جالب هست بازهم کار نکرد و لی بعد از تغییر اون پارامترهایی که نسبت بین زمان ۱و۰ رو مشخص میکنه به کار افتاد!!!
شما تنظیم کرده بودید که نسبت برای بیت های معمولی بین ۲ تا ۴ و حالت شروع بین ۲۹ تا ۳۱ باشه .
من این مقادیر ه صورت ۱ تا ۵ برای بیتهای معمولی و ۲۰ تا ۵۰ برای حالت شروع به کار تنظیم کردم تا کار کرد !!!
حالا سوال :
چرا با وجود تایمینگ دقیق از سمت فرستنده کار نمیکرد ؟
سلام خسته نباشید ممنون از راهنماییهای خوبتون من بعد اینکه فایل hexرو به میکرو پروگرامش کردم فقط ال ای دی 15 ثاتیه روشن میمونه و 15 ثانیه خاموش میشه هیچ کاری نمیدونم بکنم مشکل از کجا ممکنه باشه ممنون
احتمالا فیوزبیت ها رو درست تنظیم نکردید !
سخت افزار همین سخت افزار هست دیگه ؟
سلام و ممنون بابت همه مطالب مفیدتون.
ببخشید میخواستم ببینم اون نت لیبلی که در شماتیک استفاده کردید مثلا در RF_in کجاست دقیقا؟؟/
منظورم اینه که آلتیوم خودش داره یا از کتابخونه خودتون اضافش کردید؟
سلام دوست عزیز
نه یه پین هدر ۴ پایه گذاشتم برای اتصال به ماژول ask و این نت از اونجا روی پین هدر میاد
با سلام خدمت مدیران محترم سایت سیسوگ.
اولا ممنون از برنامه عالی شما که بصورت رایگان در اختیار مردم قرار میدید.
دوم اینکه بنده این برنامه رو بعد از تغییراتی در پروژم استفاده کردم و همه چیز عالی پیش میرفت تا اینکه نیاز شد توی پروژه تشخیص بدیم کلید فشرده شده توسط کاربر چند ثانیه نگه داشته میشه.
بررسی کردم دیدم ریموت هایی که مربوط به دزدگیر خودرو هستند مثلا برند هوتای بصورت پشت سر هم دیتای کلید فشرده شده رو ارسال میکنند. این ریموت ها از ht2240 استفاده میکنند. اما ریموت هایی که آیسی ev1527 دارند ، بصورت پشت سر هم دیتا رو ارسال نمیکنه. یعنی فقط یکبار ارسال میکنه.
با این شرایط با ریموت های ev1527 نمیتونیم زمان فشردن کلید رو اندازه گیری کنیم.حتی ریموت هایی که pt2240 هشت پایه داشتند هم دیتا رو مرتبا ارسال نمیکنه.
یا شاید من دارم اشتباه کد نویسی میکنم؟
آیا این مشکل راه حلی داره؟ اگر آره خیلی خیلی ممنون میشم راهنماییم کنید.
با تشکر.
سلام دوست عزیز
خواهش میکنم ما این کار رو وظیفه اجتماعی خودمون میدونیم
من فکر میکنم یع جایی توی برنامه نویسی مشکل داره پیش میآد
آیسی های ev هم کد کلید و هم شناسه رو پشت سر هم تا مادامی که دستتون روی کلید هست ارسال میکنند 🙂
به سادگی با وصل کردن خروجی گیرنده به یه لاجیک آنالایزر میتونید این مهم رو ببینید
بله حرف شما کاملا درسته. بیشتر تحقیق کردم و دیدم که ev1725 هم دائم کد رو میفرسته(البته بدون لاجیک آنالایزر و اسیلوسکوپ چون ندارم). اما نمیدونم چطور میتونم این رویه رو تشخیص بدم.
روش من اینطوریه که بعد از دریافت کد و تشخیص ریموت ذخیره شده ، عملیات کلید فشرده شده رو انجام میدم و بعدش توی یه لوپ ۱۰۰ ملی ثانیه صبر میکنم. اگر فلگ ۱ شد یعنی بازم دست روی کلید هست. دوباره فلگ رو ۰ میکنم و ۱۰۰ میلی ثانیه صبر میکنم. تعداد صبر کردن هارو میشمارم و نتیجه میشه زمان فشرده شدن کلید.
دقیقا همین روش روی ریموت های دزدگیر خودرو هوتای که آیسی ht2240 دارند کار میکنه اما با ریموتهایی که ev1527 یا pt2240 دارند کار نمیکنه. مطمئنم که ev1527 هم دائم کد رو میفرسته ، اما دلیل خطای برنامم رو اصلا متوجه نمیشم.
این کار بد نیست ولی باید دقت داشته باشید ممکنه دریافت بیش از ۱۰۰ میلی ثانیه طول بکشه
جایی نیاز بود من هم چنین کاری انجام بدم زمان رو ۵۰۰ میلی ثانیه در نظر گرفته بودم مشکل خاصی ندیدیم
ببخشید امکانش هست من با شما توی واتساپ یا تلگرام در ارتباط باشم و راهنمایی بیشتری بگیرم؟
من واقعا گیر کردم. چون اسیلوسکوپ و لاجیک آنالایزر ندارم واقعا سخته.
ممنون میشم مستقیم راهنماییم کنید.
سلام
ببخشید من تنها یک شماره شخصی دارم که برای مسايل کاری ازش استفاده نمیکنم
اگه نکته مجهولی هست بتونم همینجا کمک کنم خوشحال میشم
مهندس ممنونم از پیگیری هاتون.
بعد از کلی کلنجار رفتن و چک کردن و تغییر دادن خط به خط برنامه جواب این معما رو پیدا کردم و مشکل حل شد.
اما وظیفه خودم دونستم بیام و راه حل رو همینجا بگم تا شاید یکی بعد از من این مشکل رو داشت با خوندن نظرات مشکلش حل بشه:
توی EV17xx_Decoder قسمت IS_Sync_Start_Puls و همچنین Bit_IS_Zero و همچنین Bit_IS_One نسبت ها رو تغییر دادم و به شکل زیر نوشتم:
#define IS_Sync_Start_Pulse(T1,T2) (T2 > (T1*27) && T2 (T1*1) && T2 (T2*1) && T1 < (T2*5))
مشکل حل شد.
ازونجایی که گیرنده بار اول سیگنال رو به درستی دیکد میکرد اما با نگه داشتن کلید دیگه نمیتونست دیکد کنه , به نظر بنده دلیل این مساله میتونه از نادرست ارسال شدن سیگنال توسط ریموت باشه که ابتدای ارسال سیگنال رو درست میفرسته اما بعدش یکم نسبت ها بهم میریزه. بازم اساتید بهتر میدونن , من بدون اسیلوسکوپ یا لاجیک آنالایزر یا هرچیز دیگه ای به این نتیجه رسیدم.
موفق باشید.
سلام
بسیار خوشحالم که توانستید مشکل رو حل کنید و متشکرم برای این که تجربه خودتان را با دیگران نیز به اشتراک میگذارید 🙂
احتمالا مساله به کیفیت فرستنده یا گیرنده مربوط میشه چون نسبت ها نباید بهم بریزه مگر این که گیرنده یا فرستنده سرعت عمل لازم رو نداشته باشن (توی صفر یا یک شدن سیگنال تاخیر پیش بیارن) و اینطور ممکنه نسبت ها جابجا باشه
و البته باید بهتون تبریک بگم چون پیدا کردم این دست مشکل ها بدون اسکپ و لاجیک کار سختی هست که شما از پسش بر آمدید 🙂
موفق و پیروز باشید.
سلام
تشکر از پاسختون ، اون پرسش و پاسخ بسته شد مجبور شدم دوباره دیدگاه جدید بنویسم
با تغییر در نسبت های IS_Sync_Start_Pulse تونستم سرعت خواندن کد رو بالا ببرم ولی سوال اینکه برای بدست آوردن دقیق نسبت ها باید چیکار کنم؟ اسیلوسکوپ؟
و مورد بعدی اینکه ، کد ریموت هارو برای لرن کردن میخام توی ایپرام ذخیره کنم ، ولی محتوای متغیر (Rcode&0xFFFFFFF0) یه عدد 3 رقمی هست ، مثلا 200 یا 220 برای ریموت ها من ، آیاد کد همینه ؟
سلام دوست عزیز
ببینید طبق دیتاشیت نباید نسبت ها متغییر باشه ولی اتفاقی که توی واقع می افته کیفیت مدار فرستنده و گیرنده باعث جابجا شدن نسبت ها میشه ولی خوب این تغییر زیاد نیست و اگر شما یه ترشلد در نظر بگیرد خیلی بهتره – اسیلوسکپ خوبه ولی کار شما با یه لاجیک آنالیزر هم حل میشه
در مورد این که میگید خروجی داره عددش تغییر میکنه خوب منطقا یه جای کار داره میلنگه ! – چون جز ۴ بیت پایین باقی بیت ها باید ثابت و بودن تغییر باشند
شماره آیسی ریموت چیه ؟
پس بهتره که با لاجیک آنالایزر نسبت های دقیق رو بدست بیارم
شماره آیسی EV1527 هست ولی منظورم این نبود که کد دریافتی ریموت تغییر میکنه ، منظورم این بود که الان ۲ تا ریموت دارم ، و کد هایی که برنامه براشون میده برای یکی ۲۰۰ و برای دیگری ۲۲۱ هست ، باید همینارو توی ایپرام ذخیره کنم؟ یعنی برنامه کد هارو ۳ رقمی میکنه؟ (منظورم مقدار Rcode هست ، مقدار Rkey به درستی شماره دکمه رو میده)
منطقا rcode نباید اینقدر کوتاه باشه – حالا ممکنه هم باشه ! واقعا نمیشه در موردش نظری داد تا داده ها رو بیت به بیت تست نکنی
واقعا ممنون از پاسخ هاتون
کدوم بیت های rcode مربوط به کد ریموت هست؟
و اینکه من rcode رو توسط دستور زیر میریزم داخل یه رشته و روی پورت سریال نمایش میدم ، و همون عدد 200 رو برای یه ریموت و عدد 221 رو برای یه ریموت دیگه روی پورت سریال مشاهده میکنم
حتی اگر با 0xFFFFFFF0 هم اندش نکنم بازم همون 200 و 221 رو مشاهده میکنم
دلیلش چی هست؟
سلام –
ببینید ریموت ۲۴ بیت ارسال میکنه که ۴ بیت انتهایی مربوط به کلید ها است و ۲۰ بیت انتهایی باید ثابت باشه وقتی که ما کد دریافتی از ریموت رو با مقدار 0xFFFFFFF0 اند میکنیم یعنی داریم ۴ بیت ابتدایی رو دور میریزیم (بخش متغییر رو) و خروجی برای یک ریموت یکتا باید یکی باشه ، در واقع با این کار داریم ۲۰ بیت ثابت ریموت رو جدا میکینم 🙂
حالا وقتی دارید این کار رو میکنید و باز عدد 221 دریافت میکنید مشکل از جای دیگه است و فکر میکنم مروبط به کامپایلر باشه (احتمالا برای نمایش اعداد)
حالا چرا اینو میگم بخاطر این که وقتی شما هر عددی رو با 0xFFFFFFF0 اند کنید چهار بیت کم ارزش حتما باید صفر باشه ولی در عدد ۲۲۱ بیت اول (کم ارزش ترین بیت) یک هست که تناقض منطقی ایجاد میکنه با چیزی که باید اتفاق بیفته
این دستور هست:
sprintf(char_arr, “%d”,(Rcode&0xFFFFFFF0));
با سلام و خسته نباشید
بنده پروژه رو میخام با STM8S003F3P6 پیاده کنم
اول اینکه تنظیمات تایمر باید به چه صورت باشه یعنی آیا تایمر AutoReload داشته باشه یا خیر؟ اگر بله که مثلا مقدار اتوریلود چقدر باید باشه
و اینکه این قطعه کد:
uint32_t Rcode = Get_Remote_Code_long();
uint8_t Rkey = (Rcode&0xFF);
sprintf(char_arr, “%d”, Rcode);
SendString(char_arr);
رو داخل حلقه اصلی برنامه گزاشتم و کلی تغییر توی تایمر و نسبت ها هم دادم و همش 0 برمیگردونه
سلام دوست عزیز
خوب باید بگم کار ساده ای در پیش ندارید ولی خوب کار نشدی هم نیست و امید و انگیزتون رو از دست ندید – من خیلی با این مدل میکرو کار نکردم ولی در مورد کد ببینید شما به یه بیس زمانی دقیق لازم داریم که با استفاده از یک تایمر ۱۶ بیت که فرکانس اونو روی ۵۰۰ کیلو هرتز تغیین کردید (یک مگاهرتز مقدار بهتری است البته اگر میکروی شما به اندازه کافی سریع باشه) میتونید ایجادش کنید – برنامه طوری نوشته شده به سادگی قادر باشید اونو برای انواع معماری های موجود پورت کنید.
در مورد خطا یابی برنامه شما میتونی اول یا یک کردن یه پایه ببینی برنامه شما سیگنال همزمانی رو دریافت میکنه یا نه – اگر اون اکی بشه احتمالا بقیه قسمت ها به خوبی کار خواهند کرد.
if(IS_Sync_Start_Pulse(Time_Rising,Time_Falling)) /* Start*/
{
Start_Sync = 1;
}
اینجا که داریم Start_Sync رو یک میکنیم میتونید یه خروجی رو یک کنید و ببینید این سیگنال تشخیص داده میشه یا نه
ممنون و تشکر از پاسختون
درست شد
فقط مشکلی که هست اینه که باید چند بار پشت سرهم دکمه ریموت رو بزنم تا کدش خونده بشه
به نظرتون مشکل کجاست؟
سلام دوست عزیز
اول این که خوشحالم که تونستید مشکل رو حل کنید 🙂
در رابطه با موضوعی که فرمویدید – اولین ایده ای که به ذهنم میرسه کیفیت نا مناسب ماژول گیرنده می تونه باشه (از مدل های کریستال دار استفاده کنید)
مساله دوم دقیق نبودن کلاک میکروکنترلر میتونه دخیل باشه
شاید اعداد اعمال شده برای طول پالس ها رو بتونید دست کاری کنید و دقت بهتری بگیرید.
سلام وقتتون بخیر .
مهندس امکانش هست بنده رو هم راهنمایی کنید در خصوص دیکد کردن دیتا با میکرو stm8s003 ؟
هر چقدر تلاش کردم به نتیجه ای نرسیدم
تشکر از پاسختون ،البته اینی که الان مینویسم مربوط به آخرین پاسختون هست
با تغییر در نسبت IS_Sync_Start_Pulse سرعت خواندن رو بالا بردم ، فقط اینکه برای اینکه بتونم نسبت های دقیق رو بدست بیارم باید چیکار کنم؟
و اینکه برای لرن کردن ، بنده (Rcode&0xFFFFFFF0) رو روی ایپرام میریزم ، ولی این Rcode یه عدد 3 رقمی هست ، مثلا 200 یا 221 ، آیا همین کد ریموت هست؟
پروژه ریموت کنترل 4 کاناله کاملا رایگان به همراه مستندات
سلام خسته نباشید
فایل های مورد نظر در پوشه ها میخواهم باز کنم متاسفانه نام نرم افزار ان را نمیدانم
کد برنامه نویسی داخل فایل ها هست
لطفا راهنمایی کنید
سلام دوست عزیز
این برنامه با استفاده از کامپایلر gcc کامپایل میشه
و از ویرایشگر eclipse هم برای نوشتن برنامه استفاده شده که میتونید با نصب پلاگین avr-eclispe از اون استفاده کنید و پروژه را توی ایکلیپس ایمپورت کنید
سلام وقت بخیر.
ببخشید در برنامه کد ویژن برای من این ارور رو میده
میشه تغییرات را ذکر کنید برای کد ویژن
سلام نیازه به تغییرات جزئی و البته زیادی هست که نمیشه در دو خط ذکر کرد به هر حال باید متوحه برنامه بشید و اون را انتقال بدید
سلام، ممنون از برنامه و توضیحاتتون
من برنامه شما را در Atmel studio تونستم که Build کنم و با atmega328p مدار را پیاده کرده ام. متاسفانه مدار به هیچ وجه به فشاردادن کلیدی از ریموت عکس العمل نشان نمی دهد. وقتی با سوئیچ وارد مد لرن شده و ریموت را می زنم، led همچنان در وضعیت چشمک سریع باقی می ماند و به مد نرمال برنمی گردد با بررسی برنامه متوجه شدم که در صورت یک شدن recieve_flag و خواندن درست کد ریموت در روتین وقفه، برنامه در سایر قسمت ها می تواند درست عمل کند. مشکل من در روتین وقفه است و اصلا وارد قسمت //all bit receive نمی شود. در دو مساله شک دارم:
1) مشکل در گیرنده باشد که از نوع ASK 315MHz سوپرهترودین است و همیشه در خروجی دیتا دارای نویز است و در حالت فشردن ریموت ولتاژی حدود 1.5 ولت میدهد. با led هم خروجی دیتا را چک کردم و موقع زدن ریموت led پررنگ می شود.
2) مشکل در زمانبندی باشد. ریموت دارای مقاومت 330K و باتری 12 ولت است که طبق توضیحات شما هر پالس 11.5 میکروثانیه طول خواهد کشید که در برنامه کلاک تایمر 2مگاهرتز تنظیم شده و نباید مشکلی داشته باشد.
چند روزی است که درگیر این مدارم و نمی توانم عیب یابی کنم. به نظر شما مشکل از چه می تواند باشد؟ لطفا راهنمایی کنید
خوب مساله همونطور که خودتون هم متوجه شدید اینه که کد ارسالی ریموت رو دریافت نمی کنید ، اول این که از کارکرد تایمر مطمئن بشید و ببینید بیس زمانی درست هست یا نه مثلا با سر ریز تایمر یه عملی انجام بدید که متوجه این موضوع بشید
دوم این که ببینید اینتراپت داره درست کار خودش رو انجام میده یا نه
فکر نمیکنم مساله زمان بندی باشه احتمالا یه چیز تو مایه های چیزی که گفتم فراموش شده. فکر میکنم کد هگز گذاشتم – چک کنید با کد هگز کار میکنه ؟ که از سخت افزار مطمئن بشید.
سلام.
من برنامه شما رو در Atmel Studio کامپایل کردم و به خوبی جواب گرفتم.
حالا من میخواهم کد ذخیره شده را توسط فرستنده RF ارسال کنم.
مثلا کد ذخیره شده “0 27 37 0” است . و برای کلید 1 کد “01 27 37 0” ارسال کنم.
تابع زیر را استفاده میکنم. ولی جواب نگرفتم .
لطفا راهنمایی نمایید.
void send_RF(uint32_t code)
{
PORTB |=1<<PINB1;
_delay_us(10);
PORTB &=~1<<PINB1;
_delay_us(310);
for (uint8_t i=8;i<32;i++)
{
if (0x80000000 & (code<<i))
{
PORTB |=1<<PINB1;
_delay_us(30);
PORTB &=~1<<PINB1;
_delay_us(10);
}
else
{
PORTB |=1<<PINB1;
_delay_us(10);
PORTB &=~1<<PINB1;
_delay_us(30);
}
}
}
فکر میکنم اون شرط ها و مقایسه ها زمان بندی رو دچار مشکل میکنن – اگر با لاجیک انالایزر خروجی کدتون رو ببینید خیلی بهتون کمک میکنه
سلام.
با توجه به مطالب گفته شده در سایت ، من اندازه طول هر پالس را 10 میکرو ثانیه در نظر گرفتم. ولی خروجی ریموت آماده رو در اسیلوسکوپ دیدم که 400 میکرو ثانیه بود. مقادیر برنامه رو تغییر دادم و درست شد.یعنی برای حالت صفر 400 میکروثانیه on و 1200 میکروثانیه off در نظر گرفتم.
ممنون از سایت پربار شما.
امیدوارام تجریبات من هم برای دوستان مفید باشه.
بسیار عالی
خواهش میکنم – توی مقاله ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه یه جدول از دیتاشیت رو گذاشتم که فرکانس پالس ها رو بر اساس مقاومت انتخاب شده نوشته که بر اساس استاندارد میشه طول هر پالس رو محاسبه کرد.
با سلام
1- من سورس برنامه را دانلود کردم ولی متاسفانه موفق نشدم داخل برنامه کدویژن اجرا کنم.
2- امکان داره در مورد منطق کار برنامه هم توضیح بفرمایید ؟ بصورت خاص مرحله دیکود کردن، استفاده از وقفه و تایمر. راستش من خیلی متوجه نشدم.
سلام دوست عزیز
۱. خوب منطقا چون برنامه برای gcc نوشته شده است – برای این که بتونید توی کدویژن ازش استفاده کنید لازمه که تغییرات توش ایجاد کنید ولی فکر میکنم بدون مشکل بتونید از این سورس توی اتمل استودیو استفاده کنید.
۲. در مورد این که چطور کد رو دکد کنیم قبلا پستی نوشتم که میتونید مطالعه کنید ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه و اگه سوالی بود بپرسید.
سلام وقتتون بخیر ممنون بابت زحماتی که برای آموزش میکشید. من قصدم ساخت دستگاه کنترل رله هست . کد زیر ر بر اساس شرط هایی که شما در برنامتون استفاده کردین نوشتم ولی نمیدونم چرا هیچ کدی رو نمیتونم دریافت کنم.
if(RX_315==1)
{
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0< s[0]*29) && ( s[1] < s[0]*32 ) )
{
for(i=2;i<=49;i++)
{
while(RX_315==1){}
s[i]=TCNT1;
TCNT1H=0x00;
TCNT1L=0x00;
i++;
while(RX_315==0){}
s[i]=TCNT1;
TCNT1H=0x00;
TCNT1L=0x00;
}
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
for(i=2;i(s[i]*2)) && (s[i+1]<(s[i]*4)) )|| ( ((s[i+1] * 2)s[i])) )
{feedback=1;i++;}
else {i=49;feedback=0;}
}
متغیر s از جنس long int هست. long int s[50]=0;
میکرو کنترلرم atmega 8 هستش و فرکانسشم هشت مگا هرتزه.از نظر فرکانس فرستنده و گیرنده هم مطمین هستم. من اول کد همگام سازی رو چک میکنم ، در صورت درست بودن نسبت ، بعدش میرم سراغ 24 سایکل بعدی .
منتهی برای چک کردن صحت اطالاعات ، بعد از دریافت کامل میرم چک میکنم نسبت ها رو و اگر نسبت اوکی بود یک فلگ رو یک میکنم و در ادامه برنامه استفاده میکنم. یکی دو هفته است وقتم رو گرفته . ممنون میشم کمکم کنید.
الان ابن کد کجا ران میشه ؟
چرا مثل همون الگویی که نوشتم از اینتراپت استفاده نکردید ؟
سلام
من نمیتونم پروژه رو built کنم، سورس فایل باز میشه، هدر فایل ها هم باز میشه ولی نمیتونم کامپایل کنم
کد رو چگونه باید توسط گیت باز کنیم؟ تو اتمل استودیو 7 توی مسیر import چیزی به اسم گیت وجود نداره، افزونه گیت رو هم نصب کردم
سلام دوست عزیز
من این پروژه رو با ایکلیپس نوشتم – شما میتونید فایل های سورس رو به پروژه ای که خودتون توی اتمل استودیو درست کردید اضافه کنید و احتمالا مشکل حل میشه.
سلام و خسته نباشید.
من این کد رو میخواستم در کامپایلر IAR با استفاده از یک STM8 پیاده سازی کنم. منتها برای تبدیل این خط از برنامه مشکل دارم
Receive_Code |= pgm_read_dword(&Bit_Shift[(23-Bit_Index)]);
اونطور که من متوجه شدم تابع pgm_read_dword توسط IAR پشتیبانی نمیشه. از اونجایی هم که من خیلی تسلط به C ندارم آیا راهی برای پیاده سازی این تابه و استفاده از جدول لوکاپ در IAR وجود داره؟
با تشکر
خوب به سادگی برای این کد معادل زیر رو استفاده کنید
Receive_Code |= (Bit_Shift[(23-Bit_Index)]);
سلام مهندس آیا از گیرنده های ASK DX RF 433 پشتیبانی میکنه این برنامه؟؟
زمانی که تغذیه مدار رو وصل میکنم ال ای دی یک یا دوبار
چشمک کوتاه میزنه بعد ال ای دی ب مدت ۱۰ ثانیه روشن می مونه و خاموش میشه !!!!!
سلام دوست عزیز
منطقا نباید مشکلی وجود داشته باشه – ولی از اونجایی که ماژول گیرنده شما از نوع معمولی هست (بدون کریستال) احتمالا برد کوتاهی خواهد داشت شاید زمان بندی هم توی کد نیاز به تغییر داشته باشند
با گیرنده های کریستال دار تست کنید.
با سلام خدمت شما دوست بسیار عزیز
توی شماتیک به اشتباه کریستال 8 مگا قرار دادید که باید 16 مگا شود چون با 8 مگ تایمر ها و زمان بندی ها بهم می خورد باتشکر
سلام دوست عزیز
بله حق با شماست سهوا اشتباه شده بود که تصحیح شد.
ممنون از تذکرتون
سلام. میشه برای این پروژه یک شماتیک بزارید.
سلام
بله دوست عزیز
به زودی در سایت قرار خواهد گرفت
سلام
ممنون از برنامه خوبتون
یه سوال داشتم
من این برنامه رو داخل برنامه خودم وارد کردم داخل برنامه خودم از تایمر صفر و یک استفاده شده ولی نمیدونم چرا بعضی وقتا میکرو ریست میشه!!!
وقفه صفر هم دائم وقفه داره!!! حتی اگه کلید ریموت هم فشار ندم.
سلام
خوب ریست شدن دلایل خیلی زیادی میتونه داشته باشه شایع ترین موردش استک اورفلو هست
در مورد اینتراپت هم باید بگم بله همینطوره با توجه به ساختار گیرنده که ask هست نویز های محیطی هم به عناون پالس آشکار سازی میشه! و دلیل این که همیشه پالس وجود داره همینه
سلام…
واقعا مطلب کاملی هستش ممنون !
کسی از اعضا یا خودتون کد رو تو کامپایلر کد ویژن ننوشتید که در اختیار قرار بدین !؟
من خودم خواستم این کارو بکنم ولی چون خیلی کم برنامه نویسی بلدم و هم زمان گیر میشد و امکان اشتباه پیش میومد گفتم بپرسم ببینم شما خودتون دارید یا ن !
ممنون میشم در اختیار قرار بدین .
سلام دوست عزیز
متاسفانه باید بگم من روی سیستم کدویژن رو ندارم و ازش استفاده نمی کنم ولی اگر دوستی زحمت بکشه و این کد رو پورت کنه – حتما به اسم خودش منتشر میکنیم 🙂
سلام
وقتی میگوییم 4 کانال یعنی چه؟ منظور از کانال چیست؟
یعنی شما قادر خواهید بود که چهار خروجی مجزا را کنترل کنید
سلام این کد در اردوینو قابل استفاده نیست ، ممنون
فکر میکنم آردوینو کتابخونه برای این کار داشته باشه
ولی قابل استفاده است همین کد هم برای آردوینو
ممنون سیسوگ عزیز
ممنون زئوس جون
تشکر
خیلی لطف کردین
خواهش میکنم دوست عزیز ??
باسلام
اول از همه تشکر میکنم بابت کد بسیار کاربردی و بویژه رایگان جناب عالی
دوم اینکه من با atmel studio7 راه انداختنش و خیلی زیبا داره کار میکنه
باهاش یه کلید کولر ریموت دار ساختم که خیلی جالبه
خدا اجرتون بده خیلی ممنون
سلام متشکر دوست عزیز بابت کامنتتون 🙂
انرژی میگیریم از نوع کاربرد های خلاقانه می بینیم 🙂
سلام
من کد نوشده شده رو بردم در keil اما یک قسمت رو نتونستم درک کنم یعنی
Receive_Code |= pgm_read_dword(&Bit_Shift[(23-Bit_Index)]); این تابع رومتوجه نمیشم
و معادلی براش پیدا نکردم
و بجاش اینو نوشتم
میشه کمک کنید و بگید چیکار کنم
Receive_Code |=(1<<(23-Bit_Index));
سلام
از اونجایی که ما برای این پروژه از یک میکروی 8 بیتی استفاده کردیم ؛ عملیات روی متغیر های 4 باینی نیازمند چندین کلاک ماشین بود ؛ برای بالابردن سرعت از لوک آپ تیبل استفاده کردیم ؛ که نتیجه رو توی کد میتونید ببینید ؛ خوب وقتی دارید با یک میکروی 32 بیتی کار میکنید ؛ دیگه نگران کار روی متغیرهای 32 بیتی رو ندارید چون تمام عملیات ها تقریبا توی یک سیکل ماشین انجام میشه !
چیزی که برای جایگزینی نوشتید درست هست
Receive_Code |=(1<<(23-Bit_Index));
سلام
جناب مهندس چندتا سوال دارم برای این پروژه که همچنان بعد مطالعه این مقاله ،تقریبا به جواب نرسیدم (شاید من نرسیدم 🙂 )
1: در پروژه ای که من میخوام از این ریموت استفاده کنم باید یه فرستنده از نوع 315 و یا 415 داشته باشم که این فرستنده به طبع تعداد دستورات بیشتری(بیشتر از 4کد کلید ) را میفرسته . خواستم ببینم الگوریتم ارسال هم به همین صورته که برای دریافت استفاده میکنیمه؟، خب اگه از الگوریتم درست متوجه شده باشم باید برای فرستنده از یک تابع با تاخییر هایی استفاده کنیم که این تابع ارسال طبق نسبت یک به سه، برای ارسال استارت بیت مثلا در 10 میکرو ثانیه یک بار پین خروجی میکر (پین دیتای فرستنده) را یک میکنه و بعد هر 30میکر ثانیه 20بیت ادرس رو به ترتیب میفرسته و بعد هم با همین زمان 30میکرو ثانیه بیت های دیتا رو میفرسته ( 4 تا و یا بیشتر)=> خواستم ببینم این روند برای ارسال رو که گفتم درسته ؟ و یا نه شما راه بهتری را پیشنهاد میکنید ؟؟
2: در الگلوریتم دریافت یک تایمری رو گذاشتید که هر یک میکرو ثانیه شمارش انجام میده (16بیتی)
و یک پین اینتراپتی رو راه اندازی کردید که برای دریافت دیتا از خروجی استفاده میشه ، در این اینتراپت که حساس به دو تا لبه هستش در لبه اول (بالا)تایمر شروع به شمارش میکنه و در لبه دوم (پایین) تایمر مقدار تایمر رو در یک متغیری ذخیره میکنه و مقایسه ای طبق شرط های زیر :
#define IS_Sync_Start_Pulse(T1,T2) (T2 > (T1*29) && T2 (T1*2) && T2 (T2*2) && T1 < (T2*4))
میسنجه که ایا استارت بیت هست یا نه ،یا ادرس بیت هست یا نه و یا دیتا بیت هست یا نه .
بعد اگر تشخیص ها درست بود در یک آرایه ای ذخیره میکنه / . این برداشت من از این ریموت و مقاله شماست
خواستم ببینم این روندی که توضیح دادم درست هست یا نه با این شیوه میشه از ریموت استفاده کرد ؟؟
3: یک سوال مهم : در مقاله اول گفتید نسبت ها یک به سه هستش :آیا یعنی استارت بیت مدت زمان یک شدنش مثلا 10 میکرو ثانیه هست و هر بیت دیتا و یا ادرس 30 میکرو ثانیه طول سطح یکشه ؟
میدونم طولانی شده ایکاش میشد از طریق "کامین" با شما ارتباط برقرار میکردم اما اگه اینجا هم جواب بدید ممنون میشم
تشکر از سیسوگ و شما
سلام دوست عزیز
1. البته من نمیدونم پروژه شما چیه ؛ اما چند تا راه وجود داره ؛ اگر تعداد حالت های مورد استفاده شما از 16 حالت کمتر است میتونید از همین چیپ استفاده کنید (ev15xx) یعنی از 4 پایه ورودی به شکل ترکیب دو دویی استفاده کنید ؛ مساله دوم که باید بهش دقت کنید اینه که آیا توی پروژه تون نیاز به هند شیک دارید یا خیر منظورم اینه که اگر فرستنده نیاز داره متوجه بشه که داده ارسالی حتما به دست گیرنده رسیده یا نه ؛ بهتر از این روش ها استفاده نکنید ؛ خوب اگر همچنان میخواید از این سلوشن برید جلو و اگر گیرنده و فرستنده رو قراره خودتون بسازید ؛ این لینک سلوشن خوبی رو پیاده سازی کرده. روندی که شما توضیح دادید هم درسته و میشه ازش استفاده کرد.
2. بله درست متوجه شدید ؛ برای تشخص صفر یا یک بودن یا سینک بودن سیگنال باید نسبت ها رو اندازه گیری کنیم ؛ اگر از میکروی پیشرفته تر از avr استفاده میکنید مثلا stm میتونید از قابلیت کپچر تایمر برای این سنجش استفاده کنید که cpu هم درگیر نشه 🙂
3. نسبت یک به سه فقط برای بیت های دیتا هست و برای سینک کاربردی نداره. مثلا 30 میکروثانیه یک و 10 میکروثانیه صفر ؛ اگر چنین حالتی رو پدید بیارید میشه بیت 1.
خواهش میکنم ، مطرح کردند گفتم کامنت کنید شاید برای باقیه هم سوال باشه این موضوعات ؛ اینور بهتر است.
سوال دیگه ای بود در خدمت هستم
سلام جناب مهندس
مهندس توضیحات شما بسیار عالی خیلی ممنونم .
بله از stmاستفاده میکنم » ممنون بابت توصیه بجا و کار امدتون.
پروژم دو بخشه یکی این که یک سری اطلاعات رو میخوام از طریق این ریموت انتقال بدم مثل مقدار ADCالبته به صورت کد شده
و بخش دومش کپی کردن ریموت دروازه ست (البته بیشتر جنبه اموزشی داره میدونم شاید منطقی نباشه )
مهندس یک سوال درمورد تعداد پریمبل و بیت های آدرس : من متاسفانه یک لاجیک آنالیزر تهیه کردم که در همون اول کار دیدم مشکل داره
بخاطر همین مجبور شدم از شما بپرسم و مجدد وقت شمارو بگیرم
سوالم اینه تعداد بیت های پریمبل برای ارسال باید به چه صورت باشه آیا باید به صورت یک بیت صفر(صفر از نظر منطقی که تعریف شد ) باشه یا سه بیت صفر = (تعدادش برام سواله )
دوم ایا در ادرس بیت های ادرس محدودیتی برای کد کردن ( شخصی سازی آرایش صفرو یک )نداریم وتعدادش به چه صورته ؟
و همچنین دیتا . . .
در رسیور من ریموت های که از پیش کدشان تعیین شده رو میتونم با همین الگوریتم بخونم یا نه باید به الگوریتم های دیکه مثل keeloq , …برای کپی شون رو کنم
ایا برای کپی کردن هم میشه از ای سی PTهم کمک گرفت؟ ویا HCS301
ممنونم
سلام خواهش میکنم دوست عزیز
خوب برای بخش اول که قصد انتقال اطلاعات رو دارید سعی کنید از ماژول هایی استفاده کنید که بتونید صحت اطلاعات ارسالی رو استعلام کنید ماژول هایی مثل nrf2401 یا RFM12 یا مشابه اونها
برای کپی کردن باید دید که نوع ریموت مورد استفاده چی هستش ؛ اگر از سری ev15 باشه که کار سختی پیش رو ندارید و تنها تکرار کردن سیگنال های ارسالی کفایت میکنه ، فکر میکنم قبلا نمونه کدش رو توی اینترنت دیده باشم.
در مورد زمان بندی قیلا توی پست نوشتم که ” کمترین زمانی که این چیپ قادر به ارسال یک فریم از داده است (24 بیت بهعلاوه همزمانی) 1.34 میلیثانیه است که با توجه به اینکه هر فریم شامل 128 پالس است طول هر پالس 10 میکروثانیه خواهد بود.” یعنی برای ساخت پریمبل لازمه که ده میکروثانیه یک باشه و 31 میکروثانیه صفر باشه
نه توی آدرس دهی و طول داده محدودیتی نیست ولی هرچی بلند تر باشه این فرایند احتمال پیش اومدن خطا هم بیشتر میشه.
سلام و خدا قوت
برای stm32 هم میشه از این کد البته با تغییرات مورد نیاز استفاده کرد؟
سطح ولتاژها را باید چه کار کنیم
من تست کردم همیشه سطح پایه میکرو 1 برمیگردونه
با تقسیم ولتاژ هم کلا صفر
بله دقیقا میشه استفاده کرد ، نیازی نیست که سطح ولتاژ رو تغییر خاصی بدید و میتونید خروجی ماژول رو مستقیما به میکرو متصل کنید
قبلا این کار رو انجام دادم و بدون هیچ گونه مشکلی کار میکنه.
بسیار عالییییییی
با تشکر از زحمات جنابعالی.
خواهش میکنم دوست عزیز 🙂
آقا دمت گرم حل شد uart راه افتاد!سوتی از خودم بود فیوز بیتاشو پروگرام نکرده بودم!
الان حالا گیر کردم تو دیکد!ببخشیدا بازم سوال دارم یکی اینکه برای eeprom باید اون رو هم پروگرام کنم یا همون پروگرام avr کافیه؟فیوز بیت خاصی میخواد؟؟
و سوال دیگه اینکه تو توضیحات زدی برای شناسایی پالس ها تایمر باید 1 میکرو باشه ولی به من گفتی 1 میلی!راستش یکم گیج شدم میشه بیشتر توضیح بدی
تایمر1 رو رو چند تنظیم کنم؟الان led هر ثانیه 2 تا میزنه
ممنون
استفاده از eeprom نیاز به فیوز بیت خاصی نداره ؛ تنها یک فیوز بیت هست که میگه وقتی آیسی رو پاک میکنید حافظه eeprom باهاش پاک نشه ؛ که خیلی هم کاربردی هست ؛ ممکنه مشکل شما هم از این قضیه باشه
1 میکرو درسته ؛ احتمالا اشتباه گفتم ببخشید.
ببخشيد من از eprom خارجي استفاده كردم اون هم كاري نميخواد؟خود ميكرو ميشناستش؟
باز هم ممنون
خوب اگر از eeprom خارجی استفاده میکنید باید کتابخونه اونو بنویسید یا به پروژتون اضافه کنید ؛ اگر نه میکرو که خودش نمیشناسه اونو 😐
ممنون از لطفت دوست من.شما درست میفرمایید مین اجرا میشه ولی یکم سرعتش تغییر میکنه به خاطر اینتراپت حالا دارم روش کار میکنم…
ولی تایمرش راه افتاد ممنون
و اینکه هر کاری میکنم نمیدونم چرا usart را نمیافته تا از کامپیوتر و سریال پیغاماشو بگیرم میشه یه توضیح راجع به تنظیماتش بگی هر کاری میکنم با این atmega8a راش بندازم همش کاراکتر چرت میفرسته همش کد 80 هگز میفرسته ممنون میشم راهنماییم کنی
خوب به هر حال بخاطر زمانی که توی اینتراپت صرف میشه به همون اندازه هم تابع مین کندتر اجرا میشه ولی فکر نمیکنم اونقدری باشه که قابل درک باشه مگر این که کار زمانی دقیق داشته باشید ؛ اونم راه چاره ای اینه که تا جای ممکن اینتراپت رو برنامش رو سبک کنید.
احتمالا بااوود ریت درست نیست ! فرکانس کاری میکرو رو روی چقدر تنظیم کردید ؟
8mhz int روی
کجا باید تنظیم کنم باوود ریت رو؟
من با atmel studio دارم کار میکنم
خیلی عالیه که کدویژن کار نمیکنید 🙂
برای تنظیمات صحیح باوود ریت میتونید به صفحه زیر سر بزنید
تنظمیات باوود ریت
ممنون لطف داری!
آقا این uart با ما راه نمیاد!هر کاری کردم نشد همش کاراکتر چرت میفرسته!تنظیم باود ریتمم درسته ولی نمیشه!چیکار کنممم؟!
امکان داره از کریستال داخلی باشه؟چون الان روی 8 مگ داخلی تنظیمه و کریستال خارجی استفاده نشده.
امم خوب بهترین کار اینه که اول با کریستال خارجی تست کنید ؛ چون RC داخلی چندان دقیق نیست و احتمالا اگر کارکتر اشتباه دریافت میکنید میتونه دقیقا دلیلش همین باشه
اگر با کریستال خارجی هم نشد ، کدتون رو بفرستید که بررسی کنم.
با سلام و تشکر از شما به خاطر مطالب خوبتون
من یه مشکلی دارم و اون اینه که برنامه دایم تو اینتراپت هست چون خود ماژول در حالت عادی هم سیگنال میده در صورتی که من میخواستم موقعی که ریموت زده نمیشه کار دیگه ای کنه ولی اینطوری همش میره تو اینتراپت
میشه کمک کنید من همه مود های اینتراپت رو امتحان کردم حتی ماژول گیرنده رو هم عوض کردم ولی حل نشد
سلام و درود دوست عزیز ؛ ببینید این مساله که میکرو مدام میپیره توی اینتراپت اجتناب ناپذیره ؛ چون ماژول های گیرنده از نوع ASK هستند و محیط هم پره از نویز ! برای همین هم ماژول این نویز ها رو به عنوان پالس شناسایی میکنه!
دوست من يعني راهي نداره؟
اينجوري كه برنامه شما هم هيچ وقت تو main نميره و همش تو اينتراپت ميمونه و نميتونه درست كار كنه؟؟؟يعني شما و دوستاني كه درست كار كرده براشون هيچ نويزي تو محيطشون نبوده و ماژول هيچ پالسي تو حالت عادي نميده؟!
امم فکر نمیکنم اینقدر زمان پردازنده رو بگیره – میکروکنترلرتون چی هست و توی چه فرکانسی داره کار میکنه ؛
چون قادتا نباید اینقدر زمان بر باشه طوری که اصلا مین اصلی اجرا نشه – شاید نهایتا 10 تا 20 درصد پردازنده رو اشغال کنه – نه همش رو
اهان يعني ميگي اگه پشت هم هم هي ماژول سيگنال بفرسته باز سرعت اينقد زياد هست كه بره مين رو اجرا كنه؟اخه من براي تست يه رله رو گذاشتم تو مين ست كنه ولي اصلا اين كارو نميكنه
ميكرو من atmega8a هست و فركانس داخلي ٨ مگ
و اينكه راستي دوست من ميشه بگي براي اين مشخصات تايمر هاشو چجوري بايد تنظيم كنم؟
بازم ممنون
بله دقیقا ؛ البته همینطوره ؛ سرعت میکرو خیلی بیشتر از اونی هست که بخواد با این وقفه ها بره توی اینتراپت گیر کنه ؛ با این فرکانس کاری نباید مشکلی داشته باشید.
توی کتابخونه ای که نوشتم توضیحش هست – یک تایمر رو باید جوری تنظیم کنید که زمان 1 میلی ثانیه ای داشته باشید
ممنون
هر چه می خواستم تو این سایت پیداکردم.
نوکرتم
🙂
زئوس Zeus گفت:
مهر ۱۵, ۱۳۹۷ در ۹:۲۰ ق.ظ
سلام
تا اونجایی که اطلاع دارم ریموت های بتا از نوع هاپینگ هستند :/ ؛ بازش کنید ببینید شماره آیسیش چی هست ؟
فبلا ریموت های هاپینگ رو معرفی کردیم
سلام منریموت را بازکردم آی سیش 1721 بود آیا تفاوتی میکنه
فکر میکنم این که شما خونید شماره سریالش باشه ؛ من الان باز کردم ریموت رو شمارش هست HCS301 هست ؛ که همون هاپینگ هست 🙂
فکر میکنم این که شما خونید شماره سریالش باشه ؛ من الان باز کردم ریموت رو شمارش هست HCS301 هست ؛ که همون هاپینگ
سلام من دوباره نگاه کردم این شماره راندیدم با برنامه شماهم سه مدل تست کردم هر پنج کلید کار کرد البته لرنش نکردم فقط خروجی کلیدها را ااستخراج کردم که با سه تا ریموت کارکرد به نظرشما ؟
یه سوال داشتم – ریموت شما چرا 5 کلید داره ؟ ، میشه خروجی کلید ها رو که برنامه میده ارسال کنید ؟
یا عکسی از ریموت مورد استفاده خودتون در اختیار بذارید ؟
عکس راکجا بفرستم؟
البته مشکل من بالرن وریموت حل شد اما عکسها رامیفرستم اگه کسی مشکل داشت حل
الان میخوام تا 20 تا ریموت set کنم با اینکد میشه این کارا کرد؟
برای آپلود من معمولا از سایت picofile.com استفاده میکنم
خوب خوشحالم که مشکل حل شده ؛ خوب برای ذخیره 20 تا ریموت شما نیاز به 20*4 بایت حافظه فلش خواهید داشت ؛ اگر چنین حافظه ای رو در دسترس داشته باشید نباید مشکل خاصی وجود داشته باشه
فکر میکنم این که شما خونید شماره سریالش باشه ؛ من الان باز کردم ریموت رو شمارش هست HCS301 هست ؛ که همون هاپینگ
سلام من دوباره نگاه کردم این شماره راندیدم با برنامه شماهم سه مدل تست کردم هر پنج کلید کار کرد البته لرنش نکردم فقط خروجی کلیدها را ااستخراج کردم که با سه تا ریموت کارکرد به نظرشما ؟
ییکک سوال دیگه
من برای حالت لرن نرمافزار را اینجور تغییر دادم(چون از کدویژن استفاده میکنم)
else if(Work_Mode==Learn)
{
// if(!EE_ISValidCode(Rcode&0xFFFFFFF0)) /*If Not Have Code*/
// {
printf(“Learn This Remote…\n”);
// printf(“Learn This Remote…\n”);
// //EE_StoreCode(Rcode&0xFFFFFFF0);
RcodeEE=(Rcode&0xFFFFFFF0);
// }
Work_Mode = Nurmal;
}
اما 2 مسئله
1-من از پورت سریال دارم استفاده میکنم واین دسستور فکر کنم مشکل درست میکنه
printf(“Learn This Remote…\n”);
وفکرکنم این دستور ریموت را درحالت لرن نگه میداره تا دکمه ای از زده شود به جاش از چه دستوری استفاده کنم؟
2- من دادههای دیگری هم در e2 دارم که بعدد لرن همه بهم میریزه للطفا راهنماییی کنید ممنوم
خوب به نظر کد یه مشکلی نداره ، اول مشخص کنید که متغییر RcodeEE چطور تعریف شده ؛ دوم این که مشخصا روال های ذخیره سازی EEPROM در کدویژن و GCC خیلی متفاوت بودن ولی کدویژن توی ورژن جدیدش اصلاح کرده و مثداری شبیه GCC شده اگر اشتباه نکنم
چون میشه بگید چرا فکر میکنید که دستور printf مشکل ایجاد میکنه ؟ من گمان میکنم مشکل از ذخیره سازی متغییر باشه مشکل !
سلام ممنون بابت اطلاعاتتون اما من چون زیاد از میکرو سر در نمیارم نمیدونم که باید چکار کنم برای این پروژه ای که دارم ممنون میشم هم از لحاظ تنظیمات codewizard برای تایمر کانتر یا حافظه ای که برای پروژم لازمه هم بررنامه ای که باید بنویسم راهنماییم کنید
پروژم اینه: یک ریموت 4 کاناله کدلرن 315MHZدارم و دو گیرنده super heterodyne 315MHZ . میخام وقتی کلید 1 از روی ریموت فشار میدم buzzer که به میکرو atmega8 و گیرندم وصله صدا بده و وقتی کلید 2 از روی ریموت فشار میدم buzzer که به میکرو atmega8 و گیرندم وصله صدا بده.
برای set کردن کلید های ریموت با گیرنده استادم گفت کلیدی که روی گیرنده است با یک کلید از روی ریموت همزمان فشار بدم باهم set میشن درسته؟
شکل مدار گیرندم اینه
http://uupload.ir/files/mfsx_untitleaad.png
سلام دوست عزیز ، خوب الان من متوجه نشدم شما با کدوم قسمت مشکل دارید ؛ این پروژه دقیقا همون پروژه ای هست که شما میخواید البته باید یک سری پایه ها رو تعییر بدید که به سادگی در کد برنامه می تونید این کار رو انجام بدید ؛ سورس کدوژین رو در اختیار گذاشتیم و میتونید دانلود کنید.
سلام وخسته نباشید واقعا متشکرم امیدوارم پله های ترقی و پیشرفت رو روز به روز بالا بروید
خواهش میکنم دوست عزیز
و همچنین شما
سلام
یه مشکل خیلی بزرگ!!!
من موقع لرن کردن بجای اینکه از ریموت کد لرن استفاده کنم ریموت کد فیکس استفاده کردم و متاسفانه میکرو ریموت رو شناسایی کرد!!!!! و الان که دو تا از کیلدها رو میزنم خروجی ها روشن میشن!!!
هر کدوم از کلید ها دوتا ال ای دی رو روشن میکنه .
حتما باید فکری برای این موضوع بشه.
ممنون
سلام
بله این مشکل وجود داره ولی نمیشه گفت مشکل خیلی بزرگی هست ، اگر سیگنالینگ مروبط به ریموت های کدلرن و گدفیکس رو ببینید متوجه میشید که سیگنل ها کاملا شبیه هم هستند وقتی که تو محدودی فرکانسی و ریت ارسال یکساان قرار بگیرند همچین مشکلی پیش میاد و کاری هم نمیشه کرد !
آیا پیشنهادی برای رفع این مشکل دارید ؟ اگر راهکاری باشه که واقعا کار کنه ، پیاده سازی خواهیم کرد.
درود
سلام
فکر میکنم میشه یه کار کرد.
ریموت کد فیکسی که من دارم کد هشت بیت آخری کلیدها به صورت:
03 یا 0C یا 30 یا C0
نمیدونم همه ریموت های کد فیکس اینطورین یا نه
ولی کد لرن چهار بیت آخری:
1 یا 2 یا 4 یا 8
اگه ریموت کد فیکس همگی این کد رو در آخر تولید میکنن
(03 یا 0C یا 30 یا C0)
در نتیجه هیچ ریموت کد لرنی هشت بیت آخر آن (03 یا 0C یا 30 یا C0)
نمی شود.
یعنی می تونیم تو شرط قبل از ذخیره ریموت در حافظه چک کنیم که این کد ها نباشد.
فقط باید مطمئن بشیم که همه کد فیکس ها اینطورین (که من 99 درصد احتمال میدم!!!)
سلام پیشنهاد هوشمندانه ای است ولی ، مشکلاتی رو ممکنه ایجاد کنه که عرض میکنم خدممتون
توی ریموت های فیکس ؛ 4 بیت پایین به کلید ها اختصاص داره ، و باقی بیت ها هر مقداری میتونه داشته باشه (توسط کارخانه اعمال میشه) اما توی ریموت های کدلرن 8 بیت پایین تحت تاثیر کلید ها قرار میگیره ؛ پس در واقع رفرنس مقایسه ای ما 4 بیت انتهایی خواهد بود.
اگر فرض کنیم کاربر ممکنه دو کلید رو با هم فشار بده احتمال ارسال کد های 3 (کلید 1 و 2) و کد C (کلید 3 و 4) وجود داره ! مگر این که بگیم ارسال ترکیبی کلید ها رو کلا رد میکنیم که باز برای دسته ای از ریموت هایی که 5 کلید دارند دچار مشکل خواهیم شد.
سلام
این برنامه حالتی نداره که ریموت رو تکی حذف کنه؟؟
بعضی وقتا نیاز میشه از بین 20 ریموت إخیره شده یکی رو حذف کنیم و حالت سوم برنامه کل 20 تا رو حذف میکنه!!!!
یا داره من اشتباه میکنم؟؟
ممنون
بله حذف تکی رو نذاشتم ، البته به راحتی خودتون میتونید کدش رو بنویسید ! به نظر من چندان کاربردی نبود.
سلام
ولی به نظر من خیلی خیلی کاربردیه!!
مثلا اگر برای درب ورودی ساختمان باشه و اگر یه روز یکی از ریموت ها رو حذف کنیم به مشکل بر میخوره چون باید همه ریموت ها رو حذف کنه!!!
البته این نظر من تجاریه و حق با شماست
تشکر
صد البته ؛ هر قابلیتی کاربرد خاصی داره ؛ اصولا سوالی که پیش میآد اینه که چرا باید یکی از ریموت ها رو حذف کنید ؛ معمولا وقتی عمل حذف انجام میشه که یکی ریموتش رو گم کرده باشه از اونجایی که معلوم نمیشه کدوم ریموت گم شده مجبور به حذف همه هستیم.
تا اونجایی که بررسی کردم گیرنده های موجود توی بازار نیز چنین قابلیتی ندارند ؛ هرچند کاربردش رو هنوز متوجه نشدم
ولی به راحتی میشه این قابلیت رو به کد اضافه کرد ، مساله اصلی کاربردی هست که براش تعریف میشه
سلام
من کدتون رو به کدویژن تبدیل کردم
عالی بود ممنون
ولی یه مشکلی داره کلید خوب کار نمی کنه!!؟؟
حالا بیشتر چک میکنم ببینم چیه مشکلش شاید تو تبدبل جای رو اشتباهی تغییر دادم.
ولی از بابت ذخیره وشناسایی فرستنده مشکل نداشت
تشکر
خواهش میکنم دوست عزیز !
اگر تمایل داشته باشید ، کدتون رو برای کدویژن بفرستید تا توی سایت قرار بدیم شاید بدرد دیگر دوستان هم بخوره
سلام
من میخوام برنامه رو با کدویژن اجرا کنم atmega8
میشه یه راهنمایی کنید این تابع
const uint32_t Bit_Shift[32] PROGMEM =
رو باید چی کار کنم
آیا میشه از flash استفاده کرد؟
با تشکر
سلام دوست عزیز ؛ بله توی کدویژن از معادل flash میتونید استفاده کنید.
سلام
من میخوام از 5کلید برای ریموت استفاده کنم وتغییر زیر در برنامه دادم اما عمل نکرد
//if(Rkey&15)
ممکنه راهنمایی کنید باید چکار کنم؟
البته نباید فراموش کنید که کلید 5 وقتی بیت های 4 و 1 رو ست میکنه ، اون دو خروجی نیز تحریک خواهند شد که باید با مکانسمی جلوی آن را بگیرد.
سلام
ممنون از پاسختان
مشکل اینه عددی که قبل از and کلید 5 برمیگردونه عدد 44 است که وقتی با 16 اند میشه 0میشه وبا 15 که اند میشه حاصل میشه 12 الان درست چیه با 16 باید اند بشه یا 15 ؟درضمن وقتی با 15 اند میشه تابع بدون فشردن کلید هم موقع فشردن کلید عدد 12 را برمیگردونه الان مشکل کجا میتونه باشه؟
سلام دوست عزیز !
میشه مدل ریموتی که استفاده میکنید رو معرفی کنید ؛ شاید اصلا انکدر متفاوتی داشته باشه
این قضیه که دارید مطرح می کنید مقداری مشکوکه ! توی چیپ های Ev15xx تنها 4 بیت برای ارسال وجود داره که میشه 16 حالت ، شما چطور عدد 44 دریافت میکنید ؟
سلام
ریموت از مدلهایی که روش نوشته beta
اینم کد
if(IS_Recive_Valid_Remote())
{
//Get_Remote_Code(Code);//code is a var
Rcode = Get_Remote_Code_long();
Rkey = Rcode&0xFF;
if(Rkey&1)
{
SendData(16,1);
//gen_7seg(1);
}
اعدادی که گفتم خروج rkey هست
سلام
تا اونجایی که اطلاع دارم ریموت های بتا از نوع هاپینگ هستند :/ ؛ بازش کنید ببینید شماره آیسیش چی هست ؟
فبلا ریموت های هاپینگ رو معرفی کردیم
همه چیز درباره ریموت های هاپینگ
سلام من از این برنامه شما استفاده کردم با چهارکلید مشکلی نبود اما من میخوام از پنج کلید استفاده کنم و این تغییر در برنامه دادم
//if(Rkey&16)
اما کلید پنجم کار نکرد آیا تغییر دیگری باید در برنامه بدم؟
ممنون میشم اگربراتون مقدور بود پاسخ بدید
چرا 16 رو گذاشتید ، اولین کاری که باید بکنید اینه که ببنید کلید 5 چه بیت هایی رو ست میکنه ، فرض میکنیم کلید 5 بیت های 1 و 4 رو یک میکنه ؛ پس دقیقا باید عدد 5 رو اند کنید با مقدار خوانده شده.
نقل قول : //چرا 16 رو گذاشتید ، اولین کاری که باید بکنید اینه که ببنید کلید 5 چه بیت هایی رو ست میکنه ، فرض میکنیم کلید 5 بیت های 1 و 4 رو یک میکنه ؛ پس دقیقا باید عدد 5 رو اند کنید با مقدار خوانده شده.//
طبق فرمایش شما یعنی اول ببینیم کدام بیت از چهار بیت آخر 1 میشه؟ یعنی اینجا برای عدد 5 بیتهای 1و 3 یک میشود؟
اعدادی که کلیدهای من برمیگردونه 30-33-34-40-44 میباشد
آیا با ریموتهای مختلف خروجی مختلف برمیگردونه؟
الان من شک دارم که ریموت شما از چیپ ev15xx استفاده کنه !ً
یا باگی توی برنامه وجود داره ؛ اول مطمئن بشید چیپ مورد استفاده در ریموت شما چی هست
سلام مهندس
ممنون از پاسختون . من با کدویژن کار میکنم . اگه یادتون باشه گفتم کد بعضی اوقات کار میکنه بعضی اوقات کار نمی کنه . من حس میکنه میکرو مدام توی اینتراپت. این بنظر شما طبیعی هست؟
لطفا کمک کنید بتونم این مشکل رو حل کنم . بنظر سخت افزار مشکلی نداره؟
بله درسته ، گیرنده های ASK معمولا نویز های محیطی رو هم دریافت می کنند برای همین همیشه توی خروجیشون ، پالس وجود داره
نگفتید از چه مدل گیرنده ای استفاده کردید ، آیا دقیقا همین کد رو استفاده کردید یا قسمتی رو به کد خودتون اضافه کردید ؟
با چند مدل فرستنده تست کردید ؟ آیا مشکل همیشه مشاهده میشه ، و این که مشکل چطور دیده میشه ؟
سلام این سورس شماتیک نداره ؟
به قسمت سخت افزار مراجعه کنید ، توضیح پایه های مورد استفاده وجود دارد.
سلام ، من میخام از اردوینو برای این پروژه استفاده کنم اما نمیدونم از کپام فایل استفاده کنم .
میشه مستقیما از arduino ide کامپایل کرد ؟
لطفا راهنمایی کنید
شندش که بله میشه ، باید توابع مورد استفاده رو به محیط ویرایشگر آردوینو انتقال بدید .
فقط دقت داشته باشید که برای انتقال از سورس های GCC استفاده کنید .
سلام و خسته نباشید
من میخام با اردوینو راه اندازیش کنم من از سورسی که دانلود کردم از کدام قسمتش استفاده کنم . میخام از برنامه arduini ide برای کامپایل استفاده کنم
بله امکانش هست
با آردوینو میشه این کد رو کامپایل کرد ولی این که چطور واردش کنید ، به خودتون برمیگرده
سلام و درود بر شما دوست عزیز
قبل از هر چیز ممنون از سایت خوبتون و تشکر برای جوابها و کمکهایی که به همه ی دوستان میکنید .
من برنامه ی قبلی رو به راحتی روی مگا 8 توسط کدویژن اجرا کردم و خوب هم کار کرد .
ولی این برنامه ی جدید رو نتونستم و خیلی تلاش کردم ولی مثل اینکه مشکل اساسی دارم .
اگه لطف کنید و به من و دوستانی مثل من که فعلا فقط با کدویژن کار میکنیم و امیدوارم بعد از تسلط روی برنامه ها به توصیه ی شما بتونیم با GCC ادامه بدیم ، از ابتدا راهنمایی کنید و در تغییر این کد برای کرویژن کمک کنید ، من مطمئنم همین تغییرات کمک بسیاری به پیشرفت ما میکنه ، واقعا ممنون میشم .
برای شروع فرض کنید من میخوام با مگا 32 روی کدویژن اجرا کنم .
لطفا در صورت امکان ابتدا در مورد تغییر تایمر و رجیسترهاش توضیح بدید .
باز هم یک دنیا ممنون
خواهش میکنم دوست عزیز
حقیقتا مدت زیادی است که در برنامه داریم یک سری اموزش اولیه برای شروع کار با GCC رو بر روی سایت قرار بدیم ولی متاسفانه فرصت نشده
سعی میکنیم که هفته های آتی آموزش های لازم رو در اختیار دوستان قرار بدیم
سلام . من با کدتون مشکل پیدا کردم . کد کامپایل شده فقط با ریموت کد فیکس جواب داد.
دوستان با انواع ریموت های کدلرن جواب گرفتن
چند تا دلیل می تونه وجود داشته باشه
اول این که فرکانس کاری میکرو درست تنظیم نشده باشه و یا این که به دلیلی عرض پالس های ریموت شما بهم ریخته باشه
سلام خسته نباشید. چنتا سوال داشتم ازتون در مورد کدی که نوشتید:
۱- چرا داخل تابع stop_read_timer کانتر تایمر ضرب در ۲ رو به عنوان خروجی میده ولی تو read_timer تو ۲ ضرب نمیشه؟
۲- اگه ممکنه یه توضیح کوچیک در مورد sreg بدید. داکیومنت کامپایلر و توضیحاتش تو دیتاشیت رو خوندم اما حس میکنم کامل نفهمیدم. چرا باید برای خوندن تایمر وقفه گلوبال غیر فعال بشه و حالتوش رو جایی ذخیره کنیم و بعد از اینکه خوندن تامیر تموم شد همه چیو به حالت اول برگردونیم؟ نمیشه فقط تایمرو بخونیم؟
۳- کاربرد bit_shift و نحوه ی کار باهاش رو نفهمیدم. چرا مقدار دهی اولیش به این صورت هست و اینکه چرا از یه متغیر معمولی ۳۲ بیتی برای کد ریموت های استفاده نکردید و به جاش از این آره bit_shift استفاده کردید؟
۴- چرا توی کدی که نوشتید برای overflow تایمر فکری نکردید؟
۵- چرا از تایمر ۱ استفاده کردید؟ تنها دلیل استفاده از تایمر ۱ داشتن جای بیشتر برای شمارش بوده؟ چون از هیچ برتری تایمر ۱ نسبت به دوتا تایمر دیگه استفاده نکردید. اگه تنها دلیلش اینه به نظر شما میشه با تایمر ۰ و در نظر گرفتن overflow همین برنامه رو بازنویسی کرد؟
ممنون از زحماتتون
سلام و درود خدمت شما
1 – تابع read_timer در برنامه استفاده نشده و میتوانید از آن صرف نظر کنید ، خروجی تابع stop_read_timer هم به دلیل این که فرکانس تایمر 500 کیلو در نظر گرفته شده در 2 ضرب می شود تا بیس زمانی 1 میلی ثانیه ای تغییر نکند.
2 – خوب SREG که رجیستر وضعیت هستش ، برای این هنگام خوندن تایمر وقفه ها رو غیر فعال میکنیم تا مقدار مورد نظر هنگام خوندن تغییر نکنه ، فرض کنید هنگام خوندن تایمر یه وقفه اتفاق بیفته که اولویت بالاتری نسبت به وقفه جاری داشته باشه ، اگر وقفه ها رو غیر فعال نکرده باشید ، عملیات خوندن متوفق میشه و رسیدگی به کار وقفه جدید در دستور کار CPU قرار میگیره بعد از بازگشت قطعا تایمر مقدار قبلی رو نخواهد داشت و مقدار مورد نظر تغییر کرده است ، برای جلوگیری از چنین اتفاق هایی این کارو انجام می دیم.
3 – منظور شما رو درست متوجه نشدم ، برای کد ریموت ما از متغییر 32 بیتی استفاده کردیم دیگه ! کار bit_shift هم در واقع شیفت دادن یک بیت به سمت راست هست ، از روش معمول (>>) استفاده نکردیم چون توی پردازنده های 8 بیتی این عملیات بر روی متغییر های 32 بیتی خیلی زمان بر هستش
4 – اتفاقا فکر کرده ایم 🙂 ، فرض کنید مقدار قبلی تایمر FFFD بوده باشد و 9 میلی ثانیه بعد که تایمر رو میخونیم مقدار 6 رو داراست ، حالا کافیه 6 رو منهای FFFD کنید ، زمان انتظار یعنی 9 میلی ثانیه حاصل میشه ، به همین راحتی.
5 – بخاطر 16 بیتی بودن ، شما از هر تایمر دیگه ای یا هر روش دیگه ای که بتونید زمانی با دقت 1 میلی ثانیه ایجاد کنید ، برای برنامه فرقی نمیکنه و قابل قبول هستش.
خواهش میکنم
آهان تشکر از توضیحاتتون. ????
خواهش میکنم دوست عزیز
با عرض سلام و خسته نباشید
من سعی کردم کد هاتون رو توی atmel studio 7 باز کنم. اما هرچی گشتم نتونستم تعریف تابع _BV رو پیدا کنم تو هدر فایل هاتون و … ممکنه راهنمایی کنید؟ آیا این تابع رو خودتون تعریف کردید یا از توابع از پیش تعریف شده ی کامپایلر هست؟
ممنون
سلام و دورود خدمت شما دوست عزیز
بسیار عالی ، آتمل استودیو هم از GCC استفاده میکنه ، و به راحتی میتونید کد را بر روی آن اجرا نمایید.
_BV رو میتونید به صورت زیر تعریف کنید.
#define _BV(x) (1 << x)
آهان ممنون. با موفقیت کامپایل شد و روی اتمگا ۳۲ و ۳۲۸ دیپ کار کرد. البته با کریستال داخلی که سرعتش کمتر بود تست کردم و یکم سخت تشخیص میداد کد ریموت رو. اما وقتی به ۳۲۸ کریستال ۱۶ مگ وصل کردم عالی کار کرد.
خواهش میکنم ، اگر کریستال رو تغییر میدید ، فرقی نمیکنه داخلی یا خارجی ، حواستون به زمان بندی تایمر باشه ، برنامه برای فرکانس 16 مگ نوشته شده ، در صورتی که بخواید با 8 مگ کار کنه باید سرعت شمارش تایمر رو دست کاری کنید. تا برنامه به درستی جواب بده.
سلام مجدد مهندس
آقا تونستم تغییراتی توی برنامه بدم و بصورت دلخواهم درش بیارم. خیلی هم خوب کار می کنه با سه مدل ریموت با مقاومت اسلاتورهای مختلف استفاده کردم که براحتی همه رو تشخیص میده.
AVRDUDE 6.3 کلا ATMega8A نداره. فعلا که با همین ATMega328p جوابای خوبی گرفتم. باز هم تشکر
خبر خوبی بود موفق باشید
بسیار عالی دوست عزیز ، خوشحالم که بلاخره موفق شدید
اما در مورد Avrdude ، من چک کردم و بارها باهش mega8 رو پروگرام کردم ، اگر جزئیات رو بگید شاید بتونم کمکتون کنم
سلام و تشکر بابت پیگیری های شما.
من پروژه رو چندین بار برای میکروهای مختلف کامپایل کردم. ولی فقط برای ATMega328 و ATMega328P جواب میده. برای بقیه میکروها پیغام خطایی میده در قسمت رجیسترهای وقفه صفر میکرو. البته این پیغام برای سری های معمولی درسته ولی برای سری های A نباید این پیغامو بده.
چون شما توی برنامه حالت تشخیص وقفه رو روی تغییر لبه از یه حالت به حالت دیگه تنظیم کردید که این قابلیت در میکروهای معمولی وجود نداره اما در سری A وجود داره. با این حال بازم برنامه خطا میده.
در مورد ATMega8 من خودم بارها با AVRDUDE پروگرم کردم. ولی سری Aشو ساپورت نمی کنه. حالا این مهم نیست. چون من با نرم افزارهای دیگه میتونم میکرومو پروگرم کنم.
اما فعلا مشکل سر کامپایل نشدن پروژه هست.
عکس پیغام خطا : http://uupload.ir/files/2nm2_32123.png
سلام دوست عزیز !
مساله خیلی ساده است ، وقتی که میکروی مورد نظر رو عوض میکنید ، چون اسم رجیسترهای مورد نظر داخل میکروهای مختلف متفاوت هست موقع کامپایل به خطا بر می خورید ، برای همین باید اسم رجیستر ها عوض بشه و اسم مناسب به جای اون قرار بگیره ، حتی ممکنه کانفیگ هر رجییستر نیز عوض بشه ، این که انتظار داشته باید فقط با عوض کردن نوع میکرو کد به درستی کامپایل بشه یه مقداری دور از واقعیت هست. مثلا برای تنظیم وقفه 0 توی میکروی 328 کد های زیر رو وارد میکنیم
EICRA=(0 << ISC11) | (0 << ISC10) | (0 << ISC01) | (1 << ISC00); EIMSK=(0 << INT1) | (1 << INT0); EIFR=(0 << INTF1) | (1 << INTF0); PCICR=(0 << PCIE2) | (0 << PCIE1) | (0 << PCIE0);
و مثلا توی میکروی Mega8 کدهای زیر رو
GICR|=(0 << INT1) | (1 << INT0); MCUCR=(0 << ISC11) | (0 << ISC10) | (0 << ISC01) | (1 << ISC00); GIFR=(0 << INTF1) | (1 << INTF0);
پس می بینید که کلا تنظیمات متفاوت هست.
برای وقفه هم من از Any change برای وقفه استفاده کردم ، این قبلیت توی همه خانواده های AVR وجود داره ، نگران نیاشید، در ضمن به لحاظ ساختار برنامه نویسی و رجیستری و پروتکلی سری A و سری معمولی هیچ فرقی با هم ندارند ، متاسفانه به دلیل دانش کم برخی افراد در این خصوص فکر میکنن سری A قابلیت های بیشتری داره توی این زمینه ها در صورتی که نه ، تنها تفاوت توی ولتاژ کاری و فرکانس کاری هستش ، اگر بخاطر داشته باشید قبلا سری L وجود داشت که با اومدن سری A ، اون سری توقف تولید شد ، برای توضیحات بیشتر میتونید به یوزر منوال مراجعه کنید.
برای پرورگارامر هم همونطور که قبلا گفتم سری A و غیر A نداره ، با خیال راحت Mega8 رو انتخاب و پروگرام کنید.
ممنون
ولی تا جائیکه من توی دیتاشیت ها نگاه کردم تقریبا 70 الی 80 رجیسترها هم نام هستن. حالا بیت هایی توی بعضی رجیترها کم و زیاد باشه. مثلا تایمر صفر توی همه سری های مگای AVR اسمش یکیه و یا موارد دیگه.
اما بعضی رجیسترها هستن که توی برخی میکروها کلا وجود ندارن. که این از تفاوت قابلیت های میکروها نتیجه میشه.
اما اینو نمیدونستم که سری معمولی هم از مد وقفه Any Change پشتیبانی می کنه!!! فک می کردم فقط توی سری A هست. چون بسکام این قابلیت رو مثلا برای اتمگا8 نداره ولی برای اتمگا8A داره.
ممنون از لطفتون. حالا من برم ببینم می تونم این رجیسترهارو اوکی کنم یا نه؟؟!!
بله ، با توجه به اضافه شدن یا کم شدن قابلیت ها به خانواده های مختلف میکرو ، به طبع رجیستر ها هم تغییر میکنن ، حتی اسم اونها ، البته معمولا تغییر به شکلی هست که راحت میشه حدس زد رجیستر معادلش چی میتونه باشه
من این کد رو برای مگا 8 تغییر دادم قبلا ، به خوبی هم کار میکنه ، تلاشتون رو بکنید ، حتما موفق میشید 🙂
بیسکام رو میشناسم ولی تاحالا باهاش کار نکردم ، اگر به دیتاشیت میکرو مراجعه کنید ، خواهید دید که این قابلیت وجود داره و فرق واقعی بین سری A و غیر اون توی چه مواردی هستش 🙂
سلام خوبی؟
میشه برنامت رو برای بقیه دوستان هم به اشتراک بذاری؟؟؟؟
سلام دوست عزیز
لینک دانلود سورس کد در اتنهای پست موجود است
https://github.com/Sisoog/4Ch_learnRemote/releases
سلام ممنون از پاسختون
من منظورم برنامه علی بود
ایشون گفته بود که گویا تو Code vision تغییرش داده
ببخشید که اینجا جواب میدم. چون در انتهای جواب شما دکمه پاسخ وجود نداشت که از اون طریق جواب بدم.
راستش من چنتا گزینه رو برای بازکردن پروژه شما امتحان کردم که از بین اونها فقط با گزینه Makefile Project With Existing Code تونستم کل پروژه رو باز کنم.
خوب دوست عزیز ، برای وارد کردن پروژه باید از Git استفاده کنید
ابتدا از منوی File زیر منوی Import را انتخاب کنید
در پنجره باز شده ، پوشه Git را انتخاب کنید و در آن گزینه Project From Git را انتخاب کنید و دکمه Next را بزنید.
گزینه Clone URL را انتخاب کنید و Next را بزنید
در پنجره باز شده قسمت URL متن زیر را پیست کنید
https://github.com/Sisoog/4Ch_learnRemote.git
و بعد Next و Next و Finish 🙂
به همین سادگی
ممنون مهندس. بالاخره تونستم پروژه رو کامپایل کنم. جالب بود! تا حالا تحت وب برای AVR کامپایل نکرده بودم.
آیا بعداز کامپایل فایل هگز ساخته شده میره توی Release در همون آدرس اینترنتی Git ؟
حالا برای تغییر نوع میکروکنترلر و فرکانس کاریش و همچنین تغییر باودریت باید چیکار کنم؟
ضمن اینکه توی برنامه ATMega8A رو ندیدم. ولی ATMega8 بود یا مثلا ATMega32A بود.
آقا فایل هگزو پیدا کردم. توی پوشه User و بعدش پوشه git قرار داره.
فقط الان می خوام تغییرات مورد نظرمو اعمال کنم.
1. نوع میکروکنترلر
2. تغییر باودریت ارتباط سریال
3. تغییر فرکانس کاری
خوب برای این کار باید وارد تنظیمات پروژه بشید ،
برای تغییر نوع میکرو و فرکانس کاری ، ابتدا پوشه پروژه رو انتخاب کنید از منوی Project زیر منوی Properties رو انتخاب کنید
از پنجره باز شده از لیست سمت چپ گزینه AVR رو باز کنید و Target Hardware رو انتخاب کنید ، نوع میکرو و فرکانس کاری رو می تونید تعیین کنید
سلام دوست عزیز
تبریک میگم ، بلاخره موفق شدید 🙂
ببینید ، شما از Git کمک گرفتید که سورس ها رو دانلود کنید ، پس هر اتفاقی از پس می افته توی کامپیوتر خودتون هست
فایل هگز ایجاد شده هم توی همون ایکلیپس پوشه Release ایجاد میشه ، میتونید با Ctr+C کپیش کنید هر جا دوست دارید پیست کنید.
خیلی ممنون از راهنمائی هاش شما.
با کمک شما یاد گرفتم که چطور فرکانس میکرو و نوع میکرو رو عوض کنم. اما نکته ای که هست AVRDUDE 6.3 از ATmega8 پشتیبانی نمی کنه. چطور میشه این مشکلو حل کرد؟
از طرفی من میخوام فرکانس کاری رو به نصف کاهش بدم. این باعث ایجاد اختلال در عملکرد تایمر نمیشه؟
راستی می تونم تنظیمات تایمرو از کدویزارد کدویژن انجام بدم و بعد کپی کنم توی این پروژه؟ همچنین تنظیمات مربوط به باودریت پورت سریال.
سلام دوست عزی
خواهش میکنم
AVRDUDE تقریبا همه خانواده AVR رو پشتیبانی میکنه ، کجا میخواستید تنظیم کنید که مگا هست توی لیستش نبود ؟
خوب برای نصف کردن فرکانس هیچ مشکلی نیست ، ببینید فرکانس کاری تایمر رو جوری تغییر بدید که بیس زمانی 1 میلی ثانیه ای باشه ، یعنی فرکانس تایمر 1 مگاهرتز باشه
بله از کدویژن میشه برای این مساله استفاده کرد ، یعنی کد ایجاد شده توسط کدویزارد رو کپی کنید توی برنامه 🙂
سلام و تشکر بابت این پروژه
من برای ایجاد تغییرات در این سورس AVR gCC 7.1 نصب کردم و Elclipse SDk 3.6 و الان می تونم پروژه رو باز کنم. اما کامپایلر فایل های هدر (سرآیند) رو نمی تونه پیدا کنه. مثلا فایل avr/interrupt.h رو نمی تونه پیدا کنه.
باید دقیقا چیکار کنم؟ مگه فایل های سرآیند توی پوشه include نرم افزار AVR GCC نیستن؟ پس چرا نمی تونه پیداشون کنه؟
سلام دوست عزیز
خواهش میکنم ، خوب بسیار عالی ، شما ابتدا باید پلاگین AVR-GCC را بر روی Eclipse نصب کنید و مسیر محل نصب کامپایلر را در Path سیستم وارد کنید تا Eclipse قادر به مشاهده هدر های مورد نیاز باشد
برای آموزش نصب این این پلاگین میتوانید به آموزش نصب پلاگین AVR مراجعه کنید.
اگر مشکلی بود – همینجا مطرح کنید
تشکر از پاسخ شما
بله. میدونم. نصب کردم. Path رو هم تنظیم کردم. ولی بازم نمی شناسه. ببینید من AVR GCC 7.1 نصب کردم. بعدش Eclipse SDK 3.6 نصب کردم. پلاگین هم نصب کردم. الان من در Eclipse توی قسمت Window و در Preferences گزینه AVR دارم که زیرش AVRDude و Path هستن.
اینا یعنی پلاگینم نصبه دیگه. حتی من رفتم و بصورت دستی Pathهارو تغییر دادم. چون قبل از نصب AVR GCC من winavr داشتم که گزینه های Path بصورت پیشفرض روی پوشه های اون ست شده بود. ولی من کلا winavr رو پاک کردم و Pathهارو روی پوشه های AVR GCC ست کردم.
سلام و درود خدمت شما دوست عزیز
بسیار عالی – منظور من از Path ، در واقع Path موجود در Eclipse بوده است ، برای تنظیم Path در Eclipse ، ابتدا در منوی Window زیر منوی Perferences رو انتخاب کنید ، بعد مطابق این تصویر Path ها رو تعیین کنید.
احتمالا در پک نصب کرده از AVR GCC فایل Make وجود ندارد که برای دسترسی به این فایل باید از این لینک ابزار لازم رو دانلود و نصب کنید.
فایل مربوطه حدود 600 کیلو بایت بیشتر نیست. برای راهنمای نصب . پیکر بندی به مقاله آموزش برنامه نویسی رزبری پای قسمت چهارم زیر بخش نصب ابزار های لینوکسی مراجعه کنید.
احتمالا بعد از این کار ها مشکلی وجود نداشته باشه ، اگر مشکلی بود ، حتما مطرح کنید.
مهندس بالاخره بعداز کلی تلاش تونستم کارای نصب و راه اندازی رو تموم کنم. من نسخه Eclipse SDK نصب کرده بودم یکم فرق داشت. الان Oxygen نصب کردم و تمام مراحل رو همونطوری که توی آموزش بود رفتم.
ولی هنوزم مشکل دارم. سه تام عکس آپلود کردم.
بعداز کامپایل هم ارور زیر میاد:
make all
make: *** No rule to make target ‘all’. Stop.
لینک عکس 1 : http://uupload.ir/files/boev_1.png
لینک عکس 2 : http://uupload.ir/files/nx0t_2.png
لینک عکس 3 : http://uupload.ir/files/9io_3.png
مهندس مشکل قبلی رو حل کردم. از منوی Project و گزینه properties نوع Builder رو گذاشتم روی AVR GNU Toolchain و درست شد.
الان فایل های سرآیند شناخته میشن و برنامه هم هیچ اروری نداره.
ام بازم موقع کامپایل با ارور قبلی مواجه میشم. یعنی :
make all
make: *** No rule to make target ‘4Ch_learnRemote’, needed by ‘all’. Stop.
سلام
بسیار عالی ، قبل از هر چیزی تبریک میگم بهتون برای تلاش و ممارستی بخرج می دید ، واقعا ستودنی است
خوب ، فکر میکنم به گام های نهایی نزدیک و نزدیک تر شده اید ، فکر میکنم مشکل در حال حاظر از نحوه بازکردن پروژه است ، میشه توضیح دید چطور پروژه رو درون Eclipse باز کردید ؟
با سلام
ضمن تشکر از کد گذاشته شده.
بنده دارم از یک چیپست دیگه بنام pt2240 استفاده میکنم که تنها تفاوت آن با ev1527 درجای syncbit است . لطفا راهنمایی بفرمائید کجای برنامه را تغییر دهم تا با کد شما بتوانم به راحتی دیتاهای دریافتی از pt2240 را تشخیص دهم ؟
با تشکر
حسینی
سلام دوست عزیز
بله حق با شماست pt2240 الگوریتمی مشابه ev1527 دارد البته باید دقت شود که نسبت تایمینگ ها حفظ شده است یا خیر
در مورد مساله syncbit که در انتهای هر فریم ارسالی ارسال میشود به نظرم نیاز به تغییر کد نیست چرا که فریم ها پشت سر هم ارسال می شود و برنامه syncbit انتهای فریم اول را در واقع شروعی برای فریم دوم فرض می کند و اگر تعداد بیت ها و زمان انها درست باشد بدون دست کاری برنامه باید قادر به دریافت کد این نوع آیسی نیز باشد.
سلام ببخشید من کاربری درگاه سریال رو متوجه نشدم؟
صرفا برای خطایابی است، در مواقع لزوم