اطلاعیه

Collapse
No announcement yet.

برنامه نویسی بسکام

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

    برنامه نویسی بسکام

    سلام دوستای خوبم
    یک سوال داشتم در باره ایجتد یک پالس با فرکانس مشخص روی یک پایه میکرو و همچنین تولید not این پالس روی پایه دیگری از میکرو
    من این برنامه رو اینطوری نوشتم:
    Reset Portd.2 : Set Portd.1 : Waitus 3.25 : Set Portd.2 : Reset Portd.1 : Waitus 3.25
    البته یک do و loop هم اول و آخرش گذاشتم.
    اما مشکل من اینه که نمیخوام این حلقه تا بینهایت ادامه داشته باشه.
    بلکه میخوام بعداز یک زمان مشخصی این ارسال پالس متوقف بشه
    باید چیکار کنم؟ از تایمر چطور استفاده کنم؟
    ضمن اینکه داخل این حلقه (یعنی همزمان با ارسال پالس) من میخوام یه چیزایی رو ال سی دی نمایش بدم. که چون حلقه ادامه داره اصلا وارد دستور نمایش نمیشه و چیزی نشون نمیده!
    چه کنم؟

    #2
    پاسخ : برنامه نویسی بسکام

    سلام
    اولا که شما اگه بخوای هم ال سی دی رو نمایش بدی و هم پالس رو بسازی میشه در حلقه بکار برد یعنی در یک حلقه اما مسئله اینجاست که کمتر کسی پالس رو در داخل حلقه میسازه چون در برخی موارد بسته به نوع کد نویسی پریود پالس با دستورات دیگه مثل ایجاد شرط ها و دستورات دیگه مثل ال سی دی تغییر میکنه واین درست نیست یا یجوره دیگه دوره تناوب پالس تغییر میکنه
    پس باید از تایمر اون هم از وقفه تایمر استفاده کرد واینکه بخوای پالس تا زمان دلخواه کار کنه با غیر فعال کردن وقفه تایمر , پالس رو هم متوقف کرد
    برنامه زیر رو که به صورت درست هست رو بکار ببر
    کد:
    $regfile = "M8def.dat"
    $crystal = 4000000
    '================================
    Config Portb.0 = Output , Portb.1 = Output
    '================================
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.0
    Config Lcd = 20 * 4
    '================================
    Cursor Off : Cls : Locate 1 , 1 : Lcd "<( Be Name Allah )>" : Wait 1 : Cls
    '================================
    Dim A As Word , B As Word
    A = 0
    B = 0
    '================================
    Config Timer0 = Timer , Prescale = 1
    Enable Interrupts
    Enable Ovf0
    On Ovf0 Tx_pulse
    
    '================================
    Do
    Locate 1 , 1 : Lcd "pulse conter:" ; B ; " "
    
    If B > 22000 Then Disable Interrupts
     Loop
     End
    
    '================================
    Tx_pulse:
    Incr B
    A = 0
    Portb.1 = 1
    Portb.0 = 0
    Do
    A = A + 1
    Loop Until A = 15
    Portb.1 = 0
    Portb.0 = 1
    A = 0
    Return
    امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

    دیدگاه


      #3
      پاسخ : برنامه نویسی بسکام

      سلام
      اینم فایل بسکام وپرتئوس که میتونید اجرا کنید
      http://uplod.ir/t2b4bqjmvjzl/timrer_pulse.rar.htm


      خب یه توضیح برای برنامه بدم
      دستورات اول که مشخصه در خطهای بعدی دستور پیکربندی تایمر 0 و خط بعدی فعال کردن وقفه سراسری هست خط بعد فعال کردن وقفه تایمر 0 هست که ازونجایی که تایمر 0 هشت بیتی هست پس در رجیستر تایمر از 0 تا 255 میشماره وبعد پرچم وقفه تایمر0 بالا میره واجازه وقوع وقفه رو میده در خط بعد زیر برنامه ای که برای وقفه قراره که داخلش پالس تولید بشه رو مینویسیم
      در داخل حلقه که خط اول که معلومه و متغیر b هم کانتر پالس هست که نشون میده چند تا پالس تولید شده نوشتنش ضروری نیست مگه اینکه بخوای تعداد مشخصی پالس بسازی ودر خط بعد شرطی گذاشتیم که اگر ممتغیر b بزرگتر از عدد 22000 شد یا اگه 22000 تا پالس تولید شد اون وقت پالس متوقف بشه
      اما در زیر برنامه وقفه هم که همه چی مشخصه در خط اول یک واحد به متغیر b اضافه میکنیم تا تا تعداد پالس ها رو بشمرهو بعد خاموش و روشن کردن پین های مورد نظر در خط های بعدی هم یه حلقه شرطی گذاشتیم که پهنای پالس یا عرض پالس رو تنظیم کنیم که عدد 15 که برای شرط مساوی متغیر a گذاشتم همینطوری هست که شما نسبت به اندازه پهنای پالستون میتونید تغییرش بدید ودر خط بعدی با ز هم خاموش و روشن کردن پینها ی مورد نظر و در خط بعد هم که متغیر a رو صفرش کردیم که میتونیم هم قبل حلقه شرطی اینکار رو کنیم یا بعدش که شمارش از صفر باشه و خط اخر هم برگشت از زیر برنامه وقفه تایمر0 هست
      این درست ترین راه تولید پالس میباشد و از دوستان عزیز دعوت میکنم ازین برنامه برای ساخت پالس استفاده کنن و تولید پالس در حلقه درست نیست
      تمام
      امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

      دیدگاه


        #4
        پاسخ : برنامه نویسی بسکام

        تشکر میکنم از توضیح کامل و باحوصله شما/
        فقط من یه سوالی برام پیش اومد و اون هم این که من هدفم تنظیم پالس نیست بلکه میخوام تنظیم فرکانس پالس رو انجام بدم.
        ضمن این که تعدادپالس هم برام مهم نیست. فقط میخوام توو زمان مشخصی مثلا در 15 دقیقه پالس ارسال بشه.
        با این توضیحات فکر میکنید این برنامه مناسب باشه؟

        دیدگاه


          #5
          پاسخ : برنامه نویسی بسکام

          سلام خواهش میکنم
          برای تنظیم فرکانس هم میتونید حلقه شرطی دیگه به انتهای حلقه اول در زیر برنامه وقفه اضافی کنید یا در زیر برنامه وقفه رجیستر timer0 رو تغییر بدهید فقط این کار رو باید در زیر برنامه وقفه انجام بدید
          اما اگه میخواهید بصورت دقیقه شمار مثلا 15 دقیقه رو پالس بده وبعد قطع بشه روشهای زیادی هست که به استعداد خود شما در برنامه نویسی بستگی داره ولی میتونید کانفیک ساعت رو راه اندازی کنید که نسبت به زمان یا ساعت خواص و مدت زمان این کار رو انجام بدید
          امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

          دیدگاه


            #6
            پاسخ : برنامه نویسی بسکام

            ببخشید منظورتون از کانفیک ساعت چیه؟
            من دقیقا میخوام همین مثالی که زدید (یعنیی 15 دقیقه پالس ارسال کنه) رو عملی کنم. با همون تایمر 0 چطوری پیاده سازی کنم؟

            دیدگاه


              #7
              پاسخ : برنامه نویسی بسکام

              بذارید یه کم دقیق تر سوالمو بپرسم.چ.ن خیلی برام حیاتییه.
              من میخوام با فشردن دکمه ای خاص پالسی با یک فرکانس مشخص روی یک پین میکرو و not این پالس روی پین دیگر تولید بشه. وقتی دکمه دیگری را فشردم فرکانس پالسم تغییر کنه.
              تووی این برنامه ای که گذاشتید مقدار A رو چی باید بذارم؟
              و ضمن اینکه اگر دکمه ای فشرده نشه تا همون مثلا 15 دقیقه ارسال پالس ادامه داشته باشه و بعدش متوقف بشه
              این قسمت از برنامه رو با نمایش روی ال سی دی نمیتونم ترکیب کنم.چون یا نمایشم به هم میریزه یا پالسی که میخوام صادر نمیشه :angry:

              دیدگاه


                #8
                پاسخ : برنامه نویسی بسکام

                سلام
                ببینید من گفتم که اگه این 15 دقیقه بر حسب زمان باشه بهتره که از کانفیگ ساعت استفاده بشه مثل ساعت معمولی مثلا ساعت 3 بعد از ظهر شروع و تا 3:15 پالس بزنه بر حسب زمان اما با گفتن نیازتون که اگه یه دگمه زده شه و پالس تولید بشه تا 15 دقیقه این قضیش فرق میکنه
                شما باید دو تایمر رو راه اندازی کنی باوقفه اولی مثل برنامه قبل برای تولید پالس و دومین تایمر و وقفش رو برای زمان مثلا 1 ثانیه تنظیم کنی که برات ثانیه شمار بشه و در زیر برنامه وقفه تایمر دوم یه متغیر از نوع word بذاری که یک واحد بهش اضافه شه یعنی در تایمر دومی زمان اجرای وقفه در هر 1 ثانیه باشه و در زیر برنامش هم متغیری بذاری که هر بار یک واحد بهش اضافه شه پس با اجرای هر 1 ثانیه وقفه یک عدد به متغیر اضافه میشه که این میشه ثانیه شمار شما با این حساب هر 15 دقیقه میشه 900 ثانیه پس یک شرط مینویسی که اگه متغیره بزرگتر از 900 شد وقفه تایمر اولی رو که پالس تولید میکرد رو غیر فعال کنه و برعکس یه شرط دیگه هم میذاری که اگه فلان دکمه زده شد وقفه تایمر اولی رو فعال کنه ب هعلاوه این که متغیر ثانیه شمار رو صفر کنه که دوباره ثانیه شمار شمارشش رو از صفر شرو ع کنه تا 900

                واگه این کار رو نکنی متغیر که قبلا رو 900 بود از همون 900 شروع به شمارش میکنه میشه مثلا 901 تا به بالا ودر شرط اولی که اگه بزرگتر از 900 بود میاد پشت سر هم وقفه تایمر اولی رو غیر فعال میکنه وبرنامه خطا پیدا میکنه پس در شرط دوم که میای وقفه تایمر رو فعال میکنی اون متغیر ثانیه شمار رو هم مقدارشو صفر کن
                تمام
                امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                دیدگاه


                  #9
                  پاسخ : برنامه نویسی بسکام

                  در ضمن اون متغیر ثانیه شمار رو میتونی رو السی دی نمایش بدی وهیچ مشکلی پیش نمیاد
                  این قسمت از برنامه رو با نمایش روی ال سی دی نمیتونم ترکیب کنم.چون یا نمایشم به هم میریزه یا پالسی که میخوام صادر نمیشه
                  منظورتونو نمیفهمم نباید چنین مشکلی پیش بیاد

                  نکته کلیدی برای همه:
                  برای کار با متغیر ها در وقفه وتغییر متغیر های وقفه در حلقه do مثلا متغیری در وقفه دارید که باید مقدارشو تغییر بدید چطوری مثلا در داخل حلقه اصلی یه منو تعریف کردی که میخوای متغیر در حلقه مثلا یه منو ساختی و با 2 تا دکمه مقدارشو کم وزیاد کنید که خیلی ها این کار رو میکنن ولی در عمل متغیر چون در وقفه عملیاتی میشه تغییر نمیکنه مثال میزنم تا بهتر متوجه بشید
                  فرض کنید در زیر برنامه وقفه یه متغیری به نام F هست که شرط خروج از حلقه شرطی مثل مثال پالس که قبلا گفتم که اگر a=15 شد از شرط خارج شو حالا شما میخوای مقدار اون 15 رو تغییر بدی مثلا بذاری 50 حالا باید چیکار کنیم باید مثلا اون متغیر F رو مساوی a بذاریم به این صورت a=F و مقدار F رو در حلقه do loop با دکمه زیاد و کم کنیم مثلا F رو تنظیم کنیم رو 30 پس با این حساب در زیر برنامه حلقه شرطی انقدر میشماره تا a مساوی F بشه و F هم 30 بود دیگه پس 30 بار حلقه میچرخه وخارج میشه تا اینجا همه چی درسته پس چرا در عمل کار نمیکنه و یا بعضی فقطها که بخوای متغیر F رو هم رو ال سی دی نمایش بدی السی دی بهم میریزه؟ در صورتی که همه چی درسته !
                  نکته اینجاست که چه در بسکام وچه کامپایلر های دیگه اکثرا میان متغیر ها رو بعد از کانفیگ تایمر تعریف میکنن که این ااشتباه محضه در این صورت چون تایمر و وقفه اش و زیر برنامه وقفه که میخواد اجرا بشه متغیر ها تعریف نشدن و با اجرای وقفه در زیر برنامه وقفه اصلا متغیر رو نمیشناسه
                  در برنامه ای که بالا نوشتم اگه دقت کنی میبینی متغیرها رو قبل از کانفیگ تایمر تعریف کردم تا اول متغیر ها شناسایی شن و باعث بروز مشکلاتی از قبیل تغییر نکردن متغیر ویا به هم خورده گی ال سی دی و غیره نشه
                  تمام
                  امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                  دیدگاه


                    #10
                    پاسخ : برنامه نویسی بسکام

                    نوشته اصلی توسط mahdi8866 نمایش پست ها
                    سلام
                    اینم فایل بسکام وپرتئوس که میتونید اجرا کنید
                    http://uplod.ir/t2b4bqjmvjzl/timrer_pulse.rar.htm


                    خب یه توضیح برای برنامه بدم
                    دستورات اول که مشخصه در خطهای بعدی دستور پیکربندی تایمر 0 و خط بعدی فعال کردن وقفه سراسری هست خط بعد فعال کردن وقفه تایمر 0 هست که ازونجایی که تایمر 0 هشت بیتی هست پس در رجیستر تایمر از 0 تا 255 میشماره وبعد پرچم وقفه تایمر0 بالا میره واجازه وقوع وقفه رو میده در خط بعد زیر برنامه ای که برای وقفه قراره که داخلش پالس تولید بشه رو مینویسیم
                    در داخل حلقه که خط اول که معلومه و متغیر b هم کانتر پالس هست که نشون میده چند تا پالس تولید شده نوشتنش ضروری نیست مگه اینکه بخوای تعداد مشخصی پالس بسازی ودر خط بعد شرطی گذاشتیم که اگر ممتغیر b بزرگتر از عدد 22000 شد یا اگه 22000 تا پالس تولید شد اون وقت پالس متوقف بشه
                    اما در زیر برنامه وقفه هم که همه چی مشخصه در خط اول یک واحد به متغیر b اضافه میکنیم تا تا تعداد پالس ها رو بشمرهو بعد خاموش و روشن کردن پین های مورد نظر در خط های بعدی هم یه حلقه شرطی گذاشتیم که پهنای پالس یا عرض پالس رو تنظیم کنیم که عدد 15 که برای شرط مساوی متغیر a گذاشتم همینطوری هست که شما نسبت به اندازه پهنای پالستون میتونید تغییرش بدید ودر خط بعدی با ز هم خاموش و روشن کردن پینها ی مورد نظر و در خط بعد هم که متغیر a رو صفرش کردیم که میتونیم هم قبل حلقه شرطی اینکار رو کنیم یا بعدش که شمارش از صفر باشه و خط اخر هم برگشت از زیر برنامه وقفه تایمر0 هست
                    این درست ترین راه تولید پالس میباشد و از دوستان عزیز دعوت میکنم ازین برنامه برای ساخت پالس استفاده کنن و تولید پالس در حلقه درست نیست
                    تمام
                    سلام ، لینکش منقضی شده . میشه یبار دیگه آپ کنین ؟ممنون
                    عظمت را در چشم کسانی دیدم که بی توقع مهربانند .

                    دیدگاه

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