آموزش میکروکنترلر AVRپروژهپروژه های AVRمیکروکنترلر

راه اندازی موس با avr در بسکام

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

در ابتدای هرچیز این نکات را یاد اوری میکنم میکروی مورد استفاده ما هر میکرویی میتونه باشه چرا که از امکانات خاص میکرو مثل اینتراپت ویا … استفاده نمیکنیم فقط پورتهای ورودی و خروجی پس میتونه مگا8 باشه یا مگا16 ویا… که در این پروژه که برای یه دوستم کار کردم از مگا32 استفاده کردم  .

 ویدیوی راه اندازی موس با avr در بسکام

در شروع کار بهتره توضیحاتی در مورد راه اندازی موس با avr ونحوه ارسال دیتا رو بررسی کنیم:

پروتکل ارتباطی بین میکرو دو لاین دارد یکی کلاک ودیگری دیتا هست که برای میکرو وماوس هردو لاین میتواند هم ورودی وهم خروجی باشد .

وقتی با لاینی کارمان تمام شد باید ان را با یک مقاومت پول آپ کنیم یعنی وقتی لاین ازاد هست باید سطح منطقی یک داشته باشد برای این کار میکرو را از داخل پول آپ میکنیم در ضمن آزاد نگه داشتن لاین به معنی این هست که میکرو تعیین وضعیت این پایه را در اختیار ای سی ماوس قرار میده وخود میکرو ورودی تعیین میشه تا اطلاعات روی لاین رو بخونه

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

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

