در این پروژه یک گیرنده ریموت 3 رله میسازیم
برای اینکار نیاز به یکعدد ریموت کنترل بتا که ask ]ستند و در فرکانس 433 کار میکنند
یک عدد ماژول گیرنده ask433 یا pcr433
روش کلی به این صورت هست که ماژول گیرنده کدهای ارسالی ریموت را دریافت میکنه و تبدیل به پالس میکنه و ما اون پالسها را پردازش میکنیم
همانطور که دوستان در تاپیکهای avr اشاره کردن اکثر ریموتهای لرن از آی سی EV1527 استفاده میکنند که این آی سی 24 بیت کد ارسال میکنه
که 20 کد مربوط به سریال ریموت کنترل هست و 4 کد آخر مربوط به کلید ریموت کنترل
این 24 بیت که مجموعه ایی از صفر و یک هست به صورت خاصی ارسال میشود :
یکها پالسی به طول مثلا 3 ms
صفرها پالسی به طول 1 ms
یعنی طول پالسهای یک 3 برابر صفر هست
وقتی کلیدی را فشار میدهیم اول پالس با سطح یک به مدت 3 ms سپس پالسی به طول 31 برابر صفرها اما با سطح صفر میفرسته یعنی 31ms بعدش کدهای صفر و یک را ارسال میکنه پس اول PREMBLE بعد هم 24 کد
پس روش کار به این صورت هست :
همانطور که دوستان در تاپیکهای avr اشاره کردن اکثر ریموتهای لرن از آی سی EV1527 استفاده میکنند که این آی سی 24 بیت کد ارسال میکنه
که 20 کد مربوط به سریال ریموت کنترل هست و 4 کد آخر مربوط به کلید ریموت کنترل
این 24 بیت که مجموعه ایی از صفر و یک هست به صورت خاصی ارسال میشود :
یکها پالسی به طول مثلا 3 ms
صفرها پالسی به طول 1 ms
یعنی طول پالسهای یک 3 برابر صفر هست
وقتی کلیدی را فشار میدهیم اول پالس با سطح یک به مدت 3 ms سپس پالسی به طول 31 برابر صفرها اما با سطح صفر میفرسته یعنی 31ms بعدش کدهای صفر و یک را ارسال میکنه پس اول PREMBLE بعد هم 24 کد
پس روش کار به این صورت هست :
اول منتظر میمونه یک بشه بعدش تا صفر شد طول پالس را اندازه میگیریم هر وقت پالسی اومد که طولش 31ms بود یعنی ریموت داره کد ارسال میکنه بعد از اون تا 24 پالس را ذخیره میکنیم که مربوط به کدهای ریموت هستند .
چون باید اندازه گیری دقیق باشه پایه دیتای گیرنده را به تایمر 1 میکرو میدیم توسط اون اندازه میگیریم .
با کریستال 16 MEG و استفاده از تایمر یک این مقادیر به دست میاد :
PRIMBLE : اگر بین 4500 تا 6500 بود پس میفهمیم که کلید زده شده
یکها : بین 300 تا 800
صفرها : بین 50 تا 300
هر چی هم خارج این مقادیر بود یعنی خطا هست از برنامه خارج میشوید .
حالا میریم سراغ برنامه نویسی :
راه اندازی تایمر 1 :
t1con.0=0: tmr1h=0 :tmr1l=0
t1con=%00110000
حلا در قسمت اصلی برنامه منتظر میمونیم که پایه متصل به ماژول گیرنده هر وقت 1 شد ما عرض پالس را با تایمر 1 اندازه بگیریم اگر مقدار مورد نظر بود عمل کنه فرض کنیم اسم پورتی که دیتای گیرنده وصل هست RF باشه :
if rf=1 then
t1con=%00110000: tmr1h=0 :tmr1l=0 :t1con=%00110001 ;shoro
while rf=1
v2.byte1=tmr1h : v2.byte0=tmr1l
if v2>1000 then goto badesh1
wend
:badesh1
چون باید اندازه گیری دقیق باشه پایه دیتای گیرنده را به تایمر 1 میکرو میدیم توسط اون اندازه میگیریم .
با کریستال 16 MEG و استفاده از تایمر یک این مقادیر به دست میاد :
PRIMBLE : اگر بین 4500 تا 6500 بود پس میفهمیم که کلید زده شده
یکها : بین 300 تا 800
صفرها : بین 50 تا 300
هر چی هم خارج این مقادیر بود یعنی خطا هست از برنامه خارج میشوید .
حالا میریم سراغ برنامه نویسی :
راه اندازی تایمر 1 :
t1con.0=0: tmr1h=0 :tmr1l=0
t1con=%00110000
حلا در قسمت اصلی برنامه منتظر میمونیم که پایه متصل به ماژول گیرنده هر وقت 1 شد ما عرض پالس را با تایمر 1 اندازه بگیریم اگر مقدار مورد نظر بود عمل کنه فرض کنیم اسم پورتی که دیتای گیرنده وصل هست RF باشه :
if rf=1 then
t1con=%00110000: tmr1h=0 :tmr1l=0 :t1con=%00110001 ;shoro
while rf=1
v2.byte1=tmr1h : v2.byte0=tmr1l
if v2>1000 then goto badesh1
wend
:badesh1
برای اینکه قابل فهم باشه توضیح میدم بعدش ادامه برنامه :
دستور IF منتظر میمونه که پالس بیاد سپس تایمر 1 را روشن و مقدارش را صفر میکنه سپس وارد حلقه میشه و تا وقتی یک هست در حلقه میمونه تایمر 1 هم که در حال اندازهگیری هست که در V ذخیره میشه
اما اگر بر اثر نویز یا هر چیز دیگه این پایه مدت زیادی 1 بمونه داخل این حلقه گرفتار میشه برای همین داخل حلقه مقدار V را اندازه میگیریم اگر از مقدار مورد نظر ما بیشتر شد خارج بشه
حالا ادامه برنامه :
t1con=%00110000: tmr1h=0 :tmr1l=0 :t1con=%00110001 ;shoro
while rf=0
s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>6500 then goto badesh2
s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>6500 then goto badesh2
wend
badesh2:
t1con=%00110000 ;payan
s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>4500 then
if s2<6500 then
goto daryaft_kod
badesh2:
t1con=%00110000 ;payan
s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>4500 then
if s2<6500 then
goto daryaft_kod
endif
endif
endif
goto main
دوباره تایمر 1 صفر میشه و روشن میشه و مدت زمانی که پایه صفر هست را میشماره داخل حلقه اگر از مقدار مورد نظر بیشتر شد برای گرفتار نشدن خارج میشه اگر هم مقدار مورد نظر درست
بود که خود به خد از حلقه خارج میشه چون پالس به صفر و یک تغییر میکنه
بعد هم تایمر1 را خاموش میکنیم گناه داره 

بعد هم مقادیر تایمر را در s2 ذخیره میکنیم
حالا اگر این s2 بین مقادیر 4500 تا 6500 بود پش پیش کد ارسال شده باید بلافاصله 24 تا بعدی را بخونیم
اما زیر برنامه دریافت کدها :
اول 34 بیت را دریافت میکنیم که همشون سطح 1 دارند با عرضهای مختلف اونها که 3ms (بین 300 تا 800)هستند یک هستند و اونها که 1 ms (بین 100 تا 300)هستند صفر هستند و هر چی غیر از اینها باشه غلطه خارج میشه
بعدش هم برای اینکه حافظه الکی پر نشه اونها که بین 300 تا 800 هستند را جاش 1 ذخیره میکنیم اونها هم که بین 100 تا 300 هستند جاش صفر میزاریم
حالا بریم توضیح زیر برنامه :
:daryaft_kod
j=0
while j<code
if rf=1 then
t1con=%00110000: tmr1h=0 :tmr1l=0 :t1con=%00110001
while rf=1
s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>850 then goto main
while j<code
if rf=1 then
t1con=%00110000: tmr1h=0 :tmr1l=0 :t1con=%00110001
while rf=1
s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>850 then goto main
wend
:
t1con=%00110000
j=j+1
s2.byte1=tmr1h : s2.byte0=tmr1l
s[j]=s2
tmr1h=0 :tmr1l=0 :t1con=%00110001
endif
wend
:
t1con=%00110000
j=j+1
s2.byte1=tmr1h : s2.byte0=tmr1l
s[j]=s2
tmr1h=0 :tmr1l=0 :t1con=%00110001
endif
wend
tmr1h=0 :tmr1l=0 :t1con=%00110000
for i=1 to code
if s>=300 and s<=800 then
s=1
else
if s>=100 and s<300 then
s=0
else
tmr1h=0 :tmr1l=0 :t1con=%00110000
j=0
goto main
endif
endif
for i=1 to code
if s>=300 and s<=800 then
s=1
else
if s>=100 and s<300 then
s=0
else
tmr1h=0 :tmr1l=0 :t1con=%00110000
j=0
goto main
endif
endif
next i
توسط حلقه while j تا 24 کد را میخونه و ذخیره میکنه سپس خارج میشه
منتظر میمونه 1 بشه تایمر روشن وارد حلقه میشه اگر بیشتر از مقدار مورد نظر بود برای اینکه توی حلقه گیر نکنه خارج میشه اگر مجاز بود که از حلق میاد بیرون و مقدار تایمر در یک آرایه ذخیره میشه
به همین ترتیب هر 24 تا در یک آرایه 24 تائی ذخیره میشوند
سپس توسط حلقه for اونها که بین 100 تا 300 بودن بهشون 0 مقدار میدیم و اونها که بین 300 تا 800 بودن بهشون 1 میدیم
هر چی هم خارج این مقادیر باشه یعنی اشتباه از برنامه خارج میشه
خوب حالا ما کدها را داریم باید 20 تا بیت اول را ذخیره کنیم و 4 تا بیت آخر مشخص میکنه که کدوم کلید زده شده
در ادامه برنامه کامل و فایل pcb را میزارم .
دیدگاه