قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 31-07-2016, 07:25 PM المشاركة 1   
افتراضي كود استقبال ريموت سهل وبسيط Twitter FaceBook Google+



بسم الله الرحمن الرحيم
السلام عليكم
سوف نقوم اليوم بعمل كود استقبال لريموت سامسونج
الكود يتميز عن غيره بسهولته وصغره
واذا فهمنا فكرته نستطيع عمل اى كود استقبال لاى ريموت
قبل ان نبدأ مفترض انك تعرف ان تقيس نبضة اى ريموت وانك تعرف بروتوكولات شفرات الريموت
وان كنت لا تعرف تفضل هنا اولا
موضوع تعلمت منه كل شئ عن الريموت لاستاذنا
funky_112233
http://www.qariya.info/vb/showthread.php?t=112840
نحن الان نعرف ان شفرات ريموت سامسونج تعمل
NEC ببرتوكول
وهذا البرتوكول بيمثل ال 1 منطقى ب
كود:
 560 us pwm on & 1690 us pwm off
والصفر المنطقى ب
كود:
 560 us pwm on & 560  us pwm off
اذن الفرق بين الواحد المنطقى والصفر المنطقى هو فى زمن
اطفاء ال pwm
ونحن نعلم ان خرج المستقبل معكوس اى
واحد منطقى عندما لايكون ارسال وصفر منطقى عندما يكون ارسال
اذن فى كود الاستقبال عندما يشعر الميكرو باستقبال اشارة
سوف نقوم بحساب الزمن التى يكون فيه خرج المستقبل بواحد ونهمل الزمن التى يكون فيه خرج المستقبل بصفر
لماذا
لان الزمن التى يكون فيه المستقبل بصفر ثابتا فى حالتى الصفر والواحد .
كيف يعمل ريموت سامسومج ؟
نحن نعلم ان ريموت سامسونج يعمل ببرتوكول NEC
ولاكن ما هى الشفرات التى يعمل بها الريموت
اولا يعطى اشارة البداية وهى عبارة عن
ارسال لمدة 4500 ميكرو ثانية
ثم ايقاف لمدة 4500 ميكرو ثانية
ثانيا ارسال العنوان وهو عبارة عن بايت كامل ويساوى بلهكس 0xe0
ثم يعاد مرة اخرى
واشارة البداية والعنوان ثابتين لكل مفاتيح الريموت
ثم الكوموند وهو عبارة عن بايت ثم معكوسه
ولمعرفة كود كل مفتاح يمكنك النظر لهذه الصورة لاخينا مظلوم بارك الله فيه
http://www7.0zz0.com/2012/08/02/23/425672309.png
وحتى نفهم اكثر ناخذ مثال لمفتاح الباور
وكوده بلهكس 0x40bf
فى البداية الريموت
يرسل لمدة 4500 ميكروثانية
يقف عن الارسال لمدة 4500 ميكرو ثانية
دى نبضة البداية
ثم يرسل
11100000,11100000
وده العنوان وهو يساوى بلهيكس e0e0
ثم يرسل
01000000,10111111
وبلهكس يساوى 0x40bf

المرة القادمة ان شاء الله سوف نعرض الكود مع شرحه
مع انه بسيط جدا وفهمه سيكون سهل جدا ياذن الله

اعلانات

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 01-08-2016, 01:45 AM المشاركة 2   
افتراضي


بسم الله الرحمن الرحيم
السلام عليكم
سوف نقوم اليوم بعمل كود استقبال لريموت سامسونج
الكود يتميز عن غيره بسهولته وصغره
واذا فهمنا فكرته نستطيع عمل اى كود استقبال لاى ريموت
قبل ان نبدأ مفترض انك تعرف ان تقيس نبضة اى ريموت وانك تعرف بروتوكولات شفرات الريموت
السلام عليكم ورحمه الله ..


بارك الله فيك أخى .. على الموضوع المميز دة انا فعلا محتاج شرح بالتفصيل لكود الإستقبال برتكول NEC
.. وانا الحمد لله تعاملت مع كود الإرسال وافهمه ..

تحياتى لك ومنتظرين الكود مع الشرح ...


ولى اقتراح لو تسمح ... يكون الشرح على ريموت mp3 سيارة ..

ودة الكود الخاص به ...



protocol for NEC remote
0 -01101000
1 -00110000
2 -00011000
3 -01111010
4 -00010000
5 -00111000
6 -01011010
7 -01000010
8 -01001010
9 -01010010

FL+ -10011000
FL- -10110000
EQ -10010000
- -11100000
+ -10101000
Prev -00100010
Next -00000010
Play -11000010
CH -01100010
CH+ -11100010
CH- -10100010




ياريت الشرح يكون على الريموت دة .. لأنه متوفر ورخيص الثمن .. ويمتاز بعدد زراير كثيرة ...


تحياتى وبالتوفيق

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 01-08-2016, 10:10 AM المشاركة 3   
افتراضي


السلام عليكم
اخى العزيز عبدالله
لم تذكر اى تفاصيل غير كود كل مفتاح
ضرورى ان نعرف ما هى قيمة نبضة البداية
وما هو قيمة الادرس
عموما ان شاء الله بعد عرض الكود وفهمه ستكتب كود اى ريموت بنفسك ان شاء الله
لان الكود كامل عبارة عن جملة فور واحدة فقط
انتظرنى ان شاء الله

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 03-08-2016, 12:13 AM المشاركة 4   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


السلام عليكم
اخى العزيز عبدالله
لم تذكر اى تفاصيل غير كود كل مفتاح
ضرورى ان نعرف ما هى قيمة نبضة البداية
وما هو قيمة الادرس
عموما ان شاء الله بعد عرض الكود وفهمه ستكتب كود اى ريموت بنفسك ان شاء الله
لان الكود كامل عبارة عن جملة فور واحدة فقط
انتظرنى ان شاء الله
ننتظرك أخى ... لكى تكمل الموضوع ..
بارك الله فيك ..

بالتوفيق


magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 03-08-2016, 12:40 AM المشاركة 5   
افتراضي


بسم الله الرحمن الرحيم
السلام عليكم
نبدأ على بركة الله
اولا
فكرة عمل الكود تعتمد على تايمر 1
تايمر 1 يمتاز بامرين
اولا انه 16 بت اى ممكن ان يعد حتى 65535
ثانيا ان يمكنك ان تشغله وتطفيه وقتما شئت وذلك عن طريق البت رقم 0 فى ريجستر التحكم لتايمر 1 كما فى الصورة
[IMG][/IMG]

تايمر 1 له سجلان كل منهم 8 بت
الاول هو tmr1l وهو السجل الادنى
والثانى هو tmr1h وهو السجل الاعلى

ناتى للكود

كود:
                ///  بسم الله الرحمن الرحيم ///
#define           ir           portb.f0
#define           t_on         t1con.f0=1;
#define           t_off        t1con.f0=0;
#define           is           ==
#define           t_clear      tmr1l=0;  tmr1h=0;
#define           adress       0xe0e0
#define           power        0x40bf
#define           source       0x807f
#define           up           0x06f9
#define           down         0x8679
#define           left         0xa659
#define           right        0x40b9
#define           menu         0x58a7



int  k,m;
char x;
bit  b;
 /////////////////////////////////////
void chk_code()
               {
               if(k is source)
                            {
                             portb.f1=!portb.f1;
                            }
               else
               if(k   is  up)
                            {
                             portb.f2=!portb.f2;
                            }
               else
               if(k is down)
                            {
                             portb.f3=!portb.f3;
                            }
              else
              if(k  is  left)
                            {
                             portb.f4=!portb.f4;
                            }
              else
              if(k is right)
                            {
                             portb.f5=!portb.f5;
                            }
              else
              if(k  is  menu)
                            {
                             portb.f6=!portb.f6;
                            }
              else
              if(k is power)
                            {
                             portb.f7=!portb.f7;
                            }
                }
///////////////////////////////////////
 void interrupt()
{
delay_us(800);
if(ir is 0)
{
m=0;
k=0;
t_clear
while(!ir){}
t_on
while(ir) {}
t_off
m=tmr1l|tmr1h<<8;
if(m<5000&&m>4000)
                 {
                  for(x=31;x<255;x--)
                                    {
                                     m=0;
                                     t_clear
                                     while(!ir){}
                                     t1con.f0=1;
                                     while(ir){}
                                     t1con.f0=0;
                                     m=tmr1l|tmr1h<<8;
                                     if(m>700)
                                              b=1;
                                     else
                                              b=0;
                                     k=k|b<<(x%16);
                                     if(x is 16)
                                                {
                                                 if( k is adress)
                                                                 k=0;
                                                 else
                                                     {
                                                      intcon.f1=0;return;
                                                     }
                                                 }
                                    }
                  chk_code();
                  }
delay_ms(250);

}
intcon.f1=0;
}
////////////////////////////////////////////////
void init_pic()
               {
                portb=0;
                trisb=1;
                option_reg.f6=0;
                intcon=0b10010000;
               }
////////////////////////////////////////////////
void main()
          {
           init_pic();
          }
شرح الكود
اول شى قمت ببعض التعريفات من خلال #define
اعتقد انه لايحتاج لشرح
ثانيا اعلنت عن 4 متغيرات اثنان من نوع int اى 16 بت
وواحد من نوع char اى 8 بت
وواحد من نوع bit اى بت واحد

