اطلاعیه

Collapse
No announcement yet.

کمک!مشکل در کار کردن با تایمرها

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

    کمک!مشکل در کار کردن با تایمرها

    سلام به همه دوستان عزیز
    من یک مشکل دارم دوستان در صورت امکان با کمک به من خانه ای در بهشت برای خود مهیا کنند!!
    این موضوع قبلا هم به صورت دیگری مطرح شده بود ولی علیرغم محبت دوستان به خاطر کم سوادی بنده گره ای باز نکرد.
    اصل مسئله:
    یک پالس ورودی دارم با پریود 64 میکرو ثانیه با مثلا 10 میکرو ثانیه سطح پایین و 54 میکرو ثانیه سطح بالا.
    یک ورودی دارم که از یک سوئیچ می آید و با یک شدن آن سیستم خروجی خواهد داشت در غیر اینصورت خروجی همیشه مثلا یک خواهد بود.
    یک پتانسیومتر دارم که ولتاژ سر وسط را از صفر تا vcc تغییر می دهد.

    زمانیکه فرمان سوئیچ برسد میکروی من شروع به تولید پالسی میکند که روی یکی از پایه ها قرار می گیرد این پالس با لبه بالا رونده پالس ورودی شروع می شود و زمان بالا ماندن آن متناسب با مقداری است که a/d از پتانسیومتر می خواند. 0 یعنی 0 ثانیه و 255 یعنی 54 میکرو ثانیه. پالس بعدی دوباره با لبه بالا رونده پالس ورودی شروع خواهد شد.
    نکته قابل عرض اینکه در تمام طول مدت تولید پالس پتانسیومتر مدام تغییر می کند.
    نمی دانم بهترین راه استفاده از pwm است یا تایمر . تایمر در مود تایمر یا در مود کپچر؟ اصلا در استفاده از تایمر ها مشکل دارم.
    ممنون می شوم که برای این مشکل راهنمایی بفرمایید. قبلا دوست عزیز آقای نحوی اشاراتی فرموده اند ولی عرض کردم به خاطر مشکل من در کار کردن با تایمرها نتوانستم مشکل را حل کنم. بهترین کمک فکر کنم اگر امکان داشته باشد عنایت کد نمونه است!
    من از بسکام و برای این بخش از کارم atmega8 استفاده میکنم.
    ممنون

    حسین خواجه جعفری
    اللهم صل علی فاطمه و ابیها، و بعلها و بنیها، و سر المستودع فیها،
    بعدد ما احاط به علمک...

    #2
    پاسخ : کمک!مشکل در کار کردن با تایمرها

    سلام. خوبین؟ من از CODE VISION استفاده میکنم و اطلاعی در مورد BASCOM ندارم. این لینک رو میدم شاید بدردتون بخوره.

    http://www.eca.ir/forum2/index.php/topic,5775.0.html

    تو لینک بالا پست دومم رو بخونید. البته یادآور میشم که در محیط CODE VISION توضیح دادم.
    BNTSTBNT

    دیدگاه


      #3
      پاسخ : کمک!مشکل در کار کردن با تایمرها

      سلام
      از کمک شما خیلی ممنونم.
      مثل گذشته نیازمند کمک دوستان دیگر هستم.

      حسین خواجه جعفری
      اللهم صل علی فاطمه و ابیها، و بعلها و بنیها، و سر المستودع فیها،
      بعدد ما احاط به علمک...

      دیدگاه


        #4
        پاسخ : کمک!مشکل در کار کردن با تایمرها

        سلام
        ایها الناس! میکرویی ها! avrی ها!! محمد نحوی ها!!! کمک!

        (هر چند این آقا نحوی بنده خدا! روی همین مسئله با کدویژن به کمک اومد ولی متاسفانه به خاطر اینکه کل کار من با بسکامه و این فقط یه جزئی از اونه و من هم تسلط کافی برای کار کردن کل پروژه روی کدویژن ندارم کارم راه نیفتاد! ولی قول داد با بسکام هم راهی برام پیدا میکنه!)
        اصلا آقا نحوی اگه راست کارت نیست با بسکام فلوچارت کارت رو محبت کن با اسم متغیرها و رجیسترها!
        قربونت برم الهی!! اگر هم با بسکام شد که چه بهتر! خیلی قربونت برم الهی!!!!
        بقیه هم یه همتی بکنن یه آستینی بالا بزنن! نوبت ما هم میشه براشون آستین بالا بزنیما!! :mrgreen: :mrgreen:
        اللهم صل علی فاطمه و ابیها، و بعلها و بنیها، و سر المستودع فیها،
        بعدد ما احاط به علمک...

        دیدگاه


          #5
          پاسخ : کمک!مشکل در کار کردن با تایمرها

          نوشته اصلی توسط حسین خواجه جعفری
          سلام به همه دوستان عزیز
          من یک مشکل دارم دوستان در صورت امکان با کمک به من خانه ای در بهشت برای خود مهیا کنند!!
          این موضوع قبلا هم به صورت دیگری مطرح شده بود ولی علیرغم محبت دوستان به خاطر کم سوادی بنده گره ای باز نکرد.
          اصل مسئله:
          یک پالس ورودی دارم با پریود 64 میکرو ثانیه با مثلا 10 میکرو ثانیه سطح پایین و 54 میکرو ثانیه سطح بالا.
          یک ورودی دارم که از یک سوئیچ می آید و با یک شدن آن سیستم خروجی خواهد داشت در غیر اینصورت خروجی همیشه مثلا یک خواهد بود.
          یک پتانسیومتر دارم که ولتاژ سر وسط را از صفر تا vcc تغییر می دهد.

          زمانیکه فرمان سوئیچ برسد میکروی من شروع به تولید پالسی میکند که روی یکی از پایه ها قرار می گیرد این پالس با لبه بالا رونده پالس ورودی شروع می شود و زمان بالا ماندن آن متناسب با مقداری است که a/d از پتانسیومتر می خواند. 0 یعنی 0 ثانیه و 255 یعنی 54 میکرو ثانیه. پالس بعدی دوباره با لبه بالا رونده پالس ورودی شروع خواهد شد.
          نکته قابل عرض اینکه در تمام طول مدت تولید پالس پتانسیومتر مدام تغییر می کند.
          نمی دانم بهترین راه استفاده از pwm است یا تایمر . تایمر در مود تایمر یا در مود کپچر؟ اصلا در استفاده از تایمر ها مشکل دارم.
          ممنون می شوم که برای این مشکل راهنمایی بفرمایید. قبلا دوست عزیز آقای نحوی اشاراتی فرموده اند ولی عرض کردم به خاطر مشکل من در کار کردن با تایمرها نتوانستم مشکل را حل کنم. بهترین کمک فکر کنم اگر امکان داشته باشد عنایت کد نمونه است!
          من از بسکام و برای این بخش از کارم atmega8 استفاده میکنم.
          ممنون

          حسین خواجه جعفری
          با عرض سلام خدمت دوست عزیز آقای جعفری
          انشا اله هر وقت بهشت تشریف بردید یک خانه هم برای من پیش خرید کنید. اقساط آن را تقدیم میکنم: :smile:

          از ADC0 برای ورودی پتانسیومتر استفاده شده (pc0).
          از INT0 برای ورودی پالس استفاده شده (PD2).
          از PB1 برای خروجی پالس شما استفاده شده .
          از PB2 برای ورودی سویچ استفاده شده است.

          در حالت کلی خروجی صفر است . با صفر شدن سویچ ، چنانچه لبه بالارونده در int0 داشته باشید خروجی متناسب با مقدار ADC بالا
          می ماندو بعد صفر می شود.

          لطفا صحت کارکرد را در همین تاپیک اطلاع دهید.

          موفق باشید

          $regfile = "m8def.dat"
          $crystal = 8000000

          Dim Adcval As Word
          Dim Adcval1 As Word
          Config Timer0 = Timer , Prescale = 8
          Config Int0 = Rising
          Config Adc = Single , Prescaler = Auto , Reference = Avcc
          Config Pind.2 = Input , Pinc.0 = Input , Pinb.1 = Output , Pinb.2 = Input
          Reset Portb.1
          Set Portb.2
          On Int0 Int0routine Nosave
          On Ovf0 Ovf0routine Nosave
          Enable Interrupts
          Enable Timer0
          Start Adc
          Waitms 50
          Enable Int0
          Do

          Loop

          Int0routine:
          Disable Int0

          If Pinb.2 = 1 Then
          Enable Int0
          Return
          End If

          Adcval = Getadc(0)
          Adcval1 = Adcval / 19
          Timer0 = 255 - adcval1
          If Timer0 = 255 Then
          Enable Int0
          Return
          End If
          Set Portb.1
          Start Timer0
          Return

          Ovf0routine:
          Reset Portb.1
          Stop Timer0
          Enable Int0
          Return

          دیدگاه


            #6
            پاسخ : کمک!مشکل در کار کردن با تایمرها

            آقای خواجه جعفری

            مشکل حل شد ؟؟؟

            دیدگاه


              #7
              پاسخ : کمک!مشکل در کار کردن با تایمرها

              سلام
              از این که پیگیری کردی خیلی ممنونم و از اینکه من نتونستم از لطفت تشکر کنم شرمنده! البته اون "برای تشکر از امتیاز مثبت استفاده کنید!" که به جای خودش ولی حق مطلب در تشکر از شما ادا نشد. والله راستیتش مشکلم حل نشد و کوتاهی در انعکاسش به شما این بود که من از 26 اسفند تا امروز که 28 فروردینه اصلا تو یه دهکوره بودم که رادیو لامپی آخر تکنولوژی بود! به هر حال من با پروتئوس تستش کردم جواب نداد ولی حقیقتش چون روی شبیه ساز جواب نداد مدارش رو نبستم. اگه اجازه بدی امشب جزییات پاسخش رو روی شبیه ساز ببینم و برات بفرستم ببینم اون خونه بهشتی رو می تونی به نامت بزنی یا نه! خدا وکیلی خیلی گیرم اگه می تونی کمک کنی دریغ نکن!زندگیم معطل مونده سر همین تیکه از پروژه! انشاءالله جبران کنم.
              عزت زیاد
              اللهم صل علی فاطمه و ابیها، و بعلها و بنیها، و سر المستودع فیها،
              بعدد ما احاط به علمک...

              دیدگاه


                #8
                پاسخ : کمک!مشکل در کار کردن با تایمرها

                دوست گرامی

                مطمئن باشید که هر کمکی بر بیاد کوتاهی نمیکنم.

                من با سیمولاتور جواب گرفتم ....قبلا هم مواردی بوده که پروتئوس جواب نداده .....

                موفق باشید

                دیدگاه


                  #9
                  پاسخ : کمک!مشکل در کار کردن با تایمرها

                  سلام
                  من این مدار رو توی پروتئوس بستم
                  1- مقدار پالس رو دقیق ندیدم که همون باشه. باز شما استادتری یکبار تست کن
                  2- وقتی سوییچ صفر باشه جواب می ده ولی اگر یک باشه و شما صفرش کنی جواب نمی ده همچنین اگر صفر باشه و در حین کار یک بشه برای مرتبه دوم که صفر می شه جواب نمی ده
                  3- فرمول محاسبه رو متوجه نشدم یعنی اگر بخوام فرمول محاسبه پهنای پالس رو نسبت به مقدار پتانسیومتر با یک نسبت دیگه داشته باشم مثلا نصف این مقدار یا عکس این مقدار و ... چکار کنم و یا اگر بخوام پالس ورودی رو دست بزنم مبنای محاسبه چه جوریه؟! در یک کلام تابع محاسبه چه جوریه نسبت به میزان پالس و ورودی پتانسیو متر؟

                  4- خیر ببینی الهی.. :mrgreen: :mrgreen:
                  اللهم صل علی فاطمه و ابیها، و بعلها و بنیها، و سر المستودع فیها،
                  بعدد ما احاط به علمک...

                  دیدگاه


                    #10
                    پاسخ : کمک!مشکل در کار کردن با تایمرها

                    اینو امتحان کن .... هیچ اینتراپتی هم نداره !!!


                    $regfile = "m8def.dat"
                    $crystal = 8000000

                    Dim Adcval As Word
                    Dim Adcval1 As Word
                    Config Timer0 = Timer , Prescale = 8
                    Config Adc = Single , Prescaler = Auto , Reference = Avcc
                    Config Pind.2 = Input , Pinc.0 = Input , Pinb.1 = Output , Pinb.2 = Input
                    Reset Portb.1
                    Set Portb.2

                    Enable Timer0
                    Start Adc
                    Waitms 50
                    Enable Int0
                    Do

                    Adcval = Getadc(0)
                    Adcval1 = Adcval / 19
                    Timer0 = 255 - Adcval1
                    Bitwait Pind.2 , Reset
                    Bitwait Pind.2 , Set
                    If Pinb.2 = 0 Then
                    Set Portb.1
                    Start Timer0
                    T6:
                    If Timer0 <> 0 Then Goto T6
                    Reset Portb.1
                    Stop Timer0
                    End If

                    Loop

                    محاسبه :

                    ماکزیمم adc عدد 1023 است . ماکزیمم عرض پالس شما هم 54 است .پس
                    18.94=1023/54
                    یعنی 19

                    پس کافیه مقدار adc را بر 19 تقسیم کنید

                    راستی شما با بهشت رابطه ای دارید ؟؟؟( پارتی ... چیزی ...) :biggrin:

                    موفق باشید



                    دیدگاه

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