Standard 3d mode(1

standard 2d mode(2

در مد2 ما 3 بایت اطلاعات دریافت میکنیم که 2بایت مربوط به سرعت حرکت موس در جهت X و Y ویک بایت هم مربوط /گبه وضعیت کلیدها که آیا کلیدها فشار داده شده یا نه و همچنین جهت حرکت ماوس که مثبت هست یا نه.

در مد1 علاوه بر اطلاعات قبلی یک بایت نیز مربوط به حرکت چرخ وسط ماوس میباشد

برای راه اندازی اولیه ماوس باید ماوس را ریست کنیم برای این کار FF هگز را به ماوس میفرستیم که در پاسخ سه بایت ماوس میفرسته که اهمیتی نداره سپس ماوس به صورت معمول در مد 2 کار میکنه پس همین ریست برای تنظیمات کافیه البته در این پروژه من. شما میتونید خیلی از تنظیمات دیگری مثل دقت ماوس و مد های مختلف کاری رو در ماوس داشته باشید .

پس بریم به دریافت اطلاعات از ماوس البته پس از ریست برای دریافت اطلاعات ماوس (همون سه بایت مشهورمون)کدBE سه بایت طبق جدول صفحه بعد دریافت میشه که باید خوب دقت بدید که در واقع تو برنامه روی این جدول مانور میدیم:

Screenshot (7)

البته این موضوع رو هم متذکر بشم که دقت ماوس به طور پیشفرض به ازای هر میلیمتر 4واحد افزایش پیدا میکنه که اگه 1 باشه دقت میرهخ بالا اگه 8 باشه سرعت میاد پایین . ماوس سرعت خودکار نیز داد اما در مد استریم کار میکنه ندر مد ریموت پس در مد ریموت باید خودمون دقت رو تنظیم کنیم برای تنظیم ابتدا کد7E را میفرستیم سپس یک بایت دریافت میکنیم وسپس طبق جدول بایت دوم رو میفرستیم و سپس یک بایت در یافت میکنیم که بی ارزش هست:

Screenshot (8)

برنامه راه اندازی ماوس با  میکرو در بسکام

'| |         COMPUTER MOUSE DRIVER BY AVR                                    | |


$regfile = "M32def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = _
Porta.0 , E = Porta.4 , Rs = Porta.5
Cls
Cursor Off

Locate 1 , 2 : Lcd "MOUSE POSITION"
Locate 2 , 5 : Lcd "READER"

Wait 2
Cls
'*******************************************************************************
'******************************                                 ****************
'******************************  DIM AND ALIAS AND CONFIG GLCD  ****************
'******************************                                 ****************
'*******************************************************************************
Dim Conter As Byte
'--------------------------- READ AND SAVE MOUSE SPEED TO EEPROM
Dim Status As Byte
Dim Indata As Byte
Dim Sdata As Byte
Dim Parity As Bit
'-------------------- DATA PORT AND PIN
Dat Alias Portb.1
Datin Alias Pinb.1
'-------------------- CLOCK PORT AND PIN
Clk Alias Portb.2
Clkin Alias Pinb.2
'-------------------- MOUSE DATA DDR (FOR PULLUP THE DATA LINE)
Ds Alias Ddrb.1
'-------------------- MOUSE CLOCK DDR (FOR PULLUP THE CLOCK LINE)
Cs Alias Ddrb.2

'--------------------- FOR READ MOUSE KEYS
'--------------------- STATUS.0 AND .1 AND .2 IS POINTER TO MOUSE KEY POSITION
Left_key Alias Status.0
Right_key Alias Status.1
Middle_key Alias Status.2
'-------------------------- SAVE X AND Y OF MOUSE CURSOR POSITION
Dim Mous_data_x As Byte
Dim Mous_data_y As Byte
Deflcdchar 2 , 32 , 4 , 14 , 31 , 14 , 4 , 32 , 32          ' vasat
Dim X As Byte
Dim Y As Byte
Dim X1 As Byte
Dim Y1 As Byte
Dim T As Byte
'*******************************************************************************
'*************************************              ****************************
'************************************* MAIN PROGRAM ****************************
'*************************************              ****************************
'*******************************************************************************


Wait 3

Cls
Locate 1 , 1 : Lcd "x=  "
Locate 2 , 1 : Lcd "y=   "
Do

Gosub Read_mouse

If Left_key = 1 Then
 T = 0
 Locate 1 , 11 : Lcd "<"
End If

If Right_key = 1 Then
 T = 0
 Locate 1 , 13 : Lcd ">"
End If

If Middle_key = 1 Then
 T = 0
 Locate 1 , 12 : Lcd Chr(2)
End If
If T = 9 Then
Locate 1 , 11 : Lcd "   "
T = 0
End If


Print "x="
Print X

Print "y="
Print Y
Locate 1 , 3 : Lcd X
Locate 2 , 3 : Lcd Y

Waitms 70
T = T + 1
Locate 1 , 3 : Lcd "   "
Locate 2 , 1 : Lcd "y=    "

'--------------------------

Loop

'*******************************************************************************
'******************************                                 ****************
'******************************         READ MOUSE DATA         ****************
'******************************                                 ****************
'*******************************************************************************

'------------------- READ MOUSE DATA AND CALCULTION MOUSE CURSOL STATUS
Read_mouse:

'------------------------------------ CONNECTION TO MOUSE AND READ MOUSE DATA
Gosub Read_mouse_data

'------------------------------------ CALCULATION Y OF CURSOR POSITION

'------ IMPORT THE MOUSE SPEED IN CALCULATION






If Status.5 = 1 And Mous_data_y <> 0 Then
    Mous_data_y = 256 - Mous_data_y
End If




If Status.5 = 0 Then
Y = Y + Mous_data_y
Else
If Y > Mous_data_y Then
Y = Y - Mous_data_y
'Else
'Y = 0
End If

End If




If Y > 250 Then Y = 250



'------------------------------------ CALCULATION X OF CURSOR POSITION





If Status.4 = 1 And Mous_data_x <> 0 Then
    Mous_data_x = 256 - Mous_data_x
End If

If Status.4 = 0 Then
  X = X + Mous_data_x
Else

   If X > Mous_data_x Then
      X = X - Mous_data_x
   'Else
   '  X = 0
   End If


End If


If X > 250 Then X = 250



Return
'*******************************************************************************
'*****************                                                 *************
'*****************   READ MOSE DATA 3 BYTE STATUSE AND X AND Y     *************
'*****************                                                 *************
'*******************************************************************************

'---------------------- MICRO CONTROLER  REQUEST DATA FROM MOUSE
'---------------------- BY SEND (EB HEX) AND RECIEVE X AND Y AND
'---------------------- STATUS BYTE FROM MOUSE

Read_mouse_data:

Sdata = &HEB
Gosub Send_byte

Gosub Read_byte
Gosub Read_byte
Status = Indata

Gosub Read_byte
Mous_data_x = Indata

Gosub Read_byte
Mous_data_y = Indata


Return

'*******************************************************************************
'****************************                                  *****************
'**************************** READ ON BYTE DATA FROM MOUSE     *****************
'****************************                                  *****************
'*******************************************************************************

'------------- RECIEVE 1 BYTE DATA FROM MOUSE
Read_byte:
'--------------------- DATA AND CLOCK IS HIGH
'--------------------- SO MOUSE SEND DATA OUT
Ds = 0
Dat = 1
Cs = 0
Clk = 1

Waitus 150
'------------------------- START BIT
Bitwait Clkin , Reset
Conter = 0
Waitus 5
Bitwait Clkin , Set
'------------------------- END START BIT


'------------------------- WHILE LOOP START

While Conter < 9

Bitwait Clkin , Reset

Indata.conter = Datin
Incr Conter
Bitwait Clkin , Set

Wend

'------------------------- WHILE LOOP END

Clk = 0
Cs = 1

Return


'*******************************************************************************
'****************************                                  *****************
'**************************** SEND ON BYTE DATA TO MOUSE       *****************
'****************************                                  *****************
'*******************************************************************************

'-------------- SEND 1 BYTE DATA TO MOUSE
Send_byte:

Ds = 0
Dat = 1
Cs = 0
Clk = 1

Waitus 200
'------------------ MICRO CONTROL LINE AND SEND CLOCK PALS
Clk = 0
Cs = 1

Waitus 150
'------------------SEND START BIT
Dat = 0
Ds = 1

Waitus 100

'-----------------

Cs = 0
Clk = 1

Waitus 40

'----------------- END OF START BIT

Bitwait Clkin , Reset

Conter = 0
Parity = 1

While Conter < 9
'----------------------- SEND PARITY BIT
If Conter = 8 Then
   If Parity = 1 Then
      Ds = 0
      Dat = 1
   End If
   If Parity = 0 Then
      Ds = 1
      Dat = 0

   End If
Else
'----------------------- SEND DATA BIT
  If Sdata.conter = 1 Then
     Ds = 0
     Dat = 1
  Else
     Ds = 1
     Dat = 0
  End If

End If

Bitwait Clkin , Set
Bitwait Clkin , Reset

If Sdata.conter = 1 Then Toggle Parity

Incr Conter

Wend

'-------------- RELEASE LINES BY MICRO
Ds = 0
Dat = 1

Waitus 50
'-------------- STOP BIT READ BY MOSE

Bitwait Datin , Reset
Bitwait Clkin , Reset

'-------------- START ACK (SEND BY MOUSE)

While Datin = 0 And Clk = 0

'-------------- ACK END
Wend
Clk = 0
Cs = 1

Return


'*******************************************************************************
'**************************                                         ************
'**************************  RESET MOUSE AND CONFIG TO REMOTE MODE  ************
'**************************                                         ************
'*******************************************************************************

'------------------- RESTART MOUSE BY SEND (FF HEX)
'------------------- AND PULL MOUSE TO REMOTE MODE
'------------------- BY SEND (F0 HEX) TO MOUSE
Reset_mouse:

Sdata = &HFF
Gosub Send_byte
'------------------ MOUSE SEND 3 BYTE (FA,AA,00) DATA OFTER RESTARTED
Gosub Read_byte
Gosub Read_byte
Gosub Read_byte

Sdata = &HF0

Gosub Send_byte
'----------------- MOUSE SEND 1 BYTE (FA) DATA ODTER SET REMOTE MODE

Gosub Read_byte

'---------------------------------------
Sdata = &HE8
Gosub Send_byte
Gosub Read_byte


Sdata = &H00
Gosub Send_byte
Gosub Read_byte

Waitms 100

Return

End
'_______________________________________________________________________________

کد کامل نیست برای دیدن کامل کد پروژه رو دانلود کنید.

دانلود پروژه راه اندازی موس با avrدر بسکام

توضیحات بیشتر در مورد برنامه ی راه اندازی موس با avrدر ادامه همراه فایل های پروژه برای دانلود قرار داده شده است.

دانلود

 

نوشته های مشابه

6 دیدگاه

  1. سلام اقا یونس مرسی -خیلی جالب بود.از موس usb هم میشه استفاده کرد؟شما از ps/2 استفاده کردید یا usb ؟؟
    اگر با ps/2 باشه میشه از مبدل استفاده کردیانه؟مشکل ارتباطی پیش نمیاد؟اخه سیگنالهای
    این 2پروتوکل به نظر میاد با هم متفاوتند.من یه برنامه داشتم با led بود که به هر سمتی که موس حرکت میکرد یه led مربوطه روشن میشد ولی با موس usb به مشکل خورد وکار نکرد البته از مبدل استفاده کرده بودم.
    ممنون.

    1. سلام ممنون از نظرتون راستش رو بخواهید من با ماوس usb تست نکردم ولی تو منبعی که اسمش رو توآخر pdfنوشتم نوشته بود که میشه باماوسی که usb هست ارتباط برقرار کرد ولی اگر صادقانه حرف بزنیم ماوس هایی که بلافاصله بعد از ps2 نوعusb آن به بازار اومد کار میکنه نه با ماوسهای امروزی که خودشون درایورشون رو روی کامپیوتر نصب میکنن

  2. سلام.آقا یونس دست گلتون درد نکنه
    فقط چرا شماتیک رو کامل نذاشتین؟
    مثلا اون مقاومتها روی برد برد به کجا وصل میشن و همچنین پایه های خود موس ps/2 رو به کجا وصل کردین؟
    آخه در پروتئوس فقط یک سیم وصل شده و بقیه رسم نشدن!

    1. در برنامه هست که کدوم پایه ها یاید چجوری وصل بشن در ضمن اون مقاومتهایی که میبینید بزای بکلایت ال سی دی استفاده کردم راستش مقاومت مناسب نداشتم فقط مقاومتهارو سری موازی کردم

      1. خیلی ممنون
        من با موس قدیمی راه اندازیش کردم
        با موسهای لیزری نمیشه البته این لیزری که میگم خودش PS2 هستا اما بازم مثل USB اینم کار نمی کنه و فقط با موس PS2 قدیمی یعنی همونایی که توپی دارن کار می کنه
        یه سوال دیگه داشتم از خدمتتون :
        واسه این چرخ وسطی چرا برنامه ای نذاشتین یعنی همونی که در موس عمل بالا و پایین بردن صفحه و … رو انجام میده

        1. ببینید برای راه اندازی یو اس بی و ارتباط با اون باید سطح ولتاژتون 3.3 ولت باشه پس شما بهتره که منبع رو 3.3 کنید یعنی میکرو وماوس رو با 3.3 ولت راه اندازی کنید تا مشکلی پیش نیاد در ضمن میشه از تمام امکانات ماوس استفاده کرد که باید ماوس رو تو مد strem mode راه اندازی کنید در این مد ماوس به صورت خودکار اطلاعات رو ارسال میکنه که کار دراین مد سخته و احتمالا سرعت میکرو پاسخگو نباشه در ضمن تا اونجایی که من میدونم فقط تو این مد اطلاعات حرکت چرخ وسطی ماوس در اختیار کاربر قرار میگیره .
          در ضمن برای افزایش سرعت پاسخ گویی به سوالات شما عزیزان لطفا سوالات خود را در انجمن مطرح کنید . در صورت نبود موضوع مورد نظر شما موضوع جدید ایجاد کنید با تشکر

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا