اطلاعیه

Collapse
No announcement yet.

ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO


    در این پروژه یک گیرنده ریموت 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 را میزارم .
    همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
    کانت

    #2
    پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

    نوشته اصلی توسط eshgh_namordeh

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

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

    دیدگاه


      #3
      پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

      ممنون از لطفت

      پریم ایبل درسته اگر پالس یک مثلا 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
      همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
      کانت

      دیدگاه


        #4
        پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

        اقا من به یه مشکل دیگه خوردم. اول میگیم اگر دیتایی با سطح منطقی یک اومد تایمر روشن شه به صورت برنامه زیر


        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 میلی ثانیه باشه؟؟ ممنونم .
        طب اسلامی

        دیدگاه


          #5
          پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

          این زمان 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 واقعا کم میشه برای همین نرم افزاری هم برد ریموت را بیشتر کردیم هم اثر تویز را کم کردیم هم سرعت دریافت کد را بیشتر کردیم و ....

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

          دیدگاه


            #6
            پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

            آقا دست گلت درد نکنه فکر کنم گرفتم. پس توی برنامه اول میایم میگیم اگر پایه rf یک شدش تایمر روشن بشه اگر زمان تایمر یک بیشتر از 2 میلی ثانیه شد میپره اول برنامه ولی اگر کمتر بود صدرصد بعدش صفر میشه پایه rf و دوباره تایمر صفر میشه و روشن میشه و میره مقدار زمان صفر بودن پایه rf اندازه میگیره که اگر بین 9 میلی ثانیه و 13 میلی ثانیه بود میره واسه گرفتن کد و اگر بین این مقدار نبود میپره اول برنامه.درسته؟؟ البته اینایی ک گفتم واس primble بود.
            میشه بقیشم یه خورده بیشتر توضیح بدید؟؟ زمان هر صفر و یک شدن در این ریموتا یعنی 100تا 800 تا طول میکشه؟؟ یعنی اگر 2 بار صفر
            پشت هم اومد چطور باید تشخیص دادش؟؟ اونجوری شاید بالای 1600 تا بره که
            طب اسلامی

            دیدگاه


              #7
              پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

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

              گفتیم که 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 شد یعنی خطا داریم از برنامه خارج میشه

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

              دیدگاه


                #8
                پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

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

                دیدگاه


                  #9
                  پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                  نه اشتباه نمیکنه چون پریم ابل ما صفر ولته ولی کدهای ما همه پالس مثبت هستند

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

                  s2.byte1=tmr1h :
                  s2.byte0=tmr1l

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

                  دیدگاه


                    #10
                    پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                    آقا من همش فهمیدم فقط یه جاش موندم. اول فکردم پایه دیتای گیرندر میدیم به وقفه پورت بی ولی الان میبینم باید بدیمش به تایمر1 میکرو. یعنی t1ck1 درسته؟؟ ولی تو تنظیمات تایمرتون که از تایمر داخلی استفاده کردید. میشه یه خورده در این موردش بیشتر توضیح بدید.مرسی
                    طب اسلامی

                    دیدگاه


                      #11
                      پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                      نه از وقفه اصلا استفاده نشده تایمر یک را در حالت شمارنده پیکربندی میکنیم
                      و دیتای گیرنده به یکی از پایه های میکرو وصل میشه من به c1 دادم مهم نیست کدوم پایه باشه
                      توسط تایمر1 مدت زمان High یا low شدت پایه را اندازه میگیرم
                      همین
                      همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
                      کانت

                      دیدگاه


                        #12
                        پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                        ولی شما که رجیستر t1con به صورت t1con=%00110000 پیکر بندی کردید. بیت یک هم باید 1 باشه پس ولی شما صفر گذاشتید فکنم حواستون نبوده.درسته؟
                        طب اسلامی

                        دیدگاه


                          #13
                          پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                          درسته اما اول برنامه نگاه کنید بیت 1 فعاله اونجا که صفر شده خاموش شده
                          همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
                          کانت

                          دیدگاه


                            #14
                            پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                            اول برنامه هم بیت صفر یک هستش که مربوط به روشن کردن تایمر هست بیت صفر . باید ایجوری بشه t1con=%00110011 وقتی درست میشه.درسته؟
                            طب اسلامی

                            دیدگاه


                              #15
                              پاسخ : ساخت گیرنده ریموت کد لرن توسط PIC16F876 به زبان PICBASIC PRO

                              بله درسته
                              اول برنامه هم اول خاموش کردیم مجددا روشن کردیم
                              که دیتای گیرنده وصل هست 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
                              همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
                              کانت

                              دیدگاه

                              لطفا صبر کنید...
                              X