اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی با باسکام و 0و1 کردن پورتها

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

    مشکل در برنامه نویسی با باسکام و 0و1 کردن پورتها

    سلام دوستان. الان یه مشکل دارم که داره کلافم میکنه :angry:
    من یه برنامه برای ربات نوریاب نوشتم اما پورتهای مورد نظرم بصورت چشمکزن(0 1 0 1) میشن و بصورت کامل 0 یا 1 نمیشن.البته فکرکنم مربوط به do و loop ها باشه اما نتونستم پیداشون کنم. اینم برنامه (به ساب straight توجه شود بقیه ساب ها کامل نیست):'************************************** ****************************************'
    '*Project: Light follower with Atmega32 *'
    '*Authour:Alireza Rezayi. *'
    '*Sensor Type:4 LDR with 4 different position *'
    '*MotorC with L298 Driver *'
    '******************************************** **********************************'
    $regfile = "m32def.dat"
    $crystal = 4000000
    '**********************************config**** **********************************'
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Config Portb.0 = Output
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
    Config Lcd = 16 * 2
    '**********************************Define**** **********************************'
    Dim Sf As Word
    Dim Sb As Word
    Dim Sl As Word
    Dim Sr As Word
    M1p Alias Pinb.0
    M1n Alias Pinb.1
    M2p Alias Pinb.2
    M2n Alias Pinb.3
    Ledf Alias Pinb.4
    Ledb Alias Pinb.5
    Ledl Alias Pinb.6
    Ledr Alias Pinb.7
    Declare Sub Main
    Declare Sub Straight
    Declare Sub Backward
    Declare Sub Turnl
    Declare Sub Turnr
    '***********************************Main***** **********************************'
    Sub Main
    Start Adc
    Do
    Sf = Getadc(0)
    Sb = Getadc(1)
    Sl = Getadc(2)
    Sr = Getadc(3)
    If Sf > 500 And Sb > 500 Then
    Cursor Off
    Lcd "Error"
    Waitms 250
    Cls
    End If
    If Sr > 500 And Sl > 500 Then
    M1p = 0
    M1n = 0
    M2p = 0
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 0
    Ledr = 0
    Cursor Off
    Lcd "Error"
    Waitms 250
    Cls
    End If
    If Sf > 500 And Sl > 500 Then
    M1p = 0
    M1n = 0
    M2p = 0
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 0
    Ledr = 0
    Cursor Off
    Lcd "Error"
    Waitms 250
    Cls
    End If
    If Sf > 500 And Sr > 500 Then
    M1p = 0
    M1n = 0
    M2p = 0
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 0
    Ledr = 0
    Cursor Off
    Lcd "Error"
    Waitms 250
    Cls
    End If
    If Sb > 500 And Sl > 500 Then
    M1p = 0
    M1n = 0
    M2p = 0
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 0
    Ledr = 0
    Cursor Off
    Lcd "Error"
    Waitms 250
    Cls
    End If
    If Sb > 500 And Sr > 500 Then
    M1p = 0
    M1n = 0
    M2p = 0
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 0
    Ledr = 0
    Cursor Off
    Lcd "Error"
    Waitms 250
    Cls
    End If
    If Sf > 500 Then
    Lcd "Straight"
    Waitms 250
    Cls
    Call Straight
    End If
    If Sb > 500 Then
    Call Backward
    Lcd "Backward"
    Waitms 250
    Cls
    End If
    If Sl > 500 Then
    Call Turnl
    Lcd "Turn Left"
    Waitms 250
    Cls
    End If
    If Sr > 500 Then
    Call Turnr
    Lcd "Straight"
    Waitms 250
    Cls
    End If
    Loop
    End Sub
    '***********************************Straight* **********************************'
    Sub Straight
    Do
    If Sb > 500 Then Call Main
    If Sl > 500 Then Call Main
    If Sr > 500 Then Call Main
    If Sf > 500 Then
    M1p = 1
    M1n = 0
    M2p = 1
    M2n = 0
    Ledf = 1
    Ledb = 0
    Ledl = 0
    Ledr = 0
    Return
    End If
    Loop
    End Sub
    '**********************************Backward** **********************************'
    Sub Backward
    If Sf > 500 Then Call Main
    If Sl > 500 Then Call Main
    If Sr > 500 Then Call Main
    M1p = 0
    M1n = 1
    M2p = 0
    M2n = 1
    Ledf = 0
    Ledb = 1
    Ledl = 0
    Ledr = 0
    Lcd "Backward"
    Waitms 250
    Cls
    Return
    End Sub
    '*********************************Turn Left************************************'
    Sub Turnl
    If Sf > 500 Then Call Main
    If Sb > 500 Then Call Main
    If Sr > 500 Then Call Main
    M1p = 1
    M1n = 0
    M2p = 0
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 1
    Ledr = 0
    Lcd "Turn Left"
    Waitms 250
    Cls
    Return
    End Sub
    '********************************Turn Right************************************'
    Sub Turnr
    If Sf > 500 Then Call Main
    If Sb > 500 Then Call Main
    If Sl > 500 Then Call Main
    M1p = 0
    M1n = 0
    M2p = 1
    M2n = 0
    Ledf = 0
    Ledb = 0
    Ledl = 0
    Ledr = 1
    Lcd "Turn Right"
    Waitms 250
    Cls
    Return
    End Sub
    '******************************************** **********************************'
    End

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

    باید پین ها رو به صورت پورت خروجی تعریف کنید و پورت رو صفر و یک کنید
    بجای
    Led alias pinb.0
    Led aluas portb.0
    در صمن باید ا ون پین یا مینها به صورت خروجی تعریف بشن که در این برنامه فقط یکیشون خروجی تعریف شده
    به همین راحتی :nice:



    : :razz:
    اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

    دیدگاه


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

      سلام
      شما اول برنامه فقط یه پین رو خروجی کردی که باید کل پرت رو خروجی کنی
      درستورات تغییر نام درست هست
      داخل برنامه برای پین از 0و یا 1 استفاده کردی که باید از دستور ست و ریست استفاده کنی
      در ضمن اینم بگم در بعضی از موارد به علل مختلف از جمله ایرادات طراحی و یا ایرادات برنامه وقتی از مقدار adc برای کنترل وضعیت خروجی استفاده میشه .خروجی ها حالتی ناپایدار و رندم پیدا میکنن که این ایراد بیشتر برمیگرده به شماتیک و خود adc
      روزی که درک کردیم همه چیز به خدا تعلق دارد . آن روز .روز طلوع دانش است

      دیدگاه


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

        1. همونطور که دوستان گفتن ، شما فقط پین b.0 رو خروجی کردی و تکلیف بقیه ی پین های این پورت نامشخصه
        2. توی بسکام شما باید پین های خروجی رو به اسم port صدا کنی ، مثلا باید بنویسی portb.1=1 ، وگرنه خروجی قابل پیشبینی نیست
        3. هیچ موقع حتی زمانیکه از ADC استفاده نمیکنی ، پایه ی Vref رو بلا تکلیف نزار

        موفق باشی

        دیدگاه


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

          سلام دوستان
          نخواستم تاپیک جدید بزنم
          می خواستم یه ال ای دی رو به صورت چشمک زن تو برنامه ربات مسیر یاب جا بدم
          طوری که ربات همین طور که رو مسیر میره یه ال ای دی هم چشمک بزنه متاسفانه نتونستم برنامش رو بنویسم کسی از دوستان می تونه برای برنامش منو راهنمایی کنه؟

          دیدگاه


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

            نوشته اصلی توسط 马吉德
            سلام دوستان
            نخواستم تاپیک جدید بزنم
            می خواستم یه ال ای دی رو به صورت چشمک زن تو برنامه ربات مسیر یاب جا بدم
            طوری که ربات همین طور که رو مسیر میره یه ال ای دی هم چشمک بزنه متاسفانه نتونستم برنامش رو بنویسم کسی از دوستان می تونه برای برنامش منو راهنمایی کنه؟
            با این توضیحات کم فکر نکنم کسی بتونه کمکت کنه حداقل شماتیک و برنامه ای رو که نوشتی بزار
            روزی که درک کردیم همه چیز به خدا تعلق دارد . آن روز .روز طلوع دانش است

            دیدگاه


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

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

              دیدگاه

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