نبدأ من اول دالة وهى الدالة الرئيسية

نجد استدعاء دالة
كود:
init_pic();
وبها
صفرت بورت بى وجعلت البت رقم صفر للبورت بى دخل والباقى خرج
وفعلت الانتربت ثم فعلت الانترربت الخاص B0
وجعلت النترربت يحدث عندما يتغير من hi الى low
لان المستقبل يعمل بصورة عكسية
من خلال الامران
كود:
option_reg.f6=0;
                intcon=0b10010000;
وعند استقبال الاشارة على المستقبل
يذهب البيك لدالة الانتررابت
اول شئ ينتظر 800 ميكرو ثانية ثم يختبر هل البت رقم صفر فى بورت بى لايزال بصفر ام لا
اذا كان بصفر يبدأ فى حساب الكود واذا لم يكن بصفر اذا هذا كان مجرد نويز ويرجع البيك للدالة الرئيسية من غير مايفعل اى شئ
ملحوظة الكود يعمل من غير هذه الخطوة ولاكن ليس بنفس الاستقرار
وبعد ذلك بنصفر المتغيران K ,M وسجلان تيمر 1
وبعد ذلك نجعل البيك لايفعل شئ طالما ir بصفر اى ان الpwm فى الريموت فى حالة on
وهذا الوقت الذى تحدثت عنه باننا سنهمله لانه ثابت فى حالة الواحد والصفر
من خلال الامر
كود:
while(!ir){}
وبعد ان ينتهى زمن التشغيل وهو 4500 ميكرو ثانية فى ريموت سامسونج
سيتحرر البيك من جملة while
وبعده سوف يعمل التيمر 1 من خلال تفعيل البت صفر من ريجستر التحكم لتيمر 1
كود:
#define           t_on         t1con.f0=1;
وبعدها يدخل البيك فى جملة while طالما البت صفر من البورت بى بواحد من خلال
كود:
while(ir) {}
وبعد ان ينتهى زمن الايقاف من الريموت ويبدأ الريموت بارسال اشارة جديدة
سوف يتحرر البيك من جملة while
وبعدها سوف نطفئ تيمر 1 من خلال
كود:
#define           t_off        t1con.f0=0;
وتايمر 1 يعد من المذبذب الداخلى للبيك اى يعد كل واحد ميكرو ثانية
ونسبة العد 1:1
ملحوظة نحن مازال فى اشارة البداية
ونحن نعلم ان وقت الاطفاء لاشارة البداية لريموت سامسونج هى 4500 ميكرو ثانية
اى مفترض ان يكون تايمر 1 وصل للعد الى الرقم 4500
ولاكن تايمر 1 له سجلان ونحن نريد ان نضعهم فى متغير واحد
فنلجأ الى هذا
كود:
m=tmr1l|tmr1h<<8;
وهى نجعل المتغير m يساول السجل الادنى اور السجل الاعلى مزحزح 8 خانات
لليسار حتى نجعل قيمة تايمر 1 فى متغير واحد وهو m
وبعد ذلك نختبر قيمة m اذا كانت بين 4000 و5000 اذن اشارة البداية سليمة ونكمل الاختبار وان لم تكن سليمة لانكمل الاختبار من خلال
كود:
if(m<5000&&m>4000)

نكمل غدا ان شاء الله


التعديل الأخير تم بواسطة : magdy_3 بتاريخ 03-08-2016 الساعة 01:07 AM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 04-08-2016, 12:39 AM المشاركة 6   
افتراضي


بسم الله الرحمن الرحيم
السلام عليكم
بعد ان تاكدنا ان نبضة البداية مظبوطة
وتحقق شرط جملة اف
سيدخل الميكرو فى جملة فور وهى تكرار 32 مرة عدد اشارات الادرس والكوموند
اول شئ بعد جملة فور نكرر ما فعلنه سابقا لاختبار اشارة البداية
تصفير المتغير m ثم تصفير سجلان تايمر 1
ثم جعل الميكرو لايفعل شئ عندما تكون قيمة ال ir بصفر ( زمن تشغيل ال pwm
المهمل )
من خلال
كود:
     while(!ir){}
وبعد ان يخرج من while نبدأ فى الحساب لنعرف هل الاشارة المرسلة واحد ام صفر
فا ان كانت قيمة m اكبر من 700 اذن الاشارة المرسلة هى 1
ولو كانت اقل اذن الا شارة المرسلة بصفر
من خلال
كود:
    t1con.f0=1;
                                     while(ir){}
                                     t1con.f0=0;
                                     m=tmr1l|tmr1h<<8;
                                     if(m>700)
                                              b=1;
                                     else
                                              b=0;
وبعد ذلك نكتب الامر
كود:
 k=k|b<<(x%16);
وفائدة هذا الامر هو تغيير كل بت فى المتغير k بقيمة b
وبعد ان يكتمل المتغير k اى مضى 16 بت الخاصين بلادرس
نختبر قيمة k هل تساوى الادرس ام لا ان كانت تساوى الادرس نصفر المتغير k
لكى نبدا فى حساب الكوموند
وان كان لا يساوى الادرس يخرج فورا ولا يكمل الاختبار
وبعد ان يختبر قيمة k وفى حالة انها كانت تساوى الادرس
نبدأ فى الحساب من جديد لحساب
الكوموند
وبعد انتهاء جملة فور يذهب الميكرو لدالة اختبار الكود حتى يعرف الميكرو ماذا يفعل من على حسب قيمة k
هنا دالة الاختبار لك فيها حرية الاختيار
ممكن ان تستعمل if كما فعلت انا
وممكن ان تستعمل switch case
زى ما تحب
المهم انك تكون عارف قيمة شفرة المفتاح الذى تريد ان تستخدمه
حتى تقارن قيمة k بقيمة شفرة المفتاح
وتخبر الميكرو ان كانو متساويين افعل كذا
وكما ترى ان كتبت فى التعريفات كل اسم مفتاح معرف بقيمة شفرته
كود:
#define           adress       0xe0e0
#define           power        0x40bf
#define           source       0x807f
#define           up           0x06f9
#define           down         0x8679
#define           left         0xa659
#define           right        0x40b9
#define           menu         0x58a7
اعتقد ان الكود سهل جدا
ولاكن من يجد اى صعوبة فى اى جزء لا يتردد فى السوال
وانا لم اكتفى بعمل الكود على المحكاه
ولاكن جربته عمليا والحمد لله عمل معى بكفائة عالية
وشكرا


التعديل الأخير تم بواسطة : magdy_3 بتاريخ 04-08-2016 الساعة 12:44 AM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 04-08-2016, 01:15 AM المشاركة 7   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


السلام عليكم ورحمه الله وبركاته ..


جزاك الله خيرااا وبارك فيك ... مشكور على المجهود ..
سوف أقوم بقرأة الموضوع أكثر من مرة حتى استطيع استعابة وفهمه ..
وأطلب من طلب .. أخى .. أن تصبر علي حتى اتمكن من فهم الكود .. ولك كل الشكر والإحترام .

وياريت لو عند حضرتك وقت .. أن تقطع الكود وتقوم بشرح كل جزء واضافة تعليقات توضيحيه ... المهم لدى أن اتمكن من التعامل مع التايمر .. لأنه هو أهم نقطه فى الكود ..

ويوجد وقط نبضات داخلي للتايمر .. كيف يمكن أجراء الحسابات بنائناااا على عدد النبضات المظبوطه على التايمر لكى يصل للطفح .. لأن التايمر يقدر على عد 256 نبضه فقط .. وهنا نستعين ب متغير لكى نتخطى العدد 256 ..

مشكور جدااا أخى وبالتوفيق ..


magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 04-08-2016, 03:43 PM المشاركة 8   
افتراضي


السلام عليكم ورحمه الله وبركاته ..


جزاك الله خيرااا وبارك فيك ... مشكور على المجهود ..
سوف أقوم بقرأة الموضوع أكثر من مرة حتى استطيع استعابة وفهمه ..
وأطلب من طلب .. أخى .. أن تصبر علي حتى اتمكن من فهم الكود .. ولك كل الشكر والإحترام .

وياريت لو عند حضرتك وقت .. أن تقطع الكود وتقوم بشرح كل جزء واضافة تعليقات توضيحيه ... المهم لدى أن اتمكن من التعامل مع التايمر .. لأنه هو أهم نقطه فى الكود ..

ويوجد وقط نبضات داخلي للتايمر .. كيف يمكن أجراء الحسابات بنائناااا على عدد النبضات المظبوطه على التايمر لكى يصل للطفح .. لأن التايمر يقدر على عد 256 نبضه فقط .. وهنا نستعين ب متغير لكى نتخطى العدد 256 ..

مشكور جدااا أخى وبالتوفيق ..
السلام عليكم اخى الكريم بنسبة للكود اعتقد انى شرحت كل جزء فيه
ولو فى جزء مش مفهوم انا تحت امرك
بنسبة لتايمر 1 فهو مكون من 2 بايت اى انه يعد الى 65535 وليس 256
ولذلك لجئت الى
كود:
m=tmr1l|tmr1h<<8;

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 09:03 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025