اطلاعیه

Collapse
No announcement yet.

مشکل تکرار دستور در bascom

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

    #16
    پاسخ : مشکل تکرار دستور در bascom

    نوشته اصلی توسط gh.kh نمایش پست ها
    درود دوستان میخوام در برنامه زیر
    با یک شدن ورودی خروجی به مدت 5 دقیقه یک باشه بعد صفر بشه و در مدت تایم گیری بقیه برنامه هم بدون مشکل اجرا بسه
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Portd = Input
    Config Portb = Output
    Reset Portd.0
    Reset Portd.1
    Config Debounce = 20
    '========================================'
    Do
    If Pind.0 = 1 And Pind.1 = 0 Then Goto Ch1
    Loop
    '======================================='
    Ch1:

    Waitms 30
    Toggle Portb.0
    while Pind.0 = 1 And Pind.1 = 0
    wend
    Waitms 30
    Return
    سلام به شما دوست گرامی

    برای این کار باید از تایمر ها اطلاعاتی داشته باشید تا بتونید برنامه رو بنویسید

    شما باید یه تایمر رو ( مثلا تایمر 0 ) روی کمترین فرکانس ممکن تنظیم کنید
    حساب کنید که با فرکانسی که تایمر 0 داره ( مثلا 1 مگاهرتز ) و تعداد شمارش هایی که تایمر میتونه انجام بده تا سریز شه چقدر زمان طول خواهد کشید تا تایمر یک بار سریز بشه . . .
    مثلا فرکانس تایمر 0 یک مگاهرتز هست و 256 واحد رو میتونه بشماره بنابراین مدت زمانی که تایمر 0 یک بار سریز میشه از این فرمول بدست میاد
    مدت زمان شمارش یک واحد ( به فرکانس تایمر مرتبط هست ) * 256 در نتیجه : 256 * 0.000001 = 0.000256 که بر حسب ثانیه هست
    که میشه 256 میکروثانیه . . .
    یعنی هر بار سریز تایمر 0 256 میکروثانیه طول میکشه . . .
    حالا چند بار تایمر باید سریز بشه تا 5 دقیقه زمان بگذره ؟؟؟
    به این صورت که 5 دقیقه 300 ثانیه هستش 5*60 = 300 ثانیه
    300 ثانیه 300 هزار میلی ثانیه هستش
    300 هزار میلی ثانیه 300 میلیون میکرو ثانیه هست
    حالا باید 300 میلیون میکروثانیه رو ( که در واقع همون 5 دقیقه هستش ) به 256 میکرو ثانیه تقسیم کنیم که میشه : 1171875
    یعنی 1171875 بار باید تایمر سریز بشه تا مدت 5 دقیقه بگذره . . .

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

    حالا شما باید تو برنامت اینطوری بنویسی :

    اگه فلان کلید زده شد تایمر 0 رو با فرکانس 1 مگاهرتز راه اندازی کن و خروجی رو یک کن ( یا استارت تایمر 0 رو بزن در واقع میتونی تایمر رو در اول برنامه راه اندازی کنی و تایمر رو خاموش کنی و بعدش بعد از زدن کلید استارت تایمر رو بزنی و خروجی رو یک کنی )
    یادت باشه که تایمر باید در مد اینترآپت ( وقفه ) راه اندازی شه
    در این حالت با هر بار سریز یک وقفه از cpu در خواست میشه و برنامه منتقل میشه به زیر روال وقفه . . .
    تو زیر روال وقفه یه شمارنده و یه دستور if قرار بده که اگه تعداد دفعات اجرای وقفه برابر 1171875 شد اونوقت خروجی رو صفر کن . . .

    شرح برنامه :

    حالا بعد از این که کلید رو زدی و تایمر رو استارت زدی خروجی یک میشه
    زمان سنجی تایمر شروع میشه در عین حال برنامه داره کارشو انجام میده و cpu داره دستورات داخل حلقه اصلی رو اجرا میکنه . . .
    بعد از این که 256 میکرو ثانیه گذشت تایمر 0 اولین وقفه خودش رو از cpu در خواست میکنه و ظرف چند سیکل کلاک cpu شروع به اجرای دستورات داخل اینتراپت تایمر میکنه . . .

    حالا دستورات داخل اینتراپت ( وقفه ) چیه ؟

    1_یه متغیر شمارنده که با هر بار اجرای وقفه ( اینتراپت ) تایمر یک واحد بهش اضافه میشه ( باید مقدار اولیه این متغیر رو صفر قرار داد ) ضمنا متغیر به اندازه کافی بزرگ انتخاب شه تا بتونی عدد 1171875 رو بشماره که باید از نوع 32 بیتی استفاده کنی
    2_ یه دستور شرطی که با هر بار اجرای وقفه چک میکنه که چند بار وقفه اجرا شده که اگه تعداد دفعات اجرای وقفه برابر عدد کذایی شد اون کاری که شما میخوای رو انجام بده ( خروجی رو صفر کنه )


    یادت باشه هر وقت کارت با تایمر تموم شد تایمر رو غیر فعال ( stop ) کن
    حواست به متغیر باشه که اگه دوباره خواستی تو تایمر ازش استفاده کنی دوباره مقدار 0 بهش بدی ( لازم نیست حتما 0 بدی ولی این طوری راحت تر میتونی حساب کتاب کنی . . . )

    توجه : برای کار با تایمر ها در صورتی که زمان هایی در حد دقیقه مورد نیاز شما هست خیلی خیلی بهتره که تا جایی که میتونید فرکانس تایمر رو پایین بیارید


    سوالی داشتید درخدمتم

    موفق و مویــــد باشیــــد

    یا حق
    جدیدترین ویرایش توسط rezamajdi; ۲۳:۲۵ ۱۳۹۵/۰۶/۳۰.
    آرزوی سرافرازی برای ایران عزیز . . .


    دیدگاه


      #17
      پاسخ : مشکل تکرار دستور در bascom

      نوشته اصلی توسط gh.kh نمایش پست ها
      درود دوستان میخوام در برنامه زیر
      با یک شدن ورودی خروجی به مدت 5 دقیقه یک باشه بعد صفر بشه و در مدت تایم گیری بقیه برنامه هم بدون مشکل اجرا بسه
      $regfile = "m8def.dat"
      $crystal = 8000000
      Config Portd = Input
      Config Portb = Output
      Reset Portd.0
      Reset Portd.1
      Config Debounce = 20
      '========================================'
      Do
      If Pind.0 = 1 And Pind.1 = 0 Then Goto Ch1
      Loop
      '======================================='
      Ch1:

      Waitms 30
      Toggle Portb.0
      while Pind.0 = 1 And Pind.1 = 0
      wend
      Waitms 30
      Return
      اینم کد :

      کد:
      $regfile = "m8def.dat"
      $crystal = 8000000
      Config Portd = Input
      Config Portb = Output
      Reset Portd.0
      Reset Portd.1
      Config Debounce = 20
      
      Enable Interrupts
      
      Config Timer2 = Timer , Prescale = 64
      On Timer2 Timerr2
      Stop Timer2
      Disable Timer2
      
      
      Dim Sarriz As Integer
      Dim Seconds As Byte
      Dim Minutes As Byte
      
      '========================================'
      
      Do                                                          'here is main code
      
         If Pind.0 = 1 And Pind.1 = 0 Then
            Enable Timer2
            Start Timer2
      
            Set Portb                                             ' ba feshordane vorodi , portB roshan mishe
      
         End If
      
         If Minutes = 5 Then                                      'zamani ke shoma dar nazar darin bayad inja gozashte beshe baraye khamoshiye khooroji
            Minutes = 0
            Stop Timer2
            Disable Timer2
            Reset Portb
         End If
      
         '{
      
      
          'dar in baze baqiye barname khodetono benevisin
      
      
         '}
      
      
      Loop
      '======================================='
      
      Timerr2:
      
      Incr Sarriz
         If Sarriz = 489 Then
            Incr Seconds
            If Seconds = 60 Then
             Incr Minutes
             If Minutes = 244 Then Minutes = 0
             Seconds = 0
            End If
            Sarriz = 0
         End If
      
      Return
      نکته : هیچوقت سعی نکنید از دستورات پرش مثل goto , gosub ,jump استفاده کنید ، چون باعث خانایی پایین و خطایابی سخت در کد های طولانی خواهد شد ، و بعضی اوقات اگه پرش بلند در کد زیاد داشته باشید ، ممکنه اصلا نرسه به اون جای مورد نظر. من کلا دستورات پرش رو فراموش کردم.
      هرجا نیاز به کار موازی با کد اصلی داشتید به یاد تایمرها بیوفتین . چون کار تایمر همینه.
      به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
      (پيش به سوي هدف)

      دیدگاه


        #18
        پاسخ : مشکل تکرار دستور در bascom

        خیلی ممنون از دوستان
        متوجه شدم
        برنامه دوستمونم اجرا کردم خروجی رو ست میکنه اما بعد از گذشت مدت مشخص شده خروجی رو ریست نمی کنه
        ایا مشکلی هست یا در شبیه سازی پروتئوس جواب نمیده
        طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
        امروز رو کامل زندگی کن...
        (یه روز یعنی هیچوقت!)

        دیدگاه


          #19
          پاسخ : مشکل تکرار دستور در bascom

          نوشته اصلی توسط gh.kh نمایش پست ها
          خیلی ممنون از دوستان
          متوجه شدم
          برنامه دوستمونم اجرا کردم خروجی رو ست میکنه اما بعد از گذشت مدت مشخص شده خروجی رو ریست نمی کنه
          ایا مشکلی هست یا در شبیه سازی پروتئوس جواب نمیده
          درود

          دوست عزیز شما طبق آموزشی که من براتون گذاشتم عمل کنید فکر نکنم مشکلی باشه . . .
          شما بعد از گذر اون زمان مشخص باید تو برنامه خروجی رو ریست کنید
          اگه این کار رو انجام ندید خب ریست نمیشه دیگه

          انجامش بدید یکمم روش فکر کنید
          فردا اگه بازم مشکلی بود مطرح کنید بررسی میکنم

          یا حق
          آرزوی سرافرازی برای ایران عزیز . . .


          دیدگاه


            #20
            پاسخ : مشکل تکرار دستور در bascom

            فرمایشتون درست
            الان توی برنامه هم همین کار انجام شده
            اما درون حلقه اصلی
            کد:
            [FONT=Yekan]$regfile = "m8def.dat"[/FONT]$crystal = 8000000
            Config Portb = Input
            Config Portd = Input
            Config Portc = Output
            Reset Portb.0
            Reset Portb.1
            Reset Portb.2
            Reset Portb.3
            Reset Portd.0
            Reset Portd.1
            Reset Portd.2
            Config Debounce = 25
            
            
            Enable Interrupts
            
            
            Config Timer2 = Timer , Prescale = 64
            On Timer2 Timerr2
            Stop Timer2
            Disable Timer2
            
            
            
            
            Dim Sarriz As Integer
            Dim Seconds As Byte
            Dim Minutes As Byte
            
            
            '========================================'
            Do                                                          'here is main code
            
            
               If Pind.2 = 1 And Pind.3 = 1 Then
                  Enable Timer2
                  Start Timer2
            
            
                  Set Portc.2                                           ' ba feshordane vorodi , portB roshan mishe
            
            
               End If
            
            
               If Minutes = 1 Then                                      'zamani ke shoma dar nazar darin bayad inja gozashte beshe baraye khamoshiye khooroji
                  Minutes = 0
                  Stop Timer2
                  Disable Timer2
                  [SIZE=3][COLOR=#0000ff]Reset Portc.2[/COLOR][/SIZE]
               End If
            
            
            Loop
            '======================================='
            
            
            Timerr2:
            
            
            Incr Sarriz
               If Sarriz = 489 Then
                  Incr Seconds
                  If Seconds = 60 Then
                   Incr Minutes
                   If Minutes = 244 Then Minutes = 0
                   Seconds = 0
                  End If
                  Sarriz = 0
                  End If
            
            
            Return
            [FONT=Yekan]'================'[/FONT]
            طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
            امروز رو کامل زندگی کن...
            (یه روز یعنی هیچوقت!)

            دیدگاه


              #21
              پاسخ : مشکل تکرار دستور در bascom

              نوشته اصلی توسط gh.kh نمایش پست ها
              خیلی ممنون از دوستان
              متوجه شدم
              برنامه دوستمونم اجرا کردم خروجی رو ست میکنه اما بعد از گذشت مدت مشخص شده خروجی رو ریست نمی کنه
              ایا مشکلی هست یا در شبیه سازی پروتئوس جواب نمیده
              نه مشکلی نیست ، منم همین الان کدی که دادم رو تست کردم ، مشکلی نبود ، در مدت مشخص شده ی فرضی مدار عمل میکنه.
              و من حدس میزنم زمان تنظیم نیست ، یعنی 5 دقیقه ای که شما میخایید ممکنه 1 ساعت طول بکشه تا 5 دقیقه اتفاق بیوفته.
              باید تنظیم کنید.
              آیا شما میکرو رو تو پرتیوس رو 8 مگ تنظیم کردید؟!! چون داخل برنامه 8 مگ تعریف شده.
              بعد اگه از ال سی دی استفاده میکنید میتونید اطلاعات رو از جای مختلف کد بگیرید ال سی دی کنید تا بهتر بتونید تصمیم بگیرید.

              برای تست من بهتون پیشنهاد میکنم prescale رو روی یک قرار بدید ، تا 5 دقیقه شما زودتر بگذره و بتونید ببینید کدتون مشکل نداره.
              یا مثلا داخل کد زمان رو از 5 به 2 کم کنید تا ببینید آیا منظورتون و کد اجرا میکنه یا نه.
              رو زمان بندی مشکل هست. درنهایت شما باید به همچین کدی برسید.

              سوالی هست بپرسید تا کلا متوجه شید.
              جدیدترین ویرایش توسط hosseinam; ۰۱:۲۵ ۱۳۹۵/۰۶/۳۱.
              به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
              (پيش به سوي هدف)

              دیدگاه


                #22
                پاسخ : مشکل تکرار دستور در bascom

                ممنون از پاسختون متوجه شدم
                برسی میکنم
                بازم تشکر
                طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                امروز رو کامل زندگی کن...
                (یه روز یعنی هیچوقت!)

                دیدگاه


                  #23
                  پاسخ : مشکل تکرار دستور در bascom

                  دوست عزیز شما تو حلقه اصلی نوشتید هر وقت دقیقه به 1 رسید خروجی رو 0 کن !!!
                  باید بنویسید هر وقت دقیقه به 5 رسید
                  آرزوی سرافرازی برای ایران عزیز . . .


                  دیدگاه


                    #24
                    پاسخ : مشکل تکرار دستور در bascom

                    نوشته اصلی توسط rezamajdi نمایش پست ها
                    دوست عزیز شما تو حلقه اصلی نوشتید هر وقت دقیقه به 1 رسید خروجی رو 0 کن !!!
                    باید بنویسید هر وقت دقیقه به 5 رسید
                    متوجه هستم دوست عزیز اون رو برای تست عملکرد برنامه گذاشتم با همون یک هم مدت زیادی طول میکشه باید زمان بندی رو تنظیم کنیم برنامه درسته فقط باید زمانهارو تنظیم کنیم
                    بازم دقتتون ممنون
                    موفق باشید
                    طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                    امروز رو کامل زندگی کن...
                    (یه روز یعنی هیچوقت!)

                    دیدگاه


                      #25
                      پاسخ : مشکل تکرار دستور در bascom

                      نوشته اصلی توسط gh.kh نمایش پست ها
                      متوجه هستم دوست عزیز اون رو برای تست عملکرد برنامه گذاشتم با همون یک هم مدت زیادی طول میکشه باید زمان بندی رو تنظیم کنیم برنامه درسته فقط باید زمانهارو تنظیم کنیم
                      بازم دقتتون ممنون
                      موفق باشید
                      شما میکرو رو از داخل پرتیوس روی 8 مگاهرتز تنظیم کردین آیا ؟؟
                      طبق حساب کتاب من ، وقتی تایمر 489 بار سرریز بشه با prescale = 64 ، زمان 1.001 ثانیه رو باید به شما بده.البته با فرکانس کاری 8 مگ.
                      جدیدترین ویرایش توسط hosseinam; ۱۲:۲۷ ۱۳۹۵/۰۶/۳۱.
                      به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                      (پيش به سوي هدف)

                      دیدگاه


                        #26
                        پاسخ : مشکل تکرار دستور در bascom

                        نوشته اصلی توسط hosseinam نمایش پست ها
                        شما میکرو رو از داخل پرتیوس روی 8 مگاهرتز تنظیم کردین آیا ؟؟
                        طبق حساب کتاب من ، وقتی تایمر 489 بار سرریز بشه با prescale = 64 ، زمان 1.001 ثانیه رو باید به شما بده.البته با فرکانس کاری 8 مگ.
                        برنامه رو دقیقا همین کدی که قرار دادید کامپایل کردم
                        و قتی prescale رو به 1 تغییر دادم برنامه خروجی رو ست و ریست کرد
                        اما با 64 خیلی طول میکشه تا ده دقیقه هم خروجی رو تغییر نداد
                        طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                        امروز رو کامل زندگی کن...
                        (یه روز یعنی هیچوقت!)

                        دیدگاه


                          #27
                          پاسخ : مشکل تکرار دستور در bascom

                          نوشته اصلی توسط gh.kh نمایش پست ها
                          برنامه رو دقیقا همین کدی که قرار دادید کامپایل کردم
                          و قتی prescale رو به 1 تغییر دادم برنامه خروجی رو ست و ریست کرد
                          اما با 64 خیلی طول میکشه تا ده دقیقه هم خروجی رو تغییر نداد
                          خوب شما با دابل کلیک کردن روی میکرو بیا تغییرات زیر رو انجام بده ، تا کلاک میکرو تو پرتیوس رو 8 مگ تنظیم شه ، و بعد از داخل کد بیا prescale = 64 قرار بده ، درست میشه . درست شد نتیجه رو اعلام کنید . خودم با همین کد جواب گرفتم./

                          به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                          (پيش به سوي هدف)

                          دیدگاه


                            #28
                            پاسخ : مشکل تکرار دستور در bascom

                            ممنون دوست عزیز
                            مشکل حل شد حالا اگر بخوام یه شرط بگذارم که اگر پین xصفر بود خروجی رو به صورت toggle یک کن و اگر پین xیک بود به صورت تایمر باید شرط رو کجا قرار بدم.


                            اگر یک بود برنامه
                            طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                            امروز رو کامل زندگی کن...
                            (یه روز یعنی هیچوقت!)

                            دیدگاه


                              #29
                              پاسخ : مشکل تکرار دستور در bascom

                              نوشته اصلی توسط gh.kh نمایش پست ها
                              ممنون دوست عزیز
                              مشکل حل شد حالا اگر بخوام یه شرط بگذارم که اگر پین xصفر بود خروجی رو به صورت toggle یک کن و اگر پین xیک بود به صورت تایمر باید شرط رو کجا قرار بدم.


                              اگر یک بود برنامه

                              منظور از --خروجی رو به صورت toggle یک کن -- یعنی چی؟؟
                              میخای کدهای قبلیت هم باشن؟؟!!
                              یکم واضح تر توضیح بدید.
                              به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                              (پيش به سوي هدف)

                              دیدگاه


                                #30
                                پاسخ : مشکل تکرار دستور در bascom

                                درسته
                                یعنی اینجوری با برقراری شرط اگر پپن xصفر بود برنامه ch3 اگر یک بود تایمر
                                کد:
                                [FONT=Yekan]Chx:[/FONT]Do
                                If Pind.3 = 0 Then Goto Ch3
                                If Pind.3 = 1 Then
                                
                                
                                      Enable Timer0
                                      Start Timer0
                                
                                
                                      Set Portc.2
                                
                                
                                   End If
                                
                                
                                   If Minutes = 5 Then
                                      Minutes = 0
                                      Stop Timer0
                                      Disable Timer0
                                      Reset Portc.2
                                   End If
                                Loop
                                '================'
                                Timerr0:
                                
                                
                                Incr Sarriz
                                   If Sarriz = 5 Then
                                      Incr Seconds
                                      If Seconds = 60 Then
                                       Incr Minutes
                                       If Minutes = 244 Then Minutes = 0
                                       Seconds = 0
                                      End If
                                      Sarriz = 0
                                   End If
                                
                                
                                Return
                                '================'
                                Ch3:
                                Waitms 25
                                Toggle Portc.2
                                While Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0
                                Wend
                                While Pind.2 = 1
                                Wend
                                Waitms 25
                                Return
                                [FONT=Yekan]'================'[/FONT]
                                اما اینطوری وقتی تایمر فعال میشه بقیه برنامه غیرفعال میشه
                                طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                                امروز رو کامل زندگی کن...
                                (یه روز یعنی هیچوقت!)

                                دیدگاه

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