محصولات ECA

* جستجوي گوگل

Google


در كل اينترنت
در سایت ECA

* facebook

http://vip.eca.ir/sharing/uploads/13487606581.png
صفحه رسمی فیسبوک ECA

نويسنده موضوع: ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO  (دفعات بازديد: 2258 بار)

0 کاربر و 1 مهمان درحال ديدن موضوع.

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
 
در این پروژه یک گیرنده ریموت 3 رله میسازیم
برای اینکار نیاز به یکعدد ریموت کنترل بتا که ask ]ستند و در فرکانس 433 کار میکنند
یک عدد ماژول گیرنده ask433 یا pcr433
روش کلی به این صورت هست که ماژول گیرنده کدهای ارسالی ریموت را دریافت میکنه و تبدیل به پالس میکنه و ما اون پالسها را پردازش میکنیم

همانطور که دوستان در تاپیکهای 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
برای اینکه قابل فهم باشه توضیح میدم بعدش ادامه برنامه :
دستور 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
wend
 badesh2:
 t1con=%00110000  ;payan
 
 s2.byte1=tmr1h : s2.byte0=tmr1l
if s2>4500  then
   if s2<6500    then
               
        goto daryaft_kod     
   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
         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
   next i 
توسط حلقه while j  تا 24 کد را میخونه و ذخیره میکنه سپس خارج میشه
منتظر میمونه 1 بشه  تایمر روشن وارد حلقه میشه اگر بیشتر از مقدار مورد نظر بود  برای اینکه توی حلقه گیر نکنه خارج میشه اگر مجاز بود که از حلق میاد بیرون و مقدار تایمر در یک آرایه ذخیره میشه
به همین ترتیب هر 24 تا در یک آرایه 24 تائی ذخیره میشوند
سپس توسط حلقه for  اونها که بین 100 تا 300 بودن بهشون 0 مقدار میدیم و اونها که بین 300 تا 800 بودن بهشون 1 میدیم
هر چی هم خارج این مقادیر باشه یعنی اشتباه از برنامه خارج میشه
خوب حالا ما کدها را داریم باید 20 تا بیت اول را ذخیره کنیم و 4 تا بیت آخر مشخص میکنه که کدوم کلید زده شده
در ادامه برنامه کامل و فایل pcb  را میزارم .
همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت

یعنی طول پالسهای یک 3 برابر صفر هست

وقتی کلیدی را فشار میدهیم  اول پالس با سطح یک به مدت 3 ms سپس پالسی به طول 31 برابر صفرها اما با سطح صفر میفرسته یعنی 31ms بعدش کدهای صفر و یک را ارسال میکنه پس اول PREMBLE بعد هم 24 کد .[/i][/left]
آقا خیلی قشنگ توضیح دادید.حیفم اومد اینجوری تشکر نکنم. فقط یه سوال اون بالاگفتید طول پالس های یک 3 برابر صفر هست ولی تو تاپیک های avr تو اون نقشه ها اونجوریکه معلومه طول پالس های صفر 31 برابر طول پالس های یک هست یعنی اگر یه پالس 1 به مدت زمان 1 میلی ثانیه داشتیم باید بعدش یه پالس با سطح منطقی به مدت زمان 31 میلی ثانیه داشته باشیم.درسته؟؟ البته واسه premble ها. درسته؟؟

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
ممنون از لطفت

پریم ایبل درسته اگر پالس یک مثلا 1 ms  باشه اون 31ms  میشه اما نه منفیه  یعنی 31ms زمین داریم
توی برنامه هم اگر دقت کنید اول تا وقتی 1 هست داخل حلقه میمونه بلافاصله که یک تموم شد مدت زمان صفر یعنی همین 31 ms را تست میکنه
اگر با Pic  و تایمر 1 و اسیلاتور 16 MHZ  تست کنید دقیقا همین اعداد را به دست میارید .
while rf=0 اینجا همون 31 ms  را اندازه میگیره
  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     
   endif     
همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت
اقا من به یه مشکل دیگه خوردم. اول میگیم اگر دیتایی با سطح منطقی یک اومد تایمر روشن شه به صورت برنامه زیر


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

چرا حالا میگیم اگر v2>1000 بره به برچسب بعدی؟؟ 1000 یعنی 2 میلی ثانیه.نباید بگیم اگر v2==500 شد یا v2>500 شد بره برچسب بعدی؟؟
و یه سوال دیگه اینکه چرا وقتی میره برچسب بعدی یعنی برچست badesh2 باید مقدار s2 بین 4500 و 6500 باشه؟؟6500 یعنی 13 میلی ثانیه و 4500 یعنی 9 میلی ثانیه. چرا باید بین این 2 زمان باشه تا برای دریافت کد آماده بشه؟؟ مگه وقتی سطح منطقی صفر شد نباید زمانمون 31 میلی ثانیه باشه؟؟ ممنونم .

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
این زمان 1 ms  و 31 ms  فقط یک مثال بود که مفهمو بیان بشه زمان دقیقش را اندازه نگرفتم بدونم واقعا چند هست و کاری با زمان دقیقش هم نداریم
چون عرض پالس را که اندازه بگیریم دقیقا همین اعداد به دست میاد ، و نیازی نیست شما وقتت را بزاری که این اعداد را از اول به دست بیاری
اما جواب شما :
 وقتی ریموت نزدیک گیرنده هست عرض پالسها زیاده و وقتی که دور میشه عرض پالسها کم میشه برای همین مجبوریم یک بازه براش تعریف کنیم تا برد ریموت هم بیشتر بشه و خیلی مهمه
گفتیم که

PRIMBLE : اگر بین 4500 تا 6500 بود پس میفهمیم که کلید زده شده
یکها : بین 300 تا 800
صفرها : بین 50 تا 300

همونطور که میبینی بازه کلی ما بین 50 تا 800 هست که من گفتم بیشتر از 1000 شد خارج بشه  میتونستیم بگیم بیشتر از 800 مشکلی نداره

گفتیم بین 4500 تا 6500 : بله میتونیم زمان واقعی اون را در نظر بگیریم  و مشکلی هم نداره  اما  تا میکرو بخواد اندازه بگیره یک کمی زمان از دست میدیم ، ضمنا نویز ممکنه این وسط  دخالت کنه ، و اینکه با اینکار ما یکمی زمان میخریم که میکرو آماده بشه کدهای اصلی را دریافت کنه  ، هم اینکه مثلا فرض کنید 31 ms زمین داریم  هیچ دلیلی نداره ما بگیم اگر دقیقا 31 ms شد وارد برنامه اصلی بشه میگیم اگر 20 تا شد یا 15 تا شد اینجوری کلی زمان خریدیم ضمن اینکه فاصله ریموت تا گیرنده اگر زیاد باشه این 31 ms واقعا کم میشه برای همین نرم افزاری  هم برد ریموت را بیشتر کردیم هم اثر تویز را کم کردیم هم سرعت دریافت کد را بیشتر کردیم و ....

همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت
آقا دست گلت درد نکنه فکر کنم گرفتم. پس توی برنامه اول میایم میگیم اگر پایه rf یک شدش تایمر روشن بشه اگر زمان تایمر یک بیشتر از 2 میلی ثانیه شد میپره اول برنامه ولی  اگر کمتر بود صدرصد بعدش صفر میشه پایه rf  و دوباره تایمر صفر میشه و روشن میشه و میره مقدار زمان صفر بودن پایه rf اندازه میگیره که اگر بین 9 میلی ثانیه و 13 میلی ثانیه بود میره واسه گرفتن کد و اگر بین این مقدار نبود میپره اول برنامه.درسته؟؟ البته اینایی ک گفتم واس primble بود.
میشه بقیشم یه خورده بیشتر توضیح بدید؟؟ زمان هر صفر و یک شدن در این ریموتا یعنی 100تا 800 تا طول میکشه؟؟ یعنی اگر 2 بار صفر
پشت هم اومد چطور باید تشخیص دادش؟؟ اونجوری شاید بالای 1600 تا بره که
« آخرين ويرايش: فبريه 21, 2012, 07:36:36 pm توسط mahdifaheca »

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
خواهش میکنم
بله کاملا درسته

گفتیم که 1 یعنی پالس مثبت به مدت 3 ms  و صفر پالس مثبت به مدت 1ms  ، پس مثلا اگر دو تا صفر اومد یعنی یک پالس 1 ms میاد بعدش صفر میشه و بعدش دوباره یک پالس 1 ms میاد ، چون کلا تعریف پالس همینه مجموعه ایی از صفر و یکها میشه
همیشه اول و آخر هر پالسی زمینه (صفر)

وقتی که پریمابل را فهمید وارد زیر برنامه daryaft code  میشه  که اونجا فقط عرض پالسهای مثبت را اندازه میگیره چون همه صفر و یکها پالس مثبت با عرض 1و3 ms هستند .  برای همین اول برنامه  گفته :


   
     while j<code  جای کد باید 24 بزارید  من حواسم نبود تغییرش بدین  ،
   
       
      if rf=1 then  اگر پالس 1 آمد وارد میشه
         t1con=%00110000: tmr1h=0 :tmr1l=0 :t1con=%00110001
         while rf=1 عرض پالس 1 را اندازه میگیره
            s2.byte1=tmr1h : s2.byte0=tmr1l
            if s2>850 then goto main اگر بیشتر از 850 شد پس خطاست و خارج میشه
         wend
       :
          t1con=%00110000
          j=j+1
          s2.byte1=tmr1h : s2.byte0=tmr1l
          s[j]=s2
          tmr1h=0 :tmr1l=0 :t1con=%00110001
       endif
    wend     
همانطور که میبینید حلقه while  تا 24 کد را دریافت میکنه سپس وارد if میشه تا عرض پالسهای یک را اندازه بگیره  ، سپس مقدار به دست اومده را در آرایه s[j ذخیره میکنه
پس به این ترتیب ما 24 کد را دریافت کردیم
و هر جائی که عرض بیشتر از 850 شد یعنی خطا داریم از برنامه خارج میشه

همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت
آقا دمت گرم.گرفتم . فقط یه سوال. فرض کنید ما بعد از 6 پالس صفر primble شروع کردیم به دریافته کدها که اینجوری تا 31 پالس صفر ما 25 تا از پالسامون نیمیده. میخاستم بدونم واس دریافت کد قاطی نمیکنیم اینجوری؟ آخه 25 تا پالس 1 میلی ثانیه میاد که از نظر اشتباه من با اون 20 کد اشتباه گرفته میشه.منظورم اینه که زمانیکه ما میریم تو زیر برنامه دریافت کد هنوز 25 تا کد پریمبل داریم که نیمدن  در این صورت  اشتباه گرفته نمیشن با اون 20 تا کد ریموت؟؟ یه سوال دیگه اینکه s[j]=s2 یعنی چی؟؟ مرس

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
نه اشتباه نمیکنه چون پریم ابل ما  صفر ولته  ولی کدهای ما همه پالس  مثبت هستند

چون تایمر استفاده کردیم  و 16 بیتی هست محتوای 8 بیت بالا و پائین تایمر یک  را توی S2 ذخیره میکنیم

   s2.byte1=tmr1h :
s2.byte0=tmr1l

سپس تک تک کدها را توی آرایه ذخیره میکنیم   J]S]
همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت
آقا من همش فهمیدم فقط یه جاش موندم. اول فکردم پایه دیتای گیرندر میدیم به وقفه پورت بی ولی الان میبینم باید بدیمش به تایمر1 میکرو. یعنی t1ck1 درسته؟؟ ولی تو تنظیمات تایمرتون که از تایمر داخلی استفاده کردید. میشه یه خورده در این موردش بیشتر توضیح بدید.مرسی

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
نه از وقفه اصلا استفاده نشده تایمر یک را در حالت شمارنده پیکربندی میکنیم
و دیتای گیرنده به یکی از پایه های میکرو وصل میشه من به c1 دادم مهم نیست کدوم پایه باشه
توسط تایمر1 مدت زمان High  یا low  شدت پایه را اندازه میگیرم
همین
همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت
ولی شما که رجیستر t1con به صورت t1con=%00110000 پیکر بندی کردید. بیت یک  هم باید 1 باشه پس ولی شما صفر گذاشتید فکنم حواستون نبوده.درسته؟

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
درسته اما اول برنامه نگاه کنید بیت 1 فعاله اونجا که صفر شده خاموش شده
همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت

آنلاين mahdifaheca

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 35
  • -دريافتي: 84
  • ارسال: 315
    • کارشناسی برق-قدرت
اول برنامه هم بیت صفر یک هستش که مربوط به روشن کردن تایمر هست بیت صفر . باید ایجوری بشه t1con=%00110011 وقتی درست میشه.درسته؟

آفلاين eshgh_namordeh

  • کاربر ساده سطح پنجم
  • *
  • تشکر
  • -اهدايي: 155
  • -دريافتي: 228
  • ارسال: 265
    • لیسانس
    • پرشین موتور
بله درسته
اول برنامه هم اول خاموش کردیم مجددا روشن کردیم
 که دیتای گیرنده وصل هست 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
همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
کانت