اطلاعیه

Collapse
No announcement yet.

استفاده از 2 UART

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

    استفاده از 2 UART

    سلام

    آقا با چه دستوری میشه از دو تا uart استفاده کرد؟
    مثلا در mega128 که دو تا uart داره با چه دستوری میشه فرستاد یا دریافت کرد؟
    یدونه pirnt بود که برای یک uart استفاده میشود !

    و سوال دوم آیا میشه دوتا پورت سریال رو با یک uart کنترل کرد؟

    #2
    پاسخ : استفاده از 2 UART

    $regfile = "m128def.dat" ' specify the used micro
    $crystal = 4000000 ' used crystal frequency
    $baud = 19200 ' use baud rate
    $baud1 = 19200
    'when CONFIG COMx is not used, the default N,8,1 will be used
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    'try the second hardware UART
    Open "com2:" For Binary As #1
    Config Portf = Output
    Print "Hello"
    Dim B As Byte
    Do
    Input "test serial port 0" , B
    Print B
    Print #1 , "test serial port 2"
    Loop
    Close #1
    End
    اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

    دیدگاه


      #3
      پاسخ : استفاده از 2 UART

      سلام
      آقا ممنون از جوابت.

      یه سوال دیگه هم داشتم.

      من میخوام چندتا کاراکتر رو که از پورت سریال وارد میشه رو داخل یک آرایه بریزم.

      مثلا میخوام کاراکترهای 'Hossein' که از پورت سریال وارد میشه رو داخل آرایه S*10 بریزم.

      چندتا سوال برام پیش اومده

      1.آیا اگه از وقفه استفاده کنم و کل مقدار ورودی رو مساوی آرایه قرار دهم این کار اتوماتیک وار انجام خواهد شد؟یعنی کاراکتر Hossein به ترتیب از اول تا انتهای آخرین کاراکتر بترتیب از S0 , s1 , s2 , s3 ,s4 , s5 , s6 قرار خواهد گرفت؟؟؟

      2.آیا اگر در داخل Label وقفه دستوراتی دیگری استفاه کنم این باعث از بین رفتن دیتا ارسال شده نمیگردد؟

      پیشاپش تشکر میکنم

      دیدگاه


        #4
        پاسخ : استفاده از 2 UART

        بیا اینم یه برنامه با وقفه سریال

        ' IN THE NAME OF GOD
        ' slave serial
        $regfile = "M32DEF.DAT"
        $crystal = 8000000
        $baud = 1200
        Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.0 , Rs = Porta.1
        Config Lcdbus = 4
        Config Lcd = 16 * 2
        Display On
        Cursor Off

        Config Timer0 = Timer , Prescale = 1024
        Enable Timer0
        On Ovf0 Ovf0flag
        Start Timer0

        Enable Serial
        On Urxc Serial_isr
        Enable Urxc

        Const Saeed = "SAEED BAGHERANI"
        Const Dataa = "Serial PROTECOL"
        Locate 1 , 1 : Lcd Saeed
        Locate 2 , 1 : Lcd Dataa
        Waitms 500
        Cls

        Dim A As Byte
        Dim B As Byte
        Dim K As Byte
        Dim Z As Byte
        Dim N As Byte
        Dim F As Byte
        Dim Neww As Bit
        Dim S As String * 16
        Dim Ss As String * 1
        Dim Ar(16) As Byte
        B = 13

        Print "saeed bagherani"
        Enable Interrupts
        Do
        Idle
        Loop
        End

        Ovf0flag:
        Stop Timer0
        If Neww = 1 Then
        Neww = 0
        Locate 1 , N
        Lcd Chr(ar(n))
        Print Chr(ar(n)) ;
        End If
        Start Timer0
        Return

        Serial_isr:
        Incr N
        Neww = 1
        If N > 16 Then
        N = 1
        Cls
        For F = 1 To 16
        Ar(f) = 0
        Next F
        End If
        Ar(n) = Udr
        Return
        اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

        دیدگاه


          #5
          پاسخ : استفاده از 2 UART


          سلام وقتتون بخیر و شادی .
          میبخشین وقتتون رو میگیرم .
          من با atmega 128 کار میکنم با نرم افزار بسکام . مشکل اینه که وقتی پورت سریال 1 رو کانفیگ میکنم به صورت سخت افزاری و در برنامه دستور print#1 رو مینویسم یایه ارسال داده در پورت سریال 0 به صروت خروجی فعال و یک میشود در حالی که من تمام پورت portE رو به صورت ورودی تعریف کردم .
          به دلیل شرایط سخت افزاری مجبور شدم از پورت 1 سریال 128 استفاده کنم .دلیل اینکه پایه tx0 یک میشود و به صورت خروجی فعال میشود رو نمیدونم
          ممنون میشم کمکم کنین تا دلیل این موضوع رو متوجه بشم که این دوتا پورت سریال که از هم مستقل هستند چرا همچین ناثیری پورت 1 در پورت 0 میذاره .
          سعی کردم کوتاه باشه تا وقتتون رو زیاد نگیره .نیاز به توضیح بیشتر هست بفرمایید .
          با تشکر فراوان منتظرم

          دیدگاه


            #6
            پاسخ : استفاده از 2 UART

            وقتی شما دستور $baud رو تعریف میکنی اون پایه به عنوان خروجی فعال میشه :nice:

            حالا شما به جای $BAUD = var باید از $BAUD1 = var استفاده کنی

            دیدگاه


              #7
              پاسخ : استفاده از 2 UART

              سلام اقا رضا :ممنون که جواب دادین
              این یه برنامه نمونه:میبخشین چون کپی کردم نامرتب شد. اگه نیازی هست واستون میل کنم .
              توی این برنامه من پورت portE رو به صورت ورودی تعریف کردم .که در صورت صفر شدن Pine.1 به مقدار متغیر اضافه میشه و بعد از اینکه به 100 رسید همون رو ارسال میکنه از پورت 1
              اما pine.1 هیچ وقت صفر نمیشه و همیشه به صورت خروجی 1 هست . با وجود اینکه من این پایه رو دستی با صفر تحریک میکنم اجرا نمیشهیکبار هم شرط صفر شدن این پایه اجرا نمیشه .
              اگر در برنامه دستور Print #1 , Test_input_pine_1 رو حذف کنم برنامه به صورت عادی عمل میکنه و با صفر شدن pine.1 به مقدار متغییر اضافه میشه .
              همینجور که اول برنامه هم توضیح دادم pine.1 پایه ارسال داده هست برای پورت 0 ( TXD.0 PinE.1 ) اما اینجا من از پورت 0 استفاده ای نکردم. نمیدونم دلیلش چیه که اگر این دستور
              Print #1 , Test_input_pine_1 هر کجای برنامه نوشته شود دیگر این پایه pine.1 به صورت خروجی فعال و دائم 1 میشود .

              کد:
                $prog &HFF , &H3F , &HCE , &HFF             ' generated. Take care that the chip supports all fuse bytes.
                regfile = "m128def.dat"$
                $crystal = 20000000
                $hwstack = 128                     ' default use 32 for the hardware stack
                $swstack = 128                     ' default use 10 for the SW stack
                $framesize = 256                    ' default use 40 for the frame space
              '/*********************************Config_LCD***********************************
              'LCD
                Config Lcdpin = Pin , Db4 = Pinf.7 , Db5 = Pina.0 , Db6 = Pina.2 , Db7 = Pina.1 , E = Pinf.5 , Rs = Pinf.6
                Config Lcd = 16 * 2
                Cls
              
                '(
                Pin_Lcd - name_pin   - Pin_atmega128
              
                 4     E      55_F.6
                 6     RS      56_F.5
                 11     DB4     54_F.7
                 12     DB5     51_A.0
                 13     DB6     49_A.2
                 14     DB7     50_A.1
              ')
               '/*********************************Config_SERIAL PORT**************************
              '(
              SERIAL PORT_1
              
                 Pin_Main_Bord  - name_pin   - Pin_atmega128
              
              
                   RXD.1      PinD.2     27
              
                   TXD.1      PinD.3     28
              '---------------------------------------------------------
              SERIAL PORT_0
                   RXD.0       PinE.0     2
              
                   TXD.0       PinE.1     3
              ')
              
               '---------------
                 Open "com1:" For Binary As #1
                On Urxc1 Input_serial
                Enable Urxc1
                $baud1 = 9600
                Enable Interrupts
              '/*********************************Config_Shasi Floor**************************
              
                Config Porte = Input
                Porte = 255 : Ddre = 0
              ' PULL-UP RESISTOR(NO EXTERNAL RESISTOR NEEDED)
              '/*********************************Config_LED_Shasi_OUT_FLoor*******************
                 Dim Test_input_pine_1 As Byte
                 Dim Recive_serial As Byte
              
                Do
              
                  If Pine.1 = 0 Then
                   Incr Test_input_pine_1 : Waitms 200
                  End If
                  Home : Lcd Test_input_pine_1 ; "^" ; Recive_serial ; "^"
                  If Test_input_pine_1 = 100 Then
                    Test_input_pine_1 = 0 : Print #1 , Test_input_pine_1
                  End If
              
              
                 Loop
              
              
              '/******************************************************************************
              
              Input_serial:
               Recive_serial = Udr1
              Return

              دیدگاه

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