اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    اینم کد : زمانی که ورودی یک شد ، تایمر روشن و برنامه اصلا وارد ch3 نخواهد شد ، تا تایمر خاموش شه ، و پرچم و بکشه پایین ، و اونوقت که همون پین صفر هست ، وارد ch3 میشه.
    کد:
    $regfile = "m64def.dat"
    $crystal = 8000000
    Config Portd = Input
    Config Portb = Output
    Config Debounce = 20
    
    Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , _
                 Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
    Config Lcd = 16 * 2
    
    Waitms 20
    'Cursor Blink
    Cursor Off
    
    Enable Interrupts
    
    Config Timer2 = Timer , Prescale = 64
    On Timer2 Timerr2
    Stop Timer2
    Disable Timer2
    Reset Portd.0
    Reset Portd.1
    
    Dim Sarriz As Integer
    Dim Seconds As Byte
    Dim Minutes As Byte
    Dim Flagtimer As Bit
    Declare Sub Ch3
    
    '========================================'
    Cls
    Waitms 5
    Lcd "hossein"
    
    Do                                                          'here is main code
    
       If Pind.0 = 1 Then
          flagtimer = 1
          Enable Timer2
          Start Timer2
          Portb = &B11111111
                                             ' ba feshordane vorodi , portB roshan mishe
       Elseif Pind.0 = 0 And Flagtimer = 0 Then
         Call Ch3
       End If
    
       If Minutes = 2 Then                                      'zamani ke shoma dar nazar darin bayad inja gozashte beshe baraye khamoshiye khooroji
          Minutes = 0
          Flagtimer = 0
          Stop Timer2
          Disable Timer2
          Portb = &B0000000
       End If
    
       '{
    
    
        'dar in baze baqiye barname khodetono benevisin
    
    
       '}
    
    
    Loop
    '======================================='
    
    Timerr2:
    
    Incr Sarriz
       If Sarriz = 489 Then
          Incr Seconds
          Locate 1 , 1
          Lcd Seconds
          If Seconds = 60 Then
           Incr Minutes
           Lowerline
           Lcd Minutes
           If Minutes = 244 Then Minutes = 0
           Seconds = 0
          End If
          Sarriz = 0
       End If
    
    Return
    
    
    '_____________________
    Sub 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
    End Sub
    '================'

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

    دیدگاه


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

      نوشته اصلی توسط hosseinam نمایش پست ها
      سعی کنید از همین اول بدون دستورات پرش برنامه بنویسین ، بعدا تو کدهای بزرگتر به مشکل پشته میخورید، چون کنترل برنامه از دست خارج میشه.

      اینم کد : زمانی که ورودی یک شد ، تایمر روشن و برنامه اصلا وارد ch3 نخواهد شد ، تا تایمر خاموش شه ، و پرچم و بکشه پایین ، و اونوقت که همون پین صفر هست ، وارد ch3 میشه.
      کد:
      $regfile = "m64def.dat"
      $crystal = 8000000
      Config Portd = Input
      Config Portb = Output
      Config Debounce = 20
      
      Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , _
                   Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
      Config Lcd = 16 * 2
      
      Waitms 20
      'Cursor Blink
      Cursor Off
      
      Enable Interrupts
      
      Config Timer2 = Timer , Prescale = 64
      On Timer2 Timerr2
      Stop Timer2
      Disable Timer2
      Reset Portd.0
      Reset Portd.1
      
      Dim Sarriz As Integer
      Dim Seconds As Byte
      Dim Minutes As Byte
      Dim Flagtimer As Bit
      Declare Sub Ch3
      
      '========================================'
      Cls
      Waitms 5
      Lcd "hossein"
      
      Do                                                          'here is main code
      
         If Pind.0 = 1 Then
            flagtimer = 1
            Enable Timer2
            Start Timer2
            Portb = &B11111111
                                               ' ba feshordane vorodi , portB roshan mishe
         Elseif Pind.0 = 0 And Flagtimer = 0 Then
           Call Ch3
         End If
      
         If Minutes = 2 Then                                      'zamani ke shoma dar nazar darin bayad inja gozashte beshe baraye khamoshiye khooroji
            Minutes = 0
            Flagtimer = 0
            Stop Timer2
            Disable Timer2
            Portb = &B0000000
         End If
      
         '{
      
      
          'dar in baze baqiye barname khodetono benevisin
      
      
         '}
      
      
      Loop
      '======================================='
      
      Timerr2:
      
      Incr Sarriz
         If Sarriz = 489 Then
            Incr Seconds
            Locate 1 , 1
            Lcd Seconds
            If Seconds = 60 Then
             Incr Minutes
             Lowerline
             Lcd Minutes
             If Minutes = 244 Then Minutes = 0
             Seconds = 0
            End If
            Sarriz = 0
         End If
      
      Return
      
      
      '_____________________
      Sub 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
      End Sub
      '================'

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

      دیدگاه


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

        نوشته اصلی توسط hosseinam نمایش پست ها
        سعی کنید از همین اول بدون دستورات پرش برنامه بنویسین ، بعدا تو کدهای بزرگتر به مشکل پشته میخورید، چون کنترل برنامه از دست خارج میشه.

        اینم کد : زمانی که ورودی یک شد ، تایمر روشن و برنامه اصلا وارد ch3 نخواهد شد ، تا تایمر خاموش شه ، و پرچم و بکشه پایین ، و اونوقت که همون پین صفر هست ، وارد ch3 میشه.
        کد:
        $regfile = "m64def.dat"
        $crystal = 8000000
        Config Portd = Input
        Config Portb = Output
        Config Debounce = 20
        
        Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , _
                     Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
        Config Lcd = 16 * 2
        
        Waitms 20
        'Cursor Blink
        Cursor Off
        
        Enable Interrupts
        
        Config Timer2 = Timer , Prescale = 64
        On Timer2 Timerr2
        Stop Timer2
        Disable Timer2
        Reset Portd.0
        Reset Portd.1
        
        Dim Sarriz As Integer
        Dim Seconds As Byte
        Dim Minutes As Byte
        Dim Flagtimer As Bit
        Declare Sub Ch3
        
        '========================================'
        Cls
        Waitms 5
        Lcd "hossein"
        
        Do                                                          'here is main code
        
           If Pind.0 = 1 Then
              flagtimer = 1
              Enable Timer2
              Start Timer2
              Portb = &B11111111
                                                 ' ba feshordane vorodi , portB roshan mishe
           Elseif Pind.0 = 0 And Flagtimer = 0 Then
             Call Ch3
           End If
        
           If Minutes = 2 Then                                      'zamani ke shoma dar nazar darin bayad inja gozashte beshe baraye khamoshiye khooroji
              Minutes = 0
              Flagtimer = 0
              Stop Timer2
              Disable Timer2
              Portb = &B0000000
           End If
        
           '{
        
        
            'dar in baze baqiye barname khodetono benevisin
        
        
           '}
        
        
        Loop
        '======================================='
        
        Timerr2:
        
        Incr Sarriz
           If Sarriz = 489 Then
              Incr Seconds
              Locate 1 , 1
              Lcd Seconds
              If Seconds = 60 Then
               Incr Minutes
               Lowerline
               Lcd Minutes
               If Minutes = 244 Then Minutes = 0
               Seconds = 0
              End If
              Sarriz = 0
           End If
        
        Return
        
        
        '_____________________
        Sub 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
        End Sub
        '================'

        راستی دستورات ال سی دی رو حذف کنید.مهم نیست.
        این صحبت که بدون دستورات پرش برنامه بنویسیم زیاد شنیم
        ولی لطفا یه توضیح بدید برای رفتن به قسمت دیگه برنامه چیکار کنیم بدون پرش؟؟

        دیدگاه


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

          خیلی ممنون از کمکتون دوست عزیز
          بنده رشته تخصصیم برق قدرت هست الکترونیک رو از روی علاقه انجام میدم
          و برنامه نویسی هم دستو پا شکسته از اموزشای اینترنتی و زحمات دوستانی چون شما یاد گرفتم
          بازم از کمکتون قدر دانی میکنم
          خواهش میکنم دوسته عزیز.
          پس شما قدرت خوندی، منم قدرت خوندم ، ولی علاقه ی شدید ی که به الکترونیک و کامپیوتر داشتم ، منو کشوند به این سمت .
          از 5 سال پیش برنامه نویسی رو پایه ای و از ECA شروع کردم ، و دو سال پیش هم یکی از اتفاقات زندگیم این بود که سی/سی++ یاد گرفتم ، و دید برنامه نویسی رو مدیون سی/سی++ هستم ، اگه تو کد نویسی هام دقت کنید ، از لحاظ گرامری شبیه به قوانین سی سی++ هست.
          پیشنهاد میکنم شما بسکام و بخوبی و پایه ای یاد بگیرید ، و بستن مدارات میکروکنترلری ، به راحتی تمامیه مدار فرمان ها میبندین با هزینه کم و باکلاس.موفق باشید.

          نوشته اصلی توسط yousef55 نمایش پست ها
          این صحبت که بدون دستورات پرش برنامه بنویسیم زیاد شنیم
          ولی لطفا یه توضیح بدید برای رفتن به قسمت دیگه برنامه چیکار کنیم بدون پرش؟؟
          ببینید دوسته عزیز کد نویسی علاوه بر ایجاد تکنیک های هوشمند کدنویسی که بسیار مهم هست کجا چه دستوری استفاده کنید ، علاوه بر این خانایی برنامه به همین اندازه مهم هست،یعنی باید طوری اسم متغییر ها و توابع رو انتخاب کنی که با یک دید بفهمی کجا به کجاست ، و اگر بعد ها خاستی برگردی به کد ، بفهمی کجا به کجاست، باید زیاد یاداداشت بزارید تو کدتون ، برای همین ما باید سعی کنیم که کد خانا باشه ، یعنی مثلا بیایم یه مسئله رو به توابع کوچک تبدیل کنیم ، و هر تابع بیاد یه کار رو انجام بده ، دیگه نباید تو اون تابع ، بیاد توابع دیگه رو هم لینک بده ، مثلا با فراخانی یه تابع از داخل اون تابع نباید بپریم تو یه تابع دیگه و از اون تابع بپریم به یه تابع دیگه ،و همینطور الی آخر ، حالا اگه یه مشکلی پیش بیاد تو کدهای بزرگ ، دیگه نمیدونی کجا به کجاست باید دنبال چی بگردی ، گم میشی تو کدت ،ولی اگه بیای یه main تعریف کنی و داخلش یه حلقه بسازی ، و توابع رو داخل اون حلقه دونه دونه بسته به نیازت فراخانی کنی ، هم خاناتر میشه هم مشکل یابی راحتتر .

          علاوه بر این دستورات پرش اینطوریه که اگه شما تو خط 10 بیاید دستور پرش به لیبلی که در خط50 وجود داره رو صادر کنید ، سی پی یو میره تمام خونه های حافظه رو میگرده و دنبال اسم اون لیبل هست و تا پیداش کنه ، و هر مجمع بیتی که شبیه به اسم لیبل باشه رو لیبل میفهمه و همونجا ادامه میده ، حالا شاید در کدهای کوتاه بتونی جواب بگیری ولی شما یه برنامه 2000 خطی رو فرض کن ، که از خط 10 دستور رفتن به لیبل 1500 رو صادر کنی؟!!!!! حتما بیت ها شبیه به نام لیبل پیدا میشه ، سی پی یو که مرجع درستی نداره ، تا بسنجه ، مثلا تو خط 800 بیت مشابه پیدا میکنه ، همونو اسم لیبل میگیره و از همونجا به بعد ادامه میده ، آیا منظور این بود ؟؟!! آیا سی پی یو درست کد رو اجرا میکنه ؟؟؟ نه.
          ولی حالا بخوای از اینا استفاده نکنی یعنی از call استفاده کنی ، اینجوری وقتی شما یه تابع رو call میکنی ، آد رس جایی که بودی ، سی پی یو میگیره تو حافظه پشته ذخیره میکنه و میره به سابروتین یا تابع مشخص شده و اونو به طور کامل انجام میده و مراجعه میکنه به پشته و آدرس و میگیره و برمیگرده به جایی که بوده ، و ادامه داستان.

          برای رفتن به قسمت های دیگه ، شما باید فراخانی کنی تابع مورد نظر رو با call و اینو بدونید که وقتی تابعی فراخانی میشه ، سی پی یو میره داخل تابع و اجرا میکنه و دوباره برمیگرده همونجایی که بود و فراخانی شده بود. اگه تو کد اصلیتون نیاز به چک کردن یه تابع داشتید که مثلا اگه اون تابع انجام شد ، بیاید یه کار دیگه بکنید، میآید یه متغییر از نوع بیت تعریف میکنی ، و داخل اون تابع 1 میکنی مقدارشو ، بعد که برگشت ، میتونید بگید اگه فلان تابع یک بود تو بیا اینکار رو انجام بده.
          حالا اگه بسکام کد میزنید یه مثلا با پرش طراحی کنید ، و بزارید اینجا تا باهم بیایم پرش هارو حذف کنیم ولی همون کار رو انجام بده.

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

          دیدگاه


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

            پس به صورت کلی :
            تو پرش های کوتاه میشه از GOTO استفاده کرد ولی پرش بلند بهتره GOSUB استفاده بشه ؟؟؟
            ممنون از راهنماییت

            دیدگاه


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

              نوشته اصلی توسط yousef55 نمایش پست ها
              پس به صورت کلی :
              تو پرش های کوتاه میشه از GOTO استفاده کرد ولی پرش بلند بهتره GOSUB استفاده بشه ؟؟؟
              ممنون از راهنماییت
              میشه ، ولی بازم شاید مشکل آفرین باشه.
              gosub هم عملکرد دستور پرش رو خواهد داشت ، ولی شاید ساختار درونی این دستور بهینه تر باشه.
              من که الان 2300 خط کد نوشتم ، ولی از هیچ دستور پرشی استفاده نکردم ، و توابع هم باهم ارتباط برقرار میکنن.
              برای یه کد بهینه باید بدون پرش استفاده بشه ، ما تو برنامه نویسی های کامپیوتری اصلا دستوری به اسم پرش نداریم ، چون آدم و گمراه میکنه و دچار ریسک میکنه کد رو.
              شما باید مهارت خودتونو افزایش بدید تا این دستور ها رو فراموش کنید.
              به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
              (پيش به سوي هدف)

              دیدگاه


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

                درود دوستان یه کمکی هم به ما بکنبد هر کاری میکنم باز هم مشکل داره
                تو این کد زمانی که خروجی تایمر دار فعاله اگر یکی دیکه از خروجی ها اجرا بشه دیگه تایمر بعد از زمان مشخص خروجی مربوط به خودش رو خاموش نمیکنه
                تا اینکه دوباره بیای شرطش رو اجرا کنی تا به کارش ادامه بده
                کد:
                [COLOR=#333333][FONT=monospace]Dim Flagtimer As Bit[/FONT][/COLOR]
                
                
                Do
                
                
                   If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                     If Flagtimer = 0 Then
                      Enable Timer2
                      Start Timer2
                     End If
                
                      Set Portc.2
                   End If
                
                   If Pind.2 = 1 And Flagtimer = 0 Then
                      Enable Timer2
                      Start Timer2
                      Set Portc.2
                   End If
                
                
                
                
                   If Minutes = 5 Then
                      Minutes = 0
                      Stop Timer2
                      Disable Timer2
                      Flagtimer = 0
                      Reset Portc.2
                   End If
                
                
                If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then Goto Ch1
                If Pind.0 = 1 Then Goto Ch1
                
                
                 Loop
                 '================'
                 Ch1:
                Waitms 25
                Toggle Portc.0
                While Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0
                Wend
                While Pind.0 = 1
                Wend
                Waitms 25
                Return
                '================'
                Timerr2:
                
                Flagtimer = 1
                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
                
                 [COLOR=#333333][FONT=monospace]Return[/FONT][/COLOR]
                طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                امروز رو کامل زندگی کن...
                (یه روز یعنی هیچوقت!)

                دیدگاه


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

                  نوشته اصلی توسط gh.kh نمایش پست ها
                  درود دوستان یه کمکی هم به ما بکنبد هر کاری میکنم باز هم مشکل داره
                  تو این کد زمانی که خروجی تایمر دار فعاله اگر یکی دیکه از خروجی ها اجرا بشه دیگه تایمر بعد از زمان مشخص خروجی مربوط به خودش رو خاموش نمیکنه
                  تا اینکه دوباره بیای شرطش رو اجرا کنی تا به کارش ادامه بده
                  اینو اجرا کنید ببینید مشکلتون حل میشه یا نه.من فکر میکنم وقتی سی پی یو تو تا خیر 25 میلی ثانیه شما مونده ، تایمر به 5 دقیقه میرسه و چون تو این بازه شرط چک نمیشه ، موقع برگشت دیگه کد از کنترل خارج میشه.حالا شما یه تست بگیر ببین چی میشه.
                  کد:
                  $regfile = "m8def.dat"$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
                  Reset Portd.3
                  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
                  Dim Flagtimer As Bit
                  '==========================================================================='
                  Do
                  
                  
                  
                  
                     If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                       If Flagtimer = 0 Then
                        Enable Timer2
                        Start Timer2
                       End If
                        Set Portc.2
                     End If
                  
                  
                     If Pind.2 = 1 And Flagtimer = 0 Then
                      If Flagtimer = 0 Then
                        Enable Timer2
                        Start Timer2
                      End If
                        Set Portc.2
                     End If
                  
                  If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then Goto Ch1
                  If Pind.0 = 1 Then Goto Ch1
                  
                  
                   Loop
                   '================'
                   Ch1:
                  Waitms 25
                  Toggle Portc.0
                  While Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0
                  Wend
                  
                  While Pind.0 = 1
                  Wend
                  Waitms 25
                  Return
                  '================'
                  Timerr2:
                  
                  Flagtimer = 1
                  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
                  
                   If Minutes = 5 Then
                        Minutes = 0
                        Stop Timer2
                        Disable Timer2
                        Flagtimer = 0
                        Reset Portc.2
                     End If
                  
                  
                  Return
                  به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                  (پيش به سوي هدف)

                  دیدگاه


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

                    نوشته اصلی توسط hosseinam نمایش پست ها
                    اینو اجرا کنید ببینید مشکلتون حل میشه یا نه.من فکر میکنم وقتی سی پی یو تو تا خیر 25 میلی ثانیه شما مونده ، تایمر به 5 دقیقه میرسه و چون تو این بازه شرط چک نمیشه ، موقع برگشت دیگه کد از کنترل خارج میشه.حالا شما یه تست بگیر ببین چی میشه.
                    کد:
                    $regfile = "m8def.dat"$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
                    Reset Portd.3
                    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
                    Dim Flagtimer As Bit
                    '==========================================================================='
                    Do
                    
                    
                    
                    
                       If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                         If Flagtimer = 0 Then
                          Enable Timer2
                          Start Timer2
                         End If
                          Set Portc.2
                       End If
                    
                    
                       If Pind.2 = 1 And Flagtimer = 0 Then
                        If Flagtimer = 0 Then
                          Enable Timer2
                          Start Timer2
                        End If
                          Set Portc.2
                       End If
                    
                    If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then Goto Ch1
                    If Pind.0 = 1 Then Goto Ch1
                    
                    
                     Loop
                     '================'
                     Ch1:
                    Waitms 25
                    Toggle Portc.0
                    While Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0
                    Wend
                    
                    While Pind.0 = 1
                    Wend
                    Waitms 25
                    Return
                    '================'
                    Timerr2:
                    
                    Flagtimer = 1
                    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
                    
                     If Minutes = 5 Then
                          Minutes = 0
                          Stop Timer2
                          Disable Timer2
                          Flagtimer = 0
                          Reset Portc.2
                       End If
                    
                    
                    Return
                    نه متاسفانه مشکل همچنان باقیست و با یک شدن خروجی دیگه زمانی که تایمر فعاله تایمر دیگه به کارش ادامه نمیده
                    طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                    امروز رو کامل زندگی کن...
                    (یه روز یعنی هیچوقت!)

                    دیدگاه


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

                      نوشته اصلی توسط gh.kh نمایش پست ها
                      نه متاسفانه مشکل همچنان باقیست و با یک شدن خروجی دیگه زمانی که تایمر فعاله تایمر دیگه به کارش ادامه نمیده
                      یعنی شما میگین با اجرا شدن این دوتا خط ، دیگه تایمر کار نمیکنه؟؟؟
                      کد:
                      If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then Goto Ch1
                      If Pind.0 = 1 Then Goto Ch1
                      لطفا شماتیک رو بزارید.
                      به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                      (پيش به سوي هدف)

                      دیدگاه


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

                        درسته
                        هر کدوم از دوتا شرط اجرا بشه دیگه تایمر کار نمیکنه وخروجی مربوط بهش روشن باقی میمونه

                        اینم هم فایل پروتئوس

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

                        دیدگاه


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

                          دوسته عزیز من تست کردم کد رو ، وقتی که ال ای دی 3 روشنه ، و s1 پایینه ، تایمر باز به کارش ادامه میده و ال ای دی 3 رو بعد 5 دقیقه خاموش میکنه.
                          مشکل شما اینه که با سرعت پردازنده از حلق میپرید به لیبل مورد نظر ، و این کار ناصحیح هست ، یعنی مثلا اگه کلید s1 بسته باشه ، شما دائما بین حلقه و لیبل با سرعت بسیار بالا در حال سوئیچ هستید ، حتی پرتیوس هم این کار رو warning زده.سعی کنید الگوریتم رو عوض کنید.و حتی همین میتونه اجرا نشدن درست خواستتون از کد بشه.
                          کد:
                          
                          $regfile = "m8def.dat"$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
                          Reset Portd.3
                          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
                          Dim Flagtimer As Bit
                          '==========================================================================='
                          Do
                          
                          
                          
                          
                             If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                               If Flagtimer = 0 Then
                                Enable Timer2
                                Start Timer2
                               End If
                                Set Portc.2
                             End If
                          
                          
                             If Pind.2 = 1 And Flagtimer = 0 Then
                              If Flagtimer = 0 Then
                                Enable Timer2
                                Start Timer2
                              End If
                                Set Portc.2
                             End If
                          
                          If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then Goto Ch1
                          If Pind.0 = 1 Then Goto Ch1
                          
                          
                           Loop
                           '================'
                           Ch1:
                          Waitms 25
                          Toggle Portc.0
                          While Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0
                          Wend
                          
                          While Pind.0 = 1
                          Wend
                          Waitms 25
                          Return
                          '================'
                          Timerr2:
                          
                          Flagtimer = 1
                          Incr Sarriz
                          
                              If Minutes = 5 Then
                                Minutes = 0
                                Stop Timer2
                                Disable Timer2
                                Flagtimer = 0
                                Reset Portc.2
                             End If
                          
                          
                             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
                          تازه اصلا مشخص نیست شما چه انتظاری از کد دارین ، خیلی گنگه ، میخایید کلی ورودی چک کنید و اگه 8 دلیل اتفاق افتاد ، بیاید یکاری بکنه ، که خط به خط کد هم به هم ربط داره ، واقعا کمی گیج کنندست ، سعی کنید خواستتون به خوبی مشخص و کد ساده تری بنویسید تا خطایابی انجام بشه.
                          موفق باشید.
                          به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                          (پيش به سوي هدف)

                          دیدگاه


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

                            برنامه ساده هست
                            عملکردش به این صورته که چهارتا ورودی رو به صورت باینری چه میکنه وقتی 1000 بود یه خروجی رو روشن میکنه و زمانی که دوباره یک شد خاموش
                            و زمانی که 0100 بود یکی دیگه روروشن میکنه
                            حالا میخوام زمانی که 1100 بود کانال سوم رو وقتی روشن کرد یه تایم برارخاموش شدنش داشته باشه تا اینجا مشکلی نیست مشکل اینجاست که زمانی که 1100 فعال میشه و خروجی تایمر دار روشن میشه اگر ورودی 1000 یا 0100 اجرا بشه و خروجیشون روشن بشه تایمر دیگه طبق وقت تایین شده عمل نمیکنه و خروجی خودش رو خاموش نمیکنه
                            علاوه بر سه تا حالت بالا که خروجی مربوط به خودشون رو فعال و غیر فعال میکنن میخوام یه پین دیگه تک شرطی هم باشه که همین کارو بکنه امیدوارم منظورمو رسونده باشم
                            برنامه رو هم چک کردم متاسفانه همچان مشکل پابرجاست
                            طوری زندگی کن انگار امروز اخرین روز زندگیته!!!
                            امروز رو کامل زندگی کن...
                            (یه روز یعنی هیچوقت!)

                            دیدگاه


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

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

                              دیدگاه


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

                                نوشته اصلی توسط gh.kh نمایش پست ها
                                دوستان کسی نظری نداره مشکل از کجاست
                                مشکلت اینه که وقتی تایمر رو روشن میکنی ، بقدری زود سرریز میشه که اصلا وقت برای اجرای بقیه کد نیست ، یعنی همیشه تا سرریز میشه ، و بیاد داخل خودش کد رو اجرا کنه ، دو باره سرریز میشه ، و همینطور الی آخر ، تا اینکه از کار وایسته و اجازه بده سی پی یو زمان برای اجرای بقیه کد رو داشته باشه.
                                برای حل این مشکل :
                                1- باید فرکانس کاریتونو بیارید پایین ، تا زمان بیشتری طول بکشه سرریز شه

                                مثل این کد :
                                کد:
                                
                                $regfile = "m8def.dat"$crystal = 1000000
                                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
                                Reset Portd.3
                                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
                                Dim Flagtimer As Bit
                                Dim Flag1000 As Bit
                                Dim Flag0100 As Bit
                                Dim Flag1100 As Bit
                                '==========================================================================='
                                Do
                                
                                
                                
                                
                                   If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then
                                     If Flag1000 = 0 Then
                                      Set Portc.0
                                      Flag1000 = 1
                                      Waitms 25
                                     Else
                                      Flag1000 = 0
                                      Reset Portc.0
                                      waitms 25
                                     End If
                                   End If
                                
                                   If Pinb.0 = 0 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                                     If Flag0100 = 0 Then
                                      Set Portc.1
                                      Flag0100 = 1
                                      Waitms 25
                                     Else
                                      Flag0100 = 0
                                      Reset Portc.1
                                      waitms 25
                                     End If
                                   End If
                                
                                   If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                                     If Flag1100 = 0 Then
                                      Set Portc.2
                                      Flag1100 = 1
                                      Waitms 52
                                       Enable Timer2
                                       Start Timer2
                                     Else
                                      Flag1100 = 0
                                      Reset Portc.2
                                      Waitms 25
                                     End If
                                
                                   End If
                                
                                    If Flag1100 = 1 Then
                                
                                    End If
                                
                                   If Minutes = 5 Then
                                      Minutes = 0
                                      Stop Timer2
                                      Disable Timer2
                                      Flagtimer = 0
                                      Flag1100 = 0
                                      Reset Portc.2
                                   End If
                                
                                
                                
                                 Loop
                                
                                 End
                                 '================'
                                Timerr2:
                                Stop Timer2
                                Disable Timer2
                                Flagtimer = 1
                                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
                                
                                
                                 Enable Timer2
                                 Start Timer2
                                
                                
                                Return
                                یا بیاید از تایمر 1 استفاده کنید ، مثل این کد :

                                کد:
                                
                                $regfile = "m8def.dat"$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
                                Reset Portd.3
                                Config Debounce = 25
                                
                                
                                Enable Interrupts
                                
                                
                                Config Timer1 = Timer , Prescale = 64
                                On Timer1 Timerr2
                                Stop Timer1
                                Disable Timer1
                                
                                
                                
                                
                                Dim Sarriz As Integer
                                Dim Seconds As Byte
                                Dim Minutes As Byte
                                Dim Flagtimer As Bit
                                Dim Flag1000 As Bit
                                Dim Flag0100 As Bit
                                Dim Flag1100 As Bit
                                '==========================================================================='
                                Do
                                
                                
                                
                                
                                   If Pinb.0 = 1 And Pinb.1 = 0 And Pinb.2 = 0 And Pinb.3 = 0 Then
                                     If Flag1000 = 0 Then
                                      Set Portc.0
                                      Flag1000 = 1
                                      Waitms 25
                                     Else
                                      Flag1000 = 0
                                      Reset Portc.0
                                      waitms 25
                                     End If
                                   End If
                                
                                   If Pinb.0 = 0 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                                     If Flag0100 = 0 Then
                                      Set Portc.1
                                      Flag0100 = 1
                                      Waitms 25
                                     Else
                                      Flag0100 = 0
                                      Reset Portc.1
                                      waitms 25
                                     End If
                                   End If
                                
                                   If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 0 And Pinb.3 = 0 Then
                                     If Flag1100 = 0 Then
                                      Set Portc.2
                                      Flag1100 = 1
                                      Waitms 52
                                       Enable Timer1
                                       Start Timer1
                                     Else
                                      Flag1100 = 0
                                      Reset Portc.2
                                      Waitms 25
                                     End If
                                
                                   End If
                                
                                    If Flag1100 = 1 Then
                                
                                    End If
                                
                                   If Minutes = 10 Then
                                      Minutes = 0
                                      Stop Timer1
                                      Disable Timer1
                                      Flagtimer = 0
                                      Flag1100 = 0
                                      Reset Portc.2
                                   End If
                                
                                
                                
                                 Loop
                                
                                 End
                                 '================'
                                Timerr2:
                                
                                Flagtimer = 1
                                Incr Sarriz
                                
                                If Sarriz = 1 Then
                                      Incr Seconds
                                      If Seconds = 1 Then
                                       Incr Minutes
                                       If Minutes = 244 Then Minutes = 0
                                       Seconds = 0
                                      End If
                                      Sarriz = 0
                                   End If
                                
                                
                                
                                
                                
                                
                                Return
                                من کد دوم رو پیشنهاد میکنم .
                                دقت کنید فیوز بیت های میکرو رو باید در کد اول به فرکانس 1 مگ تغییر بدید.و زمان 5 دقیقه رو باید بدست بیارید.
                                اینم دقت کنید که کدتون نباید از زمان سرریز شدن میکرو تجاوز کنه. یعنی نباید زیاد کد بنویسید.
                                میتونید با تغییرات به هدفتون برسید ، نیاز به لیبل ندارید ، ادامه همین کد با اضافه کردن if میتونید به آخرین شرطتون هم برسید.

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

                                دیدگاه

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