اطلاعیه

Collapse
No announcement yet.

فرق I2C و I2C دو سیمه در کدویژن

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

    #16
    پاسخ : فرق I2C و I2C دو سیمه در کدویژن

    دو تا سوال دیگه

    در ابتدای این برنامه دو تا روتین وقفه تعریف شده

    یکی برای تایمر صفر برای وقتی که سرریز میکنه و دیگری برای تایمر یک که وقفه مقایسه هست

    جزئیاتشو میگم اما برای بیسیک بلد نیستم بنویسم

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

    ' timer overflow ISR
    'روتین وقفه تایمر صفر وقتی سرریز رخ میدهد
    'وقتی وقفه رخ داد در زیر برنامه ابتدا وقفه ها را متوقف میکنیم. بدین معنا که تا به این وقفه رسیدگی نکرده ایم نمیگذاریم وقفه دیگری رخ دهد
    'این کار در کدویژن با دستورات اسمبلی به صورت زیر است
    #asm ("cli&quot ===> in bascom = ???
    'حال دو کانتری که تعریف کرده بودیم را کم میکنیم تا به صفر برسند

    IF Time1 > 0 Then Dect Time1
    IF Time2 > 0 Then Dect Time2

    ' حال مجددا وقفه ها را فعال میکنیم. این کار در کدویژن با دستور اسمبلی زیر است
    #asm ("sei&quot ===> in bascom = ???

    END 'پایان روتین وقفه تایمر صفر

    '************************
    'روتین وقفه تایمر یک وقتی مقایسه درست میدهد
    'وقتی وقفه رخ داد در زیر برنامه ابتدا وقفه ها را متوقف میکنیم. بدین معنا که تا به این وقفه رسیدگی نکرده ایم نمیگذاریم وقفه دیگری رخ دهد
    'این کار در کدویژن با دستورات اسمبلی به صورت زیر است
    #asm ("cli&quot ===> in bascom = ???
    'حال دو کانتری که تعریف کرده بودیم را کم میکنیم تا به صفر برسند

    IF Time3 > 0 Then Dect Time3

    ' حال مجددا وقفه ها را فعال میکنیم. این کار در کدویژن با دستور اسمبلی زیر است
    #asm ("sei&quot ===> in bascom = ???

    END 'پایان روتین وقفه تایمر یک

    دیدگاه


      #17
      پاسخ : فرق I2C و I2C دو سیمه در کدویژن

      ممنون
      هر جا شو که نتونستی چارت بزار تا من بنویسم
      فقط یه سوال
      خودت تست هم میکنی؟با ps2?
      علم چندانکه بیشتر خوانی چون عمل در تو نیست نادانی

      دیدگاه


        #18
        پاسخ : فرق I2C و I2C دو سیمه در کدویژن

        هنوز فرصت نکردم تستش کنم

        اولین پست گفتم کسی باهاش جواب گرفته یا نه؟

        اما کسی جواب نداد

        بعضی جاهاشو که خوندم نفهمیدم بر اساس چه منطقی اینو نوشته
        اگه یه مرجعی بدی که بخونم ممنون میشم

        امیدوارم جواب بده

        راستی من به مدت 3 روز دور از خانه خواهم بود
        5شنبه هم جشن ... است.
        امیدوارم قبلش بتونم یک بار تستش کنم

        دیدگاه


          #19
          پاسخ : فرق I2C و I2C دو سیمه در کدویژن

          '******************************************** *

          Sub Datalow()
          Ddra.0 = 1
          Porta.0 = 0
          End Sub


          Sub Reldata()
          Ddra.0 = 0
          Porta.0 = 1
          End Sub


          Sub Clklow()
          Ddra.1 = 1
          Porta.1 = 0
          End Sub


          Sub Relclk()
          Ddra.1 = 0
          Porta.1 = 1
          End Sub

          '******************************************** ****
          'Send a byte of data to mouse. It consist of 1 start bit, 8 data bits, 1 parity bit, 1 stop bit.
          'After the mouse recieved the data correctly, the mouse will send back an ACK bit.
          '"data" is the data to be sent. parity bit is odd parity of the 8 bits data.
          'Data is read by mouse at rising edge of CLK.

          Sub Mouse_read(byval Data As Byte)

          Local Dim B As Byte
          Local Dim Parity As Byte
          Local Dim I As Byte

          Call Reldata()
          Call Relclk()
          Waitus 300
          Call Clklow() 'Pull CLK Low
          Waitus 300 'need to wait for at least 100us
          Call Datalow() 'Pull DATA Low when holding CLK Low
          Waitus 100
          Call Relclk() 'Release CLK and continue to hold Data Low. This is also the Start bit.
          Waitus 40

          While Clk_in <> Low 'wait for CLK to go low
          Wend

          I = 0
          B = &B00000001 '[glow=red,2,300] ==> [1][/glow]
          Parity = 1 'odd parity = 1 ^ bit0 ^ bit1 ^ ... ^ bit7

          While I <= 8
          If I = 8 Then 'If i=8 send parity bit otherwise, send the next bit of data.
          If Parity = 1 Then Call Reldata() 'DATA_OUT=(i==8? parity : (data & Bit) ); '[glow=red,2,300] ==> [2][/glow]
          Else Call Datalow()
          Else
          If(data & B) Then Call Reldata() ' [glow=red,2,300]==> [3][/glow]
          Else Call Datalow()
          End If

          While Clk_in <> High 'wait for CLK to go high. mouse read data at rising edge.
          Wend

          While Clk_in <> Low 'wait for CLK to go low.
          Wend

          Parity = Parity And Data_out 'update parity bit. ' [glow=red,2,300]==> [4][/glow]
          Rotate B , Left 'Prepare mask ' [glow=red,2,300]==> [5][/glow]
          Incr I
          Wend

          Call Reldata() 'Release Data line. This is the stop bit.
          Waitus 50 'give time for transient to settle.
          While Data_in <> Low 'wait for Data line to go low
          Wend

          While Clk_in <> Low 'wait for CLK to go low. Start of ACK from mouse.
          Wend

          While(data_in = Low Or Clk_in = Low ) 'End of ACK from mouse.
          Wend

          Call Clklow() 'Inhibit the mouse from transmitting data.

          End Sub

          '******************************************** ****
          'This function read a byte of data from the mouse and return the byte

          Function Mouse_read()data As Byte

          Local Dim I As Byte
          Local Dim T As String * 10

          Call Relclk() 'release the CLK
          Call Reldata() 'release DATA line.
          Waitus 200 'wait for at least 100us

          While Clk_in = High 'wait for falling edge. we read data at falling edge of CLK
          Wend

          I = 0
          Waitus 5

          While Clk_in = Low 'wait for CLK to go high.
          Wend

          While I <= 8
          While Clk_in = High 'wait for falling edge of CLK
          Wend
          '==> t[i]=DATA_IN 'store each bit ' [glow=red,2,300]==>[6][/glow]
          Incr I
          While Clk_in = Low
          Wend
          Wend

          While Clk_in = Low
          Wend

          '==> data=128*t[7]+64*t[6]+32*t[5]+16*t[4]+8*t[3]+4*t[2]+2*t[1]+t[0] 'combine the collected bits into a byte ' [glow=red,2,300]==> [7][/glow]

          Call Clklow() 'pull CLK low to prevent mouse from sending data until being asked

          End Function

          '******************************************** ****
          'Update the cursor's variables with new location

          Sub Initialize()

          Last_cursor_x = Cursor_x
          Last_cursor_y = Cursor_y

          If Mouse_y <> 0 Then 'calculate vertical position according to its sign and value
          If((mouse_status And &B00100000) <> 0) Then Cursor_y = Cursor_y +(256 - Mouse_y) ' [glow=red,2,300]==> [8][/glow]
          Else Cursor_y = Cursor_y - Mouse_y
          End If
          If Mouse_x <> 0 Then 'calculate horizontal position according to its sign and value
          If((mouse_status And &B00010000) <> 0) Then Cursor_x = Cursor_x -(256 - Mouse_x) ' [glow=red,2,300]==> [8][/glow]
          Else Cursor_x = Cursor_x + Mouse_x
          End If

          If(cursor_x > Cursor_x_max) Then Cursor_x = Cursor_x_max 'limit cursor to within the screen
          If(cursor_x < Cursor_x_min) Then Cursor_x = Cursor_x_min '100 x 128 pixels screen
          If(cursor_y > Cursor_y_max) Then Cursor_y = Cursor_y_max
          If(cursor_y < Cursor_y_min) Then Cursor_y = Cursor_y_min

          'determine the state of the mouse button to be sent to tv:
          Button_up = 0

          Select Case Mouse_status
          Case 9:
          If((mouse_x <> 0)||(mouse_y <> 0)) Then ' [glow=red,2,300]==> [9][/glow]
          Button_down = 0
          Button_dragging = 1
          Button_up = 0
          Else
          Button_down = 1
          Button_dragging = 0
          Button_up = 0
          End If
          Exit Sub

          Case 8:
          If Pre_mouse_status = 9 Then
          Button_down = 0
          Button_dragging = 1
          Button_up = 0
          Else
          Button_down = 1
          Button_dragging = 0
          Button_up = 0
          End If
          Exit Sub
          End Select
          End Sub

          [1] توجه: متغیر B معادل Bit در برنامه سی میباشد. باید مقدار باینری در آن ریخته شود
          در موارد بعدی نیز که شماره گذاری کردم تو پست بعدی(سر فرصت) توضیح میدم

          احتمالا اشتباه هستن و باید روش درست نوشتنش رو بگی


          دیدگاه


            #20
            پاسخ : فرق I2C و I2C دو سیمه در کدویژن

            [2] : در زبان سی اگر متغیری به تنهایی در قسمت شرط دستور IF یا while یا ... بکار رود بدان معنا است که اگر عددی مثبت باشد شرط برقرار است و اگر صفر یا منفی باشد شرط غلط است

            در اینجا در چند خط قبل parity را برابر یک قرار دادیم و در زبان سی در شرط if فقط parity ذکر میگردد حال برای بیسیک من آن را برابر یک در شرط قرار دادم
            (حال درست است یا نه نمیدانم ؟؟؟)

            [3]: در این قسمت هم متاثر شدن از مثبن یا منفی شدن شرط است
            در داخل شرط ابتدا دو متغیر B و data به صورت بیت به بیت and میشوند . حال در بیسیک در داخل شرط امکان پذیر است یا خیر نمیدانم
            اگر حاصل مثبت باشد شرط درست و اگر صفر باشد شرط غلط است

            [4]: در این قسمت محتوای parity باید با Data_out به صورت بیت به بیت and شود و در داخل parity ریخته شود

            ادامه دارد...

            دیدگاه


              #21
              پاسخ : فرق I2C و I2C دو سیمه در کدویژن

              [5]: در این قسمت همانطور که واضح است قصد داریم محتوای متغیر B را یک واحد به سمت چپ شیفت دهیم

              [6]: t[i]=DATA_IN :
              وقتی یک رشته در سی تعریف میشود بدین صورت میتوان بایت های آن را جدا جدا فراخوانی کرد
              احتمالا در بیسیک بدین شیوه است.
              T.5 = data_in
              اما آیا در یک حلقه میتوان قرارداد؟؟؟

              [7]: data=128*t[7]+64*t[6]+32*t[5]+16*t[4]+8*t[3]+4*t[2]+2*t[1]+t[0]

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


              [8]: همانند مورد [3]


              [9]: در این قسمت اگر یکی از دو شرط برقرار باشد کفایت میکند
              یعنی دو شرط با یکدیگر OR میشوند
              در بیسیک به چه صورت ذکر میآ‌شود؟؟؟


              4 زیر برنامه باقیمانده نیز به زودی ...

              دیدگاه


                #22
                پاسخ : فرق I2C و I2C دو سیمه در کدویژن

                {1}با این حساب که نوشتی B = &B00000001 این متغیر باید از جنس بایت باشه
                {2} بله درسته
                {3} If data and B>0 Then
                {4} دستوراتش با بیسیک یکیه تا جایی که میبینم
                Parity = Parity And Data_out 'update parity bit. ' ==> (4)]
                Rotate B , Left 'Prepare mask ' ==>(5)
                Incr I

                {6}منظورت رو نفهمیدم و لی واسه تک تک کردن کاراکتر یا رشته
                کد:
                Ss = Mid(s , A , 1)


                {7}
                {7}Data = 128 * T(7)
                Data = Data + 64 * T(6)
                Data = Data + 32 * T(5)
                Data = Data + 16 * T(4)
                Data = Data + 8 * T(3)
                Data = Data + 4 * T(2)
                Data = Data + 2 * T(1)
                data=data+t(0)



                }9{
                If mouse_x <> 0 or mouse_y <> 0 Then

                بهتره اینجوری بنویسی(اخه بالایی رو تا حالا تست نکردم

                if mouse_x <>0 then
                ...............
                elseif mouse_y <>0 then
                ..............
                end if
                علم چندانکه بیشتر خوانی چون عمل در تو نیست نادانی

                دیدگاه


                  #23
                  پاسخ : فرق I2C و I2C دو سیمه در کدویژن

                  [7]: پس در بیسیک اندیس شماره بایت یک رشته را در داخل پرانتز مینویسن

                  در سی در داخل کروشه مینوسن و میشه یه شمارنه مثلا i تعریف کرد و در یک حلقه for همه بایت ها رو دونه دونه خوند

                  [9]: باید دو شرط هم طراز باشند و اگر یکی از آنها برقرار بود حلقه if اجرا بشه
                  اگه منظور را براورده میکنه :job:

                  - راستی روش نوشتن وقفه را بلد نبودم، اگه زحمتشو بکشی ممنون میشم
                  - در مورد دستورهای اسمبلی برای خاموش و روشن کردن وقفه ها در بیسیک نیز همچنین ؟؟؟

                  دیدگاه


                    #24
                    پاسخ : فرق I2C و I2C دو سیمه در کدویژن

                    این هم ادامه 4 زیر برنامه :

                    '******************************************** ****
                    'This routine poll the mouse's status and movement data.
                    Sub Poll_mouse()

                    Call Mouse_send(&H Eb) 'Request data from mouse
                    Call Mouse_read() 'Read the acknowledge byte
                    Pre_mouse_status = Mouse_status
                    Mouse_status = Mouse_read() 'Read mouse status
                    Mouse_x = Mouse_read() 'Read mouse horizontal movement
                    Mouse_y = Mouse_read 'Read mouse vertical movement

                    End Sub

                    '******************************************** ****
                    'This function is called to reset the mouse and put it into remote mode.
                    'In remote mode, mouse only send data upon request from the microcontroller.
                    'This function is called when manual reset of the mouse is required. This is for
                    'overcoming interference problem from some unknown EM field.

                    Sub Reset_mouse()

                    Mouse_send(&H Ff) 'reset mouse
                    Mouse_read() 'read mouse acknowledge (0xFA)
                    Mouse_read() 'read some blank bytes.
                    Mouse_read()
                    Mouse_send(&H F0) 'Set mouse to remote mode.
                    Mouse_read() 'read mouse acknowledge (0xFA)
                    Waitms 100

                    End Sub

                    '******************************************** ****
                    'Send mouse information to tv screen:
                    'including cursor locations, button status and tool change

                    Sub Update_tv()

                    Cls
                    Lcd "X:" ; Cursor_x ; "Y:" ; Cursor_y
                    Locate 1 , 0
                    If Button_down = 1 Then
                    Lcd "initial button down"
                    Else If Button_dragging = 1 Then
                    Lcd "button drag"
                    Else If Button_up = 1 Then
                    Lcd "button release"
                    Else
                    Lcd "nothing clicked"
                    End If
                    End If
                    End If

                    End Sub

                    '******************************************** ****
                    'Initialize
                    Const Linetime = 1018

                    Sub Initialize()

                    '==> #asm("cli&quot // gheyre fa'al kardane vaghfe ha
                    'init timer 1 to send mouse info at regular interval
                    Ocr1a = Linetime 'One NTSC line
                    Tccr1b = 9 'full speed; clear-on-match
                    Tccr1a = &H00 'turn off pwm and oc lines
                    Timsk = &H12 'enable interrupt T1 cmp

                    Ocr0 = 250 'set the compare re to 250 time ticks
                    'prescalar to 64 and turn on clear-on-match
                    Tccr0 = &B00001011
                    'init the task timers
                    Time1 = T1 ' Heart Beat Timer
                    Time2 = T2
                    Time3 = T3 ' Debounce Timer

                    'init ports
                    Ddra = &H11111100 ' Pa0 Data In , Pa1 Clock In
                    Ddrd.6 = 0 ' Use For Mouse Reset
                    Portd.6 = 1 ' Enable Pullup Resistor
                    Ddrd.7 = 1 ' Used For Heart Beat Indicator
                    Ddrd.3 = 1

                    Ddra.0 = 1
                    Porta.0 = 1
                    Waitms 500
                    Ddra.0 = 0

                    Ddra.1 = 1
                    Porta.1 = 1
                    Waitms 500
                    Ddra.1 = 0;

                    'init mouse variables
                    Cursor_x = 5
                    Cursor_y = 5
                    Relclk()
                    Reldata()

                    Cls
                    Lcd "START"

                    'init mouse state
                    Reset_mouse()

                    '==> #asm("sei&quot // fa'al kardane vaghfe ha
                    End Sub

                    اگه سوالی بود بفرما

                    دیدگاه

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