اطلاعیه

Collapse
No announcement yet.

کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خیلی فوری)

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

    کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خیلی فوری)

    سلام دوستان
    آقا من می خوام یه برنامه بنویسم ولی چون کار با تایمر را بلد نیستم می خواستم ببینم یه جوون با معرفت گیر میاد به من کمک کنه یا نه
    ببینید میتونید این برنامه را کامل کنید.
    من می خوام رو پالس های ورودی به یک پین این عملیاتی را که می بینید انجام بدم. شاید این کاری که می خوام بکنم عجیب باشه ولی بی علت نیست.
    کریستال من 8 مگ اینترنال هست.
    MAIN:
    Do
    If pinb.1=1 then
    goto check
    Else
    End if
    Loop

    CHECK:
    Do
    If pinb.1 = 0 then
    Brake (ستورش را مطمعن نیستم، ولی می خوام از حلقه خارج بشم)
    Loop
    حالا می خوام timer0 به مدت 4 ثانیه روشن بشه
    Do
    incr A
    waitms 100
    loop
    بعد از تموم شدن و سر ریز timer0 از این حلقه خارج بشه و تایمر reset بشه و خاموش بشه.

    If A>100 Then
    Goto FREE
    Else
    Goto MASTER

    FREE:
    Timer1 برای 20 ثانیه روشن بشه و وقتی تموم شد و هنوز تو این حلقه بودیم به لیبل MASTER بپره.
    DO
    If pinb.1=1 then
    اگر timer1 تموم شد (goto MASTER)
    وقتی پالس صفر شروع شد Timer0 شروع بشه
    وقتی پالس یک شروع شد timer0 خاموش بشه. حالا بره به لیبل MOGHAYESE
    ELSE
    LOOP

    MOGHAYESE:
    اگر مقدار Timer0 کمتر از 1 ثایه بود بره تو لیبل SLAVE
    اگر نبود بره به FREE

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

    #2
    پاسخ : کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خ&#174

    دوست عزیز سلام،

    نوشته اصلی توسط mahmood karimi

    (ستورش را مطمعن نیستم، ولی می خوام از حلقه خارج بشم)
    از دستور Exit do استفاده کن.

    نوشته اصلی توسط mahmood karimi

    حالا می خوام timer0 به مدت 4 ثانیه روشن بشه
    از دستور start timer0 استفاده کن. البته شما برای استفاده از تایمر باید یه زیر برنامه ی over flow داشته باشید. که میتونه مانند زیر برنامه ی ذیل باشه:

    time0_count:
    incr count0
    if count0=4 then stop timer0
    return

    البته میدونید که در ابتدای برنامه باید تایمر را پیکر بندی کنید و وقفه ها رو نیز فعال کنید.

    اگه زیر برنامه ی time0_count را بنویسید بعداز 4 ثانیه تایمر متوقف میشه.

    نوشته اصلی توسط mahmood karimi

    incr A
    waitms 100
    loop
    بعد از تموم شدن و سر ریز timer0 از این حلقه خارج بشه و تایمر reset بشه و خاموش بشه.
    البته این قسمت از برنامه ی شما کمی گنگ بنظر میرسه. ولی اگه منظورتون اینکه در زمان 4 ثانیه به A مرتبا در فواصل تقریبا 100ms اضافه بشه باید از دستور زیر در حلقه استفاده کنید:

    Do
    incr A
    waitms 100
    if count0=4 then exit do
    loop
    count=0(تا برای شروع دوباره ی تایمر مقدارش شمارنده یcount0  صفر  باشه)


    نوشته اصلی توسط mahmood karimi

    Timer1 برای 20 ثانیه روشن بشه .
    از زیر برنامه ( وقفه) ی زیر استفاده کن:
    start timer1(در برنامه ی اصلی(یعنی بجای همین نقل قول) بنویس)

    time1_count:
    incr count1
    if count1=20 then stop timer1
    return

    نوشته اصلی توسط mahmood karimi

    Timer1 برای 20 ثانیه روشن بشه و وقتی تموم شد و هنوز تو این حلقه بودیم به لیبل MASTER بپره.
    DO
    If pinb.1=1 then
    اگر timer1 تموم شد (goto MASTER)
    وقتی پالس صفر شروع شد Timer0 شروع بشه
    وقتی پالس یک شروع شد timer0 خاموش بشه.  حالا بره به لیبل MOGHAYESE
    ELSE
    LOOP

    MOGHAYESE:
    اگر مقدار Timer0 کمتر از 1 ثایه بود بره تو لیبل SLAVE
    اگر نبود بره به FREE
    بازم متوجه ی منظورت نشدم . شما در قسمت فوق میخواستی تایمر 4 ثانیه روشن بشه ولی اینجا هم میخوای اگه پالس صفر شد تایمر روشن بشه!!!!


    دوست عزیز توضیح کاملتری در باره ی کاری که میخوای بکنی بده تا شاید راه حل بهتری پیدا بشه.


    موفق باشید.







    صلی الله علیک یا اباعبدالله الحسین.

    صلی الله علی الباکین علی الحسین(ع).

    دیدگاه


      #3
      پاسخ : کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خیلی فوری)

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

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

      MAIN:
      تو لیبل main من پین را تو حالتی گذاشتم تا وقتی پین بوقی در یافت کرد (پالس وارد شد) به لیبل چک بره تا بعد از رسین صفر دقیقا از اول مدت زمان صفر بودن پین شروع به نونه گیری کنه. اگر این کار را نکنیم ممکنه از اول صفر نمونه گیری شروع نشه.

      CHECK:
      اول لیبل چک، میکرو منتظر میمونه تا پالس یک، که از لیبل main شروع شده بود تموم شه و صفر شروع بشه تا از حلقه خارج بشه.
      حالا تو یک بازه 4 ثایه ای از پالس هایی که وارد میشه نمونه گیری می کنم.
      تو این بازه زمانی با هر بار صفر بودن پالس که با یه وقفه 100 میلی ثایه نمونه گیری میشه به A یک واحد اضافه میشه. تا زمانی که 4 ثایه تموم بشه.





      حالا ما یه مقدار A داریم. این مقدار می تونه به ما کمک کنه که بوق بازتاب زنگ بوده یا اشغال. چون همونظور که گفتم بوق بازتاب زنگ دارای صفر های بیشتری نسبت به بوق اشغال تو یک بازه زمانی هست.
      حالا من اومدم A را به طور مثال با یک عدد (100) مقایسه کردم. این عدد دقیق نیستو باید با آزمایش به یه عدد با دقت بیشتر پی برد. این عدد همون درصد خطای ما هستش. حالا فرض کنید که 100 عدد درستی هست و باید A با عدد 100 مقایسه بشه. حالا اگه A بزرگتر از 100 بود یعنی تعداد پالس های صفر ما بیشتر بوده پس بره تو لیبل FREE . و اگه کمتر بود یعنی اشغال هست پس باید دوباره شماره گیری بشه . پس به لیبل دیگه مثلا MASTER میره تا دوباره شماره گیری کنه.

      FREE:
      تو لیبل FREE ما می دونیم که بوق اشغال نیست و منتظر برداشتن گوشی میمونیم. ولی نمی خواهیم زیاد منتظر برداشتن تلفن طرف مقابل بمونیم پس یه تایمر را به مدت زمان 20 ثانیه را راه می ندازیم . تا اگه بیشر از این مدت زمان و این حلفه بودیم و همچنان بوق بازتاب زنگ زد می شد و گوشی برداشته نشده بود از حلقه خارج بشه و دوباره به MASTER بره تا دوباره شماره گیری کنه.
      تو این حلقه م از یک ها تو لیبل MOGHAYESE نمونه گیری می کنیم. با هر بار صفر شدن پالس TIMER0 شروع به کار می کنه و و با یک شدن تایمر خاموش میشه . حالا این مقدار روشن بودن تایمر با یم عدد زمانی مثل 1 ثایه مقایسه می شه.
      وقتی گوشی برداشته میشه پالس بوق که یک هست از بین می ره و اگه شخص شماره گیری شده صحبت نکنه این مقدار صفر باقی می مونه این یک مشکل بزرگ هیت ولی هیچ وقت این مسئله پیش تمی یاد چون همه ماها وقتی گوشی را برمی داریم حداقل یک جمله "بفرمائید" می گیم این کلمه که فرکانس صوت ما هست به جای بوق روی خط بخش می شه و جون دارای صفر های نامنظم ومتفاوت با صفر مرجع ما که بوق بازتاب زنگ بود هست ما می تونیم اینجوری بفهمیم که تماس برقرار شده. بزارید راحت تر بگم و قتی گشی برداشته می شه و شما شخص صحب کنه پالس های بازتاب زنگ از از بین رفته و پالس های صحبت وارد میکرو میشه و چون فرکانس هاش با بازتاب زنگ فرق می کنه می فهمیم که گوشی برداشته شده.





      MOGHAYESE:
      تو لیبل MOGHAYESE دقیقا همین کاری که توضیح دادم انجام میشه. مقدار زمان صفر بودن با یک عدد بطور مثال 1 ثایه مقایسه شده و اگر کمتر بود می ره تو یک یک لیبل دیگه مثل SLAVE و کار های دیگه را می کنه. و اگه نبود TIMER0 مقدارش صفر باید بشه تا دو باره مقدارش با یک ثایه مقایسه بشه. چون مدت زمان صفر بودن پالس بازتاب زنگ تقریبا مشخص است ما یه عدد کوچکتر از اون انتخاب کردیم که همون یک ثایه هست حالا صفر پالس را با اون مقایسه می کنیم.

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

      دیدگاه


        #4
        پاسخ : کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خیلی فوری)

        نوشته اصلی توسط mahmood karimi
        وشاید دوستان دیگه هم به کارشون بیاد.

        متشکر

        دیدگاه


          #5
          پاسخ : کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خیلی فوری)

          آقا محمود سلام،

          خوب چون الان امتحانات پایان ترم شروع شده این آخرین بازدید من از سایت تا 28 ام همین ماه(10) است.

          واما...

          1- شما اگه میخوای بطور منظم در هر 100 میلی ثانیه نمونه برداری کنی پس دستور waitms مناسب نیست. از تایمر استفاده کن.

          2- از تایمر 1 بعنوان کانتر استفاده کن تا لبه های منفی را بشماره.

          3- شما در مدت 4 ثانیه تمام لبه های منفی را بشمار و بعد تعداد آنها را با نمونه ای که از قبل میدونی مثلا همون عدد 100 مقایسه کن. لذا برای شمارش لبه های منفی(پایین رونده یا صفرها) از کانتر استفاده کن.من توی برنامه ای که براد نوشتم بجای A از pulse استفاده کردم که نام متغیر با مسما باشه.

          4- با کریستال 8 MHZ و prescale=1 هنگامی که تایمر تا 31250 را میشماره 1 ثانیه طول میکشه.(البته از کریستال خارجی استفاده کنی بهتر و دقیقتره)

          5- یه اشکال مهم توی برنامه ی شما اینکه وقتی لیبل تموم میشه از دستور return استفاده نکردین که منجر میشه برنامه بکلی مختل بشه یا میکرو هنگ کنه.

          6- بهتره بجای استفاده از goto از gosub استفاده کنی.(البته در بیشتر جاها)

          7- ببین شما لیبل MASTER را ننوشتی لذا من فرض کردم که توی اون دستور ارجاع به یه زیر برنامه ی شماره گیر و از اونجا دستور gosub main را دادی.

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



          Config timer0=timer, prescale=1
          Config timer1=counter, edge=falling
          Enable counter1
          Enable interrupts
          Enable timer0
          Enable timer1
          On ovf0 time0_count
          On ovf1 pulse_count
          ‘***************************
          MAIN:
          Do
          If pinb.1=1 then
          goto check
          Else
          Exit do
          End if
          Loop
          return

          CHECK:
          Do
          If pinb.1 = 0 then
          exit do
          Loop
          Start timer0
          Pulse_count=0
          Do
          If time0=4 then
          Pulse=pulse_count
          Stop timer0
          exit do
          end if
          loop
          time0=0
          pulse_count=0

          If pulse>100 Then
          Goto FREE
          Else
          Goto MASTER
          return

          FREE:
          Start timer0
          DO
          If time0=20 then
          Stop timer0
          Time0=0
          exit do
          end if
          ( تا اینجا اگه کسی گوشی را بعد از 20 ثانیه بر نداشت به master برمیگرده.)
          LOOP
          return
          (بقیه ی برنامه را اگه تا 28 ام کامل نشد خودم کامل میکنم(البته آقا محمود یه سری به نامه ای که براد به پیامهای خصوصی شما فرستادم بزن انشاالله برنامه را زودتر کامل میکنی)
          ‘************
          زیر برنامه ها(وقفه های اضافه شده به برنامه)

          time0_count:
          incr time0
          return

          pulse_count:
          incr pulse_count
          counter1=0
          return


          صلی الله علیک یا اباعبدالله الحسین.

          صلی الله علی الباکین علی الحسین(ع).

          دیدگاه


            #6
            پاسخ : کمک برای تکمبل یه برنامه ی تایمر در BASCOM (خیلی فوری)

            اگه نتیجه نگرفتی اعلام کن خیلی سریع برنامه رو برات می نویسم
            اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

            دیدگاه

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