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