اطلاعیه

Collapse
No announcement yet.

مشکل در TIMER 2 میکرو

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

    #16
    پاسخ : مشکل در TIMER 2 میکرو

    نوشته اصلی توسط baby_1
    سلام
    لطفا برنامتون رو قرار بدین
    قابل توجه اینکه اکثر بچه ها میگفتن برنامه شرطی باید داخل loop باشه ولی از loopکه بیرونش اوردم وگذاشتم داخلlable درست شده ولی دقیق نیست

    برنامه اصلاح شده :

    Config Timer0 = Timer , Prescale = 1024
    Enable Interrupts
    On Ovf0 Label
    Enable Timer0
    Start Timer0


    Dim S As Byte , M As Byte , H As Byte , T As Byte
    H = 23 : M = 59 : S = 10


    Label:

    Incr T
    If T > 35 Then
    Incr S
    If S > 59 Then
    S = 0 : Incr M
    End If
    If M > 59 Then
    M = 0 : Incr H
    End If
    If H > 23 Then
    H = 1
    End If
    T = 0
    End If
    Timer2 = 0

    If H = 23 And M = 59 And S = 20 Then

    Set Portb.4

    Else

    If H = 23 And M = 59 And S = 30 Then

    Reset Portb.4
    End If
    End If
    Return
    یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

    دیدگاه


      #17
      پاسخ : مشکل در TIMER 2 میکرو

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

      کد:
      $regfile = "m8def.dat"
      $crystal = 1000000
      $hwstack = 100                       ' default use 32 for the hardware stack
      $swstack = 100                       'default use 10 for the SW stack
      $framesize = 20
      '#################################### CONFIG ###############################
      Config Timer0 = Timer , Prescale = 1024
      Enable Interrupts
      On Ovf0 Label
      Enable Timer0
      Start Timer0
      '=========================
      Dim S As Byte , M As Byte , H As Byte , T As Byte
       H = 23 : M = 59 : S = 10
      '=======================
      
      Do
        nop
      Loop
      
      End
      '==============
      
      Label:
      
      Incr T
      If T >= 30 Then
      Incr S
      If S > 59 Then
      S = 0 : Incr M
      End If
      If M > 59 Then
      M = 0 : Incr H
      End If
      If H > 23 Then
      H = 0
      End If
      T = 0
      
      If H = 23 And M = 59 And S = 20 Then
      Set Portb.4
      End If
      
      If H = 23 And M = 59 And S = 30 Then
      Reset Portb.4
      End If
      
      End If
      
      
      
      Timer2 = 0
      Return
      نکات برنامه نویسی:
      1-در صورتی که بدنه برنامه چیزی برای اجرا شدن نداره حتما سعی کنین حدالمقدور از دستور end در انتهای برنامه استفاده کنین که من برای راحتی عبارت زیر رو قرار دادم

      Do
      nop
      Loop

      End
      2-سعی کنین که در وقفه ها کمتر کدی رو بنویسین و اگر کاری هست اون رو به یک تابع ارجاع بدین نه تمامی کدها در وقفه انجام بشه در این صورت باید حجم stack سخت افزای رو تغییر بدین
      3-اجرا شدن دستور if به ازای هر شرط 1 سیکل ماشین رو در بر میگیره بنابراین این if رو به داخل حلقه label هدایت کردم جایی که ثانیه ها ، ساعت و دقیقه تغییر پیدا می کنه نه همیشه به ازای سرریز برنامه اجرا بشه
      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

      دیدگاه


        #18
        پاسخ : مشکل در TIMER 2 میکرو

        برنامه رو به صورت بهتر بنویسین

        مشکل اصلی برنامه شما اجرا نشدن if در حلقه بدنه بوده که باید توسط do..loop اون رو به صورت زیر تصحیح کنین

        کد:
        $regfile = "m8def.dat"
        $crystal = 1000000
        $hwstack = 100                       ' default use 32 for the hardware stack
        $swstack = 100                       'default use 10 for the SW stack
        $framesize = 20
        '#################################### CONFIG ###############################
        Config Timer0 = Timer , Prescale = 1024
        Enable Interrupts
        On Ovf0 Label
        Enable Timer0
        Start Timer0
        '=========================
        Dim S As Byte , M As Byte , H As Byte , T As Byte
         H = 23 : M = 59 : S = 10
        '=======================
        
        Do
        
        If H = 23 And M = 59 And S = 20 Then
        Set Portb.4
        End If
        
        If H = 23 And M = 59 And S = 30 Then
        Reset Portb.4
        End If
        Loop
        
        End
        '==============
        
        Label:
        
        Incr T
        If T > 30 Then
        Incr S
        If S > 59 Then
        S = 0 : Incr M
        End If
        If M > 59 Then
        M = 0 : Incr H
        End If
        If H > 23 Then
        H = 1
        End If
        T = 0
        End If
        
        
        
        Timer2 = 0
        Return
        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

        دیدگاه


          #19
          پاسخ : مشکل در TIMER 2 میکرو

          نوشته اصلی توسط baby_1
          برنامه رو به صورت بهتر بنویسین

          مشکل اصلی برنامه شما اجرا نشدن if در حلقه بدنه بوده که باید توسط do..loop اون رو به صورت زیر تصحیح کنین

          کد:
          $regfile = "m8def.dat"
          $crystal = 1000000
          $hwstack = 100                       ' default use 32 for the hardware stack
          $swstack = 100                       'default use 10 for the SW stack
          $framesize = 20
          '#################################### CONFIG ###############################
          Config Timer0 = Timer , Prescale = 1024
          Enable Interrupts
          On Ovf0 Label
          Enable Timer0
          Start Timer0
          '=========================
          Dim S As Byte , M As Byte , H As Byte , T As Byte
           H = 23 : M = 59 : S = 10
          '=======================
          
          Do
          
          If H = 23 And M = 59 And S = 20 Then
          Set Portb.4
          End If
          
          If H = 23 And M = 59 And S = 30 Then
          Reset Portb.4
          End If
          Loop
          
          End
          '==============
          
          Label:
          
          Incr T
          If T > 30 Then
          Incr S
          If S > 59 Then
          S = 0 : Incr M
          End If
          If M > 59 Then
          M = 0 : Incr H
          End If
          If H > 23 Then
          H = 1
          End If
          T = 0
          End If
          
          
          
          Timer2 = 0
          Return
          سلام .دستوری شرطی رو که دیشب داخل حلقه گذاشته بودم و جواب نمیداد.(پستهای دیشب رو نگاه کنید).
          یکی از دوستان پیشنهاد کرد از داخل حلقه بردار و بذار داخل زیر برنامه lableدرست میشه .منم گذاشتم و حالا پین فعال و غیر فعال میشه ولی زمانش دقیق نیست.

          زمانیکه شرط داخل حلقه بود جواب نمیداد

          راستی این دستورها اینجا کارشون چیه ؟؟

          Incr T
          If T > 30 Then



          چرا تایمر 2 صفر میشه ؟

          Timer2 = 0

          یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

          دیدگاه


            #20
            پاسخ : مشکل در TIMER 2 میکرو

            سلام
            اگر توجه کرده باشین میکرو با سرعت 8 مگاهرتز کلاک می خوره و تایمر از 1024 ام این کلاک استفاده کرده و خودش رو افزایش می ده یعنی به ازای هر 128 میکرو ثانیه یه عدد به جلو حرکت می کنه پس یک ثانیه چند تا 128 میکرو ثانیه می شه 7812.5 ، تایمر شما هم 8 بیتی هست بنابراین عدد قبلی رو تقسیم بر 256 کنیم داریم تقریبا 30 یعنی اگر 30 بار تایمر اورفلو شد تازه یک ثانیه ایجاد شده.

            صفر شدن تایمر برای اینه که به میکرو بفهمونیم تایمر رو صفر کردیم بعد از بازگشت به برنامه باز شروع کن به افزایش از صفر تا مقدار ماکزیمم.

            الان برنامه رو دیدم فکر کنم یه اشتباهی از دیشب تا الان شده

            شما فرکانس کاریتون رو تغییر دادین و کردینش 1 مگاهرتز.پس عدد باید تغییر کنه
            1000000/1024=976.5625
            بنابراین خواهیم داشت 4
            شما باید بگین t اگر بزرگتر از 4 شد


            $regfile = "m8def.dat"
            $crystal = 1000000
            $hwstack = 100 ' default use 32 for the hardware stack
            $swstack = 100 'default use 10 for the SW stack
            $framesize = 20
            '#################################### CONFIG ###############################
            Config Timer0 = Timer , Prescale = 1024
            Enable Interrupts
            On Ovf0 Label
            Enable Timer0
            Start Timer0
            '=========================
            Dim S As Byte , M As Byte , H As Byte , T As Byte
            H = 23 : M = 59 : S = 10
            '=======================

            Do

            If H = 23 And M = 59 And S = 20 Then
            Set Portb.4
            End If

            If H = 23 And M = 59 And S = 30 Then
            Reset Portb.4
            End If
            Loop

            End
            '==============

            Label:

            Incr T
            If T > 4 Then
            Incr S
            If S > 59 Then
            S = 0 : Incr M
            End If
            If M > 59 Then
            M = 0 : Incr H
            End If
            If H > 23 Then
            H = 1
            End If
            T = 0
            End If



            Timer2 = 0
            Return

            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


              #21
              پاسخ : مشکل در TIMER 2 میکرو

              سلام از بابت راهنماییتون متشکرم
              اره مشکل از 4 بود،،، با گذاشتنش مشکل حل شد.

              برنامه تایمر رو که جداگانه پروگرام میکنم هیچ موردی نداره و عالی کار میکنه .ولی وقتی برنامه تایمر،رو میذارم داخل برنامه اصلی که دارم روش کار میکنم .سرموقع روشن میشه ،ولی دیگه خاموش نمیشه.که من از چشم دستورات دیگر داخل حقله میبینم.چون من یه سری دستورات تاخیری داخل حلقه پیاده کردم .یه نگاه بندازید ممنونم میشم .(اگر در مورد این برنامه های که داخل حلقه نوشتم پیشنهادی در جهت تغییر و بهبود شدنش داشته باشید استقبال میکنم
              )
              Do

              If H = 22 And M = 59 And S = 20 Then

              Set Portb.4
              Else
              If H = 22 And M = 59 And S = 35 Then
              Reset Portb.4
              End If
              End If

              Incr Q

              Select Case Q
              Waitms 100

              Case 1 To 3:

              K = "mohammad "
              L = " ali "
              Locate 1 , 1
              Lcd K
              For B = 1 To 16

              Shiftlcd Right

              Waitms 350
              Next

              Locate 2 , 1
              Lcd L
              For B = 1 To 16

              Shiftlcd Left

              Waitms 480
              Next

              Case 4 To 9:
              Cls

              Show = Pinc
              Locate 1 , 1
              Lcd "RE 1 2 3 4 5 6"
              Locate 2 , 1
              Lcd "PO " ; Show.0 ; " " ; Show.1 ; " " ; Show.2 ; " " ; Show.3 ; " " ; Show.4 ; " " ; Show.5 ;
              Waitms 500
              End Select
              If Q > 9 Then
              Q = 0
              End If
              Loop



              یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

              دیدگاه


                #22
                پاسخ : مشکل در TIMER 2 میکرو

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

                دیدگاه


                  #23
                  پاسخ : مشکل در TIMER 2 میکرو

                  نوشته اصلی توسط baby_1
                  سلام
                  لطفا برنامه کاملتون رو قرار بدین
                  سلام برنامه کامل این هست که من قسمت حلقه رو بهش اضافه کردم.
                  http://www.eca.ir/forum2/index.php?topic=35457.0
                  از صفحه اول میتونید دانلود کنید
                  یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                  دیدگاه


                    #24
                    پاسخ : مشکل در TIMER 2 میکرو

                    این برنامه رو تست کنین
                    کد:
                    $regfile = "m8def.dat"
                    $crystal = 1000000
                    $hwstack = 100                       ' default use 32 for the hardware stack
                    $swstack = 100                       'default use 10 for the SW stack
                    $framesize = 20
                    '#################################### CONFIG ###############################
                    Config Timer0 = Timer , Prescale = 1024
                    Enable Interrupts
                    On Ovf0 Label
                    Enable Timer0
                    Start Timer0
                    '=========================
                    Dim S As Byte , M As Byte , H As Byte , T As Byte , Q As Byte , Show As Byte , K As String * 20 , L As String * 20
                    Dim B As Byte
                     H = 23 : M = 59 : S = 10
                    '=======================
                    
                    Do
                    
                    
                    Incr Q
                    Waitms 100
                    
                    Select Case Q
                    '=========
                    Case 1 To 3:
                    K = "mohammad     "
                    L = " ali      "
                    Locate 1 , 1
                    Lcd K
                    For B = 1 To 16
                    Shiftlcd Right
                    Waitms 350
                    Next
                    Locate 2 , 1
                    Lcd L
                    For B = 1 To 16
                    Shiftlcd Left
                    Waitms 480
                    Next
                    '===========
                    Case 4 To 9:
                    Cls
                    Show = Pinc
                    Locate 1 , 1
                    Lcd "RE 1 2 3 4 5 6"
                    Locate 2 , 1
                    Lcd "PO " ; Show.0 ; " " ; Show.1 ; " " ; Show.2 ; " " ; Show.3 ; " " ; Show.4 ; " " ; Show.5 ;
                    Waitms 500
                    End Select
                    '======
                    If Q > 9 Then
                    Q = 0
                    End If
                    
                    Loop
                    
                    End
                    '==============
                    
                    Label:
                    
                    Incr T
                    If T > 4 Then
                    Incr S
                    If S > 59 Then
                    S = 0 : Incr M
                    End If
                    If M > 59 Then
                    M = 0 : Incr H
                    End If
                    If H > 23 Then
                    H = 1
                    End If
                    
                    If H = 23 And M = 59 And S = 20 Then
                    Set Portb.4
                    End If
                    
                    If H = 23 And M = 59 And S = 30 Then
                    Reset Portb.4
                    End If
                    
                    T = 0
                    End If
                    Timer2 = 0
                    Return
                    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                    دیدگاه


                      #25
                      پاسخ : مشکل در TIMER 2 میکرو

                      درست شد : :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow:



                      واقعا از هم راهیتون متشکرم وکمال سپاسگذاری رو ازتون دارم ::applause: :applause: :applause: :applause:
                      یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                      دیدگاه


                        #26
                        پاسخ : مشکل در TIMER 2 میکرو

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

                        دیدگاه


                          #27
                          پاسخ : مشکل در TIMER 2 میکرو

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

                          ضمنا بودنش در این برنامه نیاز هست؟

                          $hwstack = 100
                          $swstack = 100
                          $framesize = 20
                          یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                          دیدگاه


                            #28
                            پاسخ : مشکل در TIMER 2 میکرو

                            سلام
                            توضیحات این سه دستور فقط 10 صفحه طول می کشه پیشنهاد میکنم توضیحات خود سایت bascom رو مطالعه کنین
                            اما برای راحتی
                            hwstack برای تعیین پشته سخت افزاری به کار می ره
                            swstack برای تعیین پشته نرم افزاری به کار می ره
                            framesize طول فریم رو تعیین می کنه

                            مثلا شما اگر به یه تابه پرش کنین یا یک لیبل و دخل اون تابع کدهای زیادی باشه و بخواین از اونجا به تابع دیگه ای پرش کنین احتمالا پشته فضا برای نگهداری آدرس کم می یاره و می بینین میکروتون اجرا درست دستورات این قسمت ها رو انجام نمی ده بابت همین هم می یان پشته رو تغییر می دن به اعداد بالاتر

                            ramesize این قسمت تعیین کننده مقدار حافظه در نظر گرفته شده برای دستورات رشته ای بسکام مثل چاپ کارکتر روی ال سی دی و ... هست شما هر وقت داده ای رو می خواین به LCD ارسال کنین باید این داده ها ابتدا روی رم قرار بگیرن و بعد ارسال بشن اگر مقدار این متغییر کم باشه از این جهت حافظه برای نگهداری کارکترهای بیشتر کم می یارین
                            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                            دیدگاه


                              #29
                              پاسخ : مشکل در TIMER 2 میکرو

                              سلام
                              baby جان نقل مکان کردیم

                              قبلا ما اینجا در مورد وقفه بحث کردیم و در مورد برنامه هم به نتیجه رسیدیدم که جا داره از شما تشکر ویژه کنم :applause: :applause:

                              در تاپیک وقفه INT 0 وضعیت اینطور شد که وقتی برق قطع میشه میکرو در یک حلقه گیر میکنه و کار دیگه ای نمیتونه انجام بده تا اینکه برق وصل بشه . تا اینجا OK??

                              الان یه مشکلی هست و اون اینکه وقتی برق قطع میشه ،طبق معمول باتری برق مدار رو تامین میکنه ،و دستورات TIMER 0 هم اجرا میشه .اگر یادتون باشه از TIMER 0 من برای شارژر استفاده کردم که هر روز در یه زمان معین یه رله رو فعال میکنه و گوشی رو شارژ میکرد.جالب اینجاس که وقتی برق قطع میشه وTIMER 0 هم فعال میشه ، گوشی توسط باتری اضطراری شارژ میشه .

                              حالا خواستم ببینم این امکان وجود داره که وقتی برق قطع هست تایمر 0 هم غیر فعال بشه تا از باتری اضطراری شارژ نکشه .؟؟
                              یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                              دیدگاه


                                #30
                                پاسخ : مشکل در TIMER 2 میکرو

                                سلام
                                بله
                                برای این کار هر جا خواستین تایمر رو خاموش کنین(مثلا وقت برق رفتن) در تابع ، زیر تابع و .... بیان از عبارت
                                stop timer0
                                استفاده کنین
                                هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                                دیدگاه

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