اطلاعیه

Collapse
No announcement yet.

ارتباط سریال با وقفه در بسکام

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

    #31
    پاسخ : ارتباط سریال با وقفه در بسکام


    یعنی با برنامه ای که شما گذاشتین میشه یه اسم چند حرفی رو گرفت و برگشت به do loop ?
    من فقط گیرم اینه که بتونم یه اسم (متغیر استرینگ) رو از اونور ارسال کنم و اینور بگیرم ؟
    http://www.eca.ir/forum2/index.php/topic,10159.0.html

    دیدگاه


      #32
      ارسال سریال با وقفه در بسکام

      1- تو این فروم همه در مورد وقفه دریافت سریال صحبت کردن ولی در مورد وقفه ارسال صحبتی نشده.میخوام 512 بایت داده رو روی پورت سریال با بافر بصورت وقفه ای بفرستم .یعنی میخوام یک آرایه 512 تایی رو با دیتا پر کنم و دستور ارسال اون رو به usart بدم و توی روتین برنامه به اجرای ادامه دستورات بپردازم تا زمانیکه این 512 بایت ارسال بشه و میکرو وقفه بده که ارسال تموم شده و ادامه دیتا ها رو دوباره توی آرایه قرار بدم تا ارسال بشه.چه جوری میشه این کار رو کرد؟
      2- سرعت ارسال واسم خیلی مهمه.حداکثر سرعت ارسال با avr چقدره؟ دو بسکام زده تا 115000.ولی تو فروم های انگلیسی دیدم تا 450000 گفتن راحت جواب میده!
      3-تو بسکام چجوری میشه تعیین کرد که usart با سرعت دو برابر کار کنه؟ تو کدویژن هست ولی تو بسکام ندیدم
      4- ارتباط توی بسکام آسنکرون هست یا سنکرون؟ کامپایلر گزینه ای واسه این تنظیم نذاشته در حالیکه تو کدویژن این تنظیمات قابل انجامه!
      ممنوم

      دیدگاه


        #33
        پاسخ : ارتباط سریال با وقفه در بسکام

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

        دیدگاه


          #34
          ارتباط سریال با وقفه در بسکام

          سلام
          دوستان من یه کد دارم که یه رشته 20 تایی به نام آ‌آ‌Z رو دریافت میکنه (از یه میکروی دیگه) و روی LCD نشون میده. این برنامه با استفاده از وقفه سریال میپره به برنامه Getdata و رشته رو دریافت میکنه. برنامه رو پایین گذاشتم. اما مشکل اینجاست که برنامه رو Atmega8 خوب و راحت کار میکنه و کل 20 تا کاراکتر رو میگیره، اما رو Atmega32 فقط کاراکتر اول رشته دریافت میشه. کلی روش کار کردم اما هیچ نتیجه ای نگرفتم. ممکنه یه نگاهی بهش بندازین و راهنماییم کنین؟ ممکنه اشکال از فیوز بیت ها باشه؟ (فیوز بیت کلاک هر دو میکرو (ارسال کننده و دریافت کننده) رو 8 مگ داخلی تنظیم شده).
          ممنون از راهنماییتون

          کد:
          $regfile = "m32def.dat"
          $crystal = 8000000
          $baud = 19200
          $hwstack = 200
          $swstack = 60
          $framesize = 40
          
          On Urxc Getdata
          Enable Interrupts
          Enable Urxc
          
          Config Portb = Output
          Config Portc.1 = Output
          Config Lcd = 16 * 2
          Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , Rs = Portb.0 , E = Portb.1
          
          Dim Z As String * 20
          Dim Buffer_recive As String * 20
          Dim Buffer_recive_temp As String * 20
          Dim Buffer_protect As Byte
          Dim Buffer_udr As Byte
          
          Cursor Off
          
          Do
          Loop
          End
          
          
          Getdata:
          
          Buffer_udr = Udr
          Buffer_protect = Buffer_protect + 1
          
          
          If Buffer_protect > 20 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)
          Z = Buffer_recive_temp
          End Select
          
          Cls
          Lcd Z
          
          Return
          Return
          تشکر نکن، صلوات بفرست:

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

          دیدگاه


            #35
            پاسخ : ارتباط سریال با وقفه در بسکام

            سلام
            کسی راهنمایی نمیکنه؟ :angry:
            تشکر نکن، صلوات بفرست:

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

            دیدگاه


              #36
              پاسخ : ارتباط سریال با وقفه در بسکام

              سلام .ببخشید اگه بخواهیم با ماژول هم کار کنیم باید از همین دستور ها تو ارتباط سریال استفاده کنیم؟

              دیدگاه


                #37
                پاسخ : ارتباط سریال با وقفه در بسکام

                نوشته اصلی توسط حسام هاشم نمایش پست ها
                سلام عزیز خسته نباشی :
                ببین عزیز وقتی میخوای از وقفه استفاده کنی یکی از بهترین حالتهاش اینکه وقتیه وقفه دریافت اتفاق میفته بیت دریافت وقفه رو غیر فعال کنی اینجوری :
                on urxc input_serial

                dim b as bit
                dim daryaft as byte

                do

                if b=1 then

                b=0
                اینجا میتونی از متغیر dryaft استفاده کنی
                ucr.rxen=1
                end if
                loop

                input_serial:
                dryaft=udr
                b=1
                ucr.rxen=0
                return
                زمانیکه دریافت صورت میگیره بیت usr.rx فعال میشه و تا زمانیکه بافر udr خونده نشه وقفه دریافت اجرا میشه واگه تو وقفه دریافتتون یه شمانده بذارین متوجه میشین که با یه بار ارسال از فرستنده نزدیک به چهار بار یا بیشتر وقفه دریافتتون اجرا میشه و حقیقت امر اینکه در اولین بار udr مقدار واقعی دریافت شده رو داره و در دفعات بعد مقدارش نامعتبر هست واسه همین اگه با اولین دریافت گیرنده سریال رو بعد از اولین بار خوندن غیر فعال کنین از چندین بار اجرا شدن وقفه دریافت جلوگیری میکنین و بعد از اینکه کارتون با udr تموم شد دوباره اون بیت رو یک میکنین تا واسه دریافتهای بعد اماده باشه
                در مورد اینکه بخواین یه کلمه رو ارسال کنین هم تا اونجا که من میدونم بعد از دستور input باید بگین که منتظر چند حرف هستین مثلا اگه منتظرر ali هستین متغیر رو سه با دامنه سه تعریف میکنین و بعد از input و
                ali عدد سه رو بذارین تا اون بدونکه باید نمتظر سه حرف بمونه و بعد از دستور input خارج بشه
                این دستور input رو چک نکردم اما وقفه رو تضمین میکنم اما واست مهم هست بگو تا input رو هم انجام بدم و نتیجه اون رو واست بگم
                دلتون شاد وقتتون خوش
                ا سلام و ممنون از راهنماییتون منم مشکلی شبیه اینو دارم که با مگا8عدد 5رو ارسال میکنم ولی در طرف مقابل عدد10 رو نشون میدادو هر عدد دیگه هم میدادم همین عدد رو نشون میداد با این برنامه شما حالا عدد53رو نشون میده وقتی 1رو ارسال میکنم عدد49 باید چکار کنم مشکل کجاس؟
                این برنامه فرستنده
                $regfile = "m8def.dat"
                $crystal = 11059200
                $baud = 9600

                Config Portc.5 = Output
                Config Portd.2 = Output
                Config Pinb.0 = Input
                Dim A As Byte , W As Word

                Portd.2 = 1
                Dataselect Alias Portd.2
                A = 5


                Do

                If Pinb.0 = 0 Then Print A

                Loop
                End
                اینم گیرنده
                $regfile = "m16def.dat"
                $crystal = 11059200
                $baud = 9600

                Config Porta = Output
                Config Portb.1 = Output

                Config Lcdpin = Pin , Db4 = Pinb.5 , Db5 = Pinb.4 , Db6 = Pinb.3 , Db7 = _
                Pinb.2 , Rs = Pinb.7 , E = Pinb.6
                Config Lcd = 16 * 2

                Enable Interrupts
                Enable Urxc
                On Urxc Data_resive

                Dim A As Byte , B As Byte
                Dim Temp As String * 10
                Dim Temp2 As String * 10
                Portb.1 = 0
                A = 0
                Cls : Home
                Lcd A

                do

                if b=1 then
                Home : Lcd A
                B = 0
                Ucr.rxen = 1
                end if

                loop

                Data_resive:
                A = Udr
                b=1
                ucr.rxen=0
                Return
                { خلاف قوانین - پاک شد }

                دیدگاه

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