اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه سریال atmega64

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

    مشکل با وقفه سریال atmega64

    سلام خدمت همه ی اساتید
    من دارم رو یه پروژه کار می کنم که از پورت سریا دوم atmega64 استفاده کردم
    الان نیاز دارم که هر وقت دیتا از کامپیوتر اومد یه سری دستورات اجرا کنه.اگه نیومد به کار خودش ادامه بده.بخاطر همین از وقفه سریال استفاده کردم ولی نتونستم ازش جواب بگیرم.
    با بسکام کد نویسی می کنم و اینم برنامه ای که نوشتم.لطفا اشکال کارمو بگین
    ممنون
    $regfile = "m64def.dat"
    $crystal = 8000000
    '------------------------------------------------LCD configuration------------------------------------
    Config Lcdpin = Pin , Db4 = Pina.4 , Db5 = Pina.5 , Db6 = Pina.6 , Db7 = Pina.7 , Rs = Pina.0 , E = Pina.2
    Config Lcd = 16 * 2
    '-----------------------------------------------------------------------------------------------------
    '------------------------------------------------Usart1 configuration---------------------------------
    $baud1 = 9600
    Open "COM2:" For Binary As #2
    '-----------------------------------------------------------------------------------------------------
    '---------------------------------------Variable between com & machin(serial interface)---------------
    Dim Code As String * 1
    Dim W1 As String * 1
    Dim W2 As String * 1
    Dim W3 As String * 1
    '-----------------------------------------------------------------------------------------------------

    Enable Interrupts
    Enable Urxc1
    On Serialin

    Do
    Mainprog:


    Locate 1 , 1
    Lcd "It,s OK"
    'wait 1

    Loop
    End 'end program



    '------------------------------Functions-----------------------------------------------------------------
    'get data from pc to changing mode --------------------------------------
    Serialin:
    Cls
    Lcd "ok"
    Input #2 , Code
    Wait 1
    Return
    "لحظه پيروزي از آن جهت برايم شيرين است که ملت کشورم را در آرامش و شادي ببينم"
    نادر شاه

    #2
    پاسخ : مشکل با وقفه سریال atmega64

    ببینید دوست عزیز وقفه سریال به این صورت است

    On Urxc Getdata
    Enable Interrupts
    Enable Urxcetdata

    get data
    Input S
    حالا میتونید از متغیری که وارد s شده استفاده کنید

    دیدگاه


      #3
      پاسخ : مشکل با وقفه سریال atmega64

      ببخشید اشتباه تایپی رخ داده به صورت زیر اصلاح میکنم
      On Urxc Getdata
      Enable Interrupts
      Enable Urxc

      get data
      Input S

      دیدگاه


        #4
        پاسخ : مشکل با وقفه سریال atmega64

        چک کردم.اصلا وارد قسمت وقفه نمی شه.تو وقفه گفتم کلمه ی OK چاپ بشه که همچین اتفاقی نمی افته!
        "لحظه پيروزي از آن جهت برايم شيرين است که ملت کشورم را در آرامش و شادي ببينم"
        نادر شاه

        دیدگاه


          #5
          پاسخ : مشکل با وقفه سریال atmega64

          جواب داد ممنون
          منم اشکال تایپی داشتم
          "لحظه پيروزي از آن جهت برايم شيرين است که ملت کشورم را در آرامش و شادي ببينم"
          نادر شاه

          دیدگاه


            #6
            پاسخ : مشکل با وقفه سریال atmega64

            شما در ارتباط با کامپیوتر باید از واسط RS232 استفاده کنید تا سطح ولتاژ یکی شود
            در ضمن اگر میخواهید دو میکرو را به هم ارتباط دهید حتما باید کریستال و باوود یکی باشند
            تا اونجا هم که میتونید باوود و کم انتخاب کنید :nice:

            دیدگاه


              #7
              پاسخ : مشکل با وقفه سریال atmega64

              نوشته اصلی توسط احمد سمیعی
              جواب داد ممنون
              منم اشکال تایپی داشتم
              آقا میشه بگی چطوری درست شد؟

              دیدگاه


                #8
                پاسخ : مشکل با وقفه سریال atmega64

                دقیقا همون کاری که آقای soh3il فرمودند انجام دادم.
                فقط چون از پورت سریال دوم atmega64 استفاده کردم urxc رو به urxc1 تغییر دادم همین.
                "لحظه پيروزي از آن جهت برايم شيرين است که ملت کشورم را در آرامش و شادي ببينم"
                نادر شاه

                دیدگاه


                  #9
                  پاسخ : مشکل با وقفه سریال atmega64

                  استفاده از دستور Input S در زیر برنامه وقفه کاره درستی نیست چون در این حالت برای اتمام این دستور و برگشت از زیر برنامه وقفه حتما باید کارکتر اینتر دریافت بشه و اگه در حین ارسال ارتباط قطع بشه یا کاراکتر اینتر دریافت نشه برنامه گیر میکنه

                  دیدگاه


                    #10
                    پاسخ : مشکل با وقفه سریال atmega64

                    نوشته اصلی توسط mahdi421
                    استفاده از دستور Input S در زیر برنامه وقفه کاره درستی نیست چون در این حالت برای اتمام این دستور و برگشت از زیر برنامه وقفه حتما باید کارکتر اینتر دریافت بشه و اگه در حین ارسال ارتباط قطع بشه یا کاراکتر اینتر دریافت نشه برنامه گیر میکنه

                    خوب راه حلش چیه عزیز؟
                    تشكر نكن، صلوات بفرست:

                    [img width=165 height=100]http://www.askdin.com/gallery/images/29839/1___________5.png[/img]

                    دیدگاه


                      #11
                      پاسخ : مشکل با وقفه سریال atmega64

                      نوشته اصلی توسط نعمت الهیان

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

                      این مثال رو تست کنید امیدوارم مشکلتون رو حل کنه
                      تو این مثال انتهای رشته دریافتی با کاراکتر شماره 13 مشخص شده و با دریافت این کاراکتر کل رشته دریافتی تو متغییر Buffer_recive قرار میگیره


                      کد:
                      $regfile = "m32def.dat"
                      $crystal = 14745600
                      $hwstack = 100
                      $swstack = 100
                      $framesize = 100
                      
                      Dim Buffer_recive As String * 50
                      Dim Buffer_recive_temp As String * 50
                      Dim Buffer_protect As Byte
                      Dim Buffer_udr As Byte
                      
                      $baud = 9600
                      On Urxc Rxc_isr
                      Enable Urxc
                      
                      
                      
                      Enable Interrupts
                      
                      
                      Do
                      Loop
                      
                      
                      
                      End
                      
                      
                      
                      
                      
                      
                      
                      
                      
                      
                      
                      
                      Rxc_isr:
                      
                      
                      Buffer_udr = Udr
                      Buffer_protect = Buffer_protect + 1
                      
                      
                      If Buffer_protect > 50 Then
                        Buffer_protect = 0
                        Buffer_recive_temp = ""
                        Buffer_recive = ""
                      End If
                      
                      
                      
                      
                      
                      Select Case Buffer_udr
                      
                        Case 13:
                      
                         Buffer_recive = Buffer_recive_temp
                         Buffer_recive_temp = ""
                         Buffer_protect = 0
                      
                        Case 10:
                      
                        Case Else:
                      
                           Buffer_recive_temp = Buffer_recive_temp + Chr(buffer_udr)
                      
                      End Select
                      
                      
                      
                      Return
                      Return

                      دیدگاه


                        #12
                        پاسخ : مشکل با وقفه سریال atmega64

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

                        این مثال رو تست کنید امیدوارم مشکلتون رو حل کنه
                        تو این مثال انتهای رشته دریافتی با کاراکتر شماره 13 مشخص شده و با دریافت این کاراکتر کل رشته دریافتی تو متغییر Buffer_recive قرار میگیره


                        کد:
                        $regfile = "m32def.dat"
                        $crystal = 14745600
                        $hwstack = 100
                        $swstack = 100
                        $framesize = 100
                        
                        Dim Buffer_recive As String * 50
                        Dim Buffer_recive_temp As String * 50
                        Dim Buffer_protect As Byte
                        Dim Buffer_udr As Byte
                        
                        $baud = 9600
                        On Urxc Rxc_isr
                        Enable Urxc
                        
                        
                        
                        Enable Interrupts
                        
                        
                        Do
                        Loop
                        
                        
                        
                        End
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        Rxc_isr:
                        
                        
                        Buffer_udr = Udr
                        Buffer_protect = Buffer_protect + 1
                        
                        
                        If Buffer_protect > 50 Then
                          Buffer_protect = 0
                          Buffer_recive_temp = ""
                          Buffer_recive = ""
                        End If
                        
                        
                        
                        
                        
                        Select Case Buffer_udr
                        
                          Case 13:
                        
                           Buffer_recive = Buffer_recive_temp
                           Buffer_recive_temp = ""
                           Buffer_protect = 0
                        
                          Case 10:
                        
                          Case Else:
                        
                             Buffer_recive_temp = Buffer_recive_temp + Chr(buffer_udr)
                        
                        End Select
                        
                        
                        
                        Return
                        Return
                        سلام. بله، واقعا گیر بودم واسه همون اینقدر جا نوشتم، شرمنده :redface: :redface:
                        داداش واقعا دستت درد نکنه، خدا حفظت کنه، خدا عمرت بده، یه گره گنده از کار من باز کردی، امیدوارم همیشه موفق و پیروز باشی، خدا مراد دلتو بده. خلاصه دمت گرم، مشکل منو گشودی، خدا همه ی مشکلاتتو بگشایه :job:
                        خیلی آقایی. بازم متشکرم
                        تشكر نكن، صلوات بفرست:

                        [img width=165 height=100]http://www.askdin.com/gallery/images/29839/1___________5.png[/img]

                        دیدگاه


                          #13
                          پاسخ : مشکل با وقفه سریال atmega64

                          سلام آقا مهدی
                          ببخشید که مجدد مزاحمت میشم.
                          این برنامه ای که گذاشته بودی رو من با پروتئوس تست کردم و خیلی خوب جواب داد، اما فرصت نشده بود عملی تستش کنم. الان 3 روزه از مگا 8 و 16 بگیر تا 32، با هرکدوم که تست میکنم جواب یکسان میگیرم و دیتا درست دریافت نمیشه :angry: دیتایی که من فرستادم یه رشته 28 کاراکتری بود که از این بین فقط 15-16تاش تازه اونم ناقص میرسه. تو برنامه ای هم که شما دادی هیچ تغییری ندادم غیر اینکه کریستال رو 8 مگ داخلی کردم و باودریتو 19200، همین. ممکنه یه راهنمایی بکنی؟
                          راستی فیوز بیت ها رو هم اینطوری تنظیم کردم:

                          مرسی
                          تشكر نكن، صلوات بفرست:

                          [img width=165 height=100]http://www.askdin.com/gallery/images/29839/1___________5.png[/img]

                          دیدگاه


                            #14
                            پاسخ : مشکل با وقفه سریال atmega64

                            سلام

                            مشکل شما مقدار کریستال هست که استفاده کردین
                            روی آی سی atmega8 من هم با کریستال داخلی 8 Mhz نتونستم جواب بگیریم و کاراکترها نامرتب ارسال میشدند در هر صورت با استفاده ار کریستال خارجی مناسب مثل 7.3728MHZ یا 11.059MHZ یا 15.360MHZ مشکل حل میشه
                            ( مقدار فرکانس کریستال وقتی تقسیم به 16 میکنید باید باقی مانده صفر بشه)

                            دیدگاه


                              #15
                              پاسخ : مشکل با وقفه سریال atmega64

                              نوشته اصلی توسط mahdi421
                              سلام

                              مشکل شما مقدار کریستال هست که استفاده کردین
                              روی آی سی atmega8 من هم با کریستال داخلی 8 Mhz نتونستم جواب بگیریم و کاراکترها نامرتب ارسال میشدند در هر صورت با استفاده ار کریستال خارجی مناسب مثل 7.3728MHZ یا 11.059MHZ یا 15.360MHZ مشکل حل میشه
                              ( مقدار فرکانس کریستال وقتی تقسیم به 16 میکنید باید باقی مانده صفر بشه)
                              سلام
                              داداش بازم نشد :angry: با کریستال خارجی 11059200 هم تست کردم نشد... :cry2:
                              تشكر نكن، صلوات بفرست:

                              [img width=165 height=100]http://www.askdin.com/gallery/images/29839/1___________5.png[/img]

                              دیدگاه

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