اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی

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

    مشکل در برنامه نویسی

    سلام دوستان

    من کد زیر رو می نویسم نباید موتورهام بچرخه ولی می چرخه ! مشکل از کجاست؟

    کد:
    کد:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 32                        ' default use 32 for the hardware stack
    $swstack = 10                        'default use 10 for the SW stack
    $framesize = 40                       'default use 40 for the frame space
    
    
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Declare Sub Motor_right(byval Var As Byte)
    Declare Sub Motor_left(byval Var As Byte)
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Config Portd.0 = Output
    Config Portd.1 = Output
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portc = Input
    Config Porta = Input
    Config Portb = Input
    Config Portd.7 = Input
    Config Portd.6 = Input
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Mr0 Alias Portd.2
    Mr1 Alias Portd.3
    Ml0 Alias Portd.1
    Ml1 Alias Portd.0
    Speed_r Alias Pwm1a
    Speed_l Alias Pwm1b
    
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Speed_r = 255
    Speed_l = 200
    
    
    
    
    
    
    
    
    
    
    
    
    '//////////////////////////////////////////////////////////////////////////////
    Sub Motor_right(var As Byte)
      Select Case Var
     Case 1:                          '// jolo
       Set Mr0
       Reset Mr1
      Case 2:                         '// stop
       Set Mr0
       Set Mr1
      Case 3:                         '// aghab
       Reset Mr0
       Set Mr1
      End Select
    End Sub
    Sub Motor_left(var As Byte)
      Select Case Var
      Case 3:                         '// aghab
       Set Ml0
       Reset Ml1
      Case 2:                         '// stop
       Set Ml0
       Set Ml1
      Case 1:                         '// jolo
       Reset Ml0
       Set Ml1
      End Select
    End Sub
    این هم شماتیک :

    http://uploadtak.com/viewer.php?file=u387_546.png


    اگه کد اشتباه هست راهنماییم کنید
    مرسی از دوستان
    Sometimes life's going to hit you in the head with a brick. Don't lose faith
    Steven Paul Jobs
    --------------------------------------------------------------
    aH ProgrammeR

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

    تقریبا چیزی از بیسیک یادم نمونده اما تو برنامت متغیرها یی مثل mr1 و کجا تعریف کردی و مقدارشونو چی گذاشتی بعد هم تو برنامت بهتره وقتی به یه پین از میکرو یه اسم تخصیص میدی از طریق همون اسم هم مقدار دهی کنی
    نکته بعدی راجع به نویزهاست مثلا اگه تو کانفیگ وقفه هارو فعال کرده باشی و تو مدار چیزی بهشون متصل نباشه میکرو قاطی میکنه و غیره ... موفق باشی
    mer30

    دیدگاه


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

      سلام
      لطفا میشه بهم کمک کنید چند روزه هر کاری می کنم به نتیجه نمی رسم :
      چرا در برنامه زیر وقتی که در IF مقدار A=100 قرار می دهم متغییر S دقیقا ثانیه شمار میشه ولی اگر A=1000 قرار بدهم هر چند ثانیه متغییر S یکی اضاف میشه در صورتی که باید 1000 باشه تا ثانیه شما بشود. لطفا یه نگاه به برنامه کنید و بهم بگید خیلی درگیرشم.


      [tt]$regfile = "m32def.dat"
      $crystal = 8000000
      Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = _
      Porta.6 , Db7 = Porta.7 , E = Porta.2 , Rs = Porta.3
      Config Lcd = 16 * 2
      '............................................ ..
      Dim Timer_val As Integer
      Dim Ch As Bit
      Dim A As Integer
      Dim S As Integer
      Dim M As Integer
      Dim H As Byte
      Cursor Off : Cls : Locate 1 , 6 : Lcd "start"
      '............................................ ....
      Config Timer1 = Timer , Prescale = 8
      Enable Interrupts
      Enable Timer1
      On Timer1 Sho

      '------------------------------------------------------------------
      Do
      Ch = 0
      Timer1 = 64536
      Start Timer1
      Lin:
      If Ch = 0 Then Goto Lin
      M = M + 1
      Locate 2 , 1
      Lcd "M= " ; M
      Loop
      '-------------------------------------------------------------------

      End 'end program


      Sho:
      Stop Timer1
      Ch = 1
      A = A + 1
      If A = 1000 Then
      S = S + 1
      A = 0
      End If
      Locate 2 , 8
      Lcd "S= " ; S

      Return[/tt]

      دیدگاه


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

        با سلام

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

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

        این Timer1 = 64536 رو بزار توی روتین وقفه، اون استوپ رو از داخل روتین وقفه بردار و اون استارت تو لوپ رو هم بزارش قبل از لوپ. و یه چیز دیگه روتین وقفه جای صدا زدن تابع نیست!!! اون تابع LCD رو با یه ترفندی بیار بیرون، تو روتین وقفه فقط متغیر ها رو صفر و یک کن.

        دیدگاه


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

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

          من تغییراتی رو که گفتید انجام دادم درست شد . ممنننننونمممممم :nice: :nice: :nice:
          :applause: :applause:

          این هم برنامه ای که با تغییراتی که شما گفته بودید :biggrin: :


          $regfile = "m32def.dat"
          $crystal = 8000000
          Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = _
          Porta.6 , Db7 = Porta.7 , E = Porta.2 , Rs = Porta.3
          Config Lcd = 16 * 2
          '............................................ ..
          Dim Timer_val As Integer
          Dim Ch As Bit
          Dim A As Integer
          Dim S As Integer
          Dim M As Integer
          Dim H As Byte
          Cursor Off : Cls : Locate 1 , 6 : Lcd "start"
          '............................................ ....
          Config Timer1 = Timer , Prescale = 8
          Enable Interrupts
          Enable Timer1
          On Timer1 Sho

          Start Timer1
          '------------------------------------------------------------------
          Do
          Ch = 0
          Lin:
          If Ch = 0 Then Goto Lin
          M = M + 1
          Locate 2 , 1
          Lcd "M= " ; M

          Locate 2 , 8
          Lcd "S= " ; S

          Loop
          '-------------------------------------------------------------------

          End 'end program


          Sho:
          Timer1 = 64536
          Ch = 1
          A = A + 1
          If A = 1000 Then
          S = S + 1
          A = 0
          End If


          Return

          دیدگاه


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

            البته منظورم من "پست مشابه" تو این تاپیک بود نه یه "تاپیک مشابه"، بگذریم.

            خوب برنامه که به نظرم درسته، اما مشکوک به این هست که فرکانس اصلی کار میکرو 8 مگ نیست و 1 مگ هست فیوز بیت ها رو درست تنظیم کردید؟

            دیدگاه


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

              درود برشما
              من خودم هم شک کردم ...
              من از کریستال داخلی که کار می کنم یعنی رو 8 مگ تنظیم می کنم درست کار می کنه ولی اگه بخوام از کریستال خارجی استفاده کنم خیلی خطا داره !!! کمتر از یک ثانیه می شه ....
              این عکس رو ببین به نظر شما با کریستال خارجی 8 مگ کدوم گزینه رو انتخاب کنم.؟
              ممنمونم آقا مجتبی گل
              http://s5.picofile.com/file/8110422584/crystal.png

              دیدگاه


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

                یک از اون high freq ها رو انتخاب کن.

                دیدگاه


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

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

                  دیدگاه


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

                    زیاد فرقی نمیکنه ولی دیتا شیت گفته که اون دو تای اول مناسب کریستال اوسیلاتور نیستن. اونایی که بعلاوه صفر هستن هم باید bod فعال باشه که اگه بهش دست نزده باشی فعال هست پس یکی رو به غیر از اون 2 تا اولی انتخاب کن.

                    دیدگاه

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