اطلاعیه

Collapse
No announcement yet.

اتصال موس ps2 به میکرو avr

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

    اتصال موس ps2 به میکرو avr

    سلام
    من میخام اطلاعات ارسالی از موس رو بوسیله ی پورت USART بخونم و اطلاعات X ,Y,D رو جداسازی کنم.(D بایت دیتای ارسالی موس)
    با توجه به اینکه اطلاعات موس تو 3تا 11 بیت ارسال مشه آیا من میتوتم از دستور SCANF("%d%d%d",D,X,Y) استفاده کنم و X,Y,D رو بدست بیارم؟ چطور؟
    اگه از دستور SCANF استفاده کنم بافر دریافت رو باید 24 تایی انتخاب کنم؟
    آیا میتونم در مد سنکرون کار کنم؟ آیا میکرو باید SLAVE انتخاب بشه

    #2
    پاسخ : اتصال موس ps2 به میکرو avr

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

    دیدگاه


      #3
      پاسخ : اتصال موس ps2 به میکرو avr

      سلام
      موسی که من میخام استفاده کنم usb نیست. ps2 میخام استفاده کنم.
      با هر حرکت موس 3 بسته ی 11 تایی به میکرو ارسال میشه.که هر کدوم از این 11تا از یک بیت شروع و یک بیت پایان ویک بیت توازن و8بیت دیتا تشکیل شده.11تای اول تغیرات y و11تای دوم تغیرات x و 11تای سوم نشون دهنده ی زده شدن کلید چپ و راست موس-و تعیین کننده ی حرکت کرسر موس به چپ یا راست یا بالا یا پایین هست.
      حالا من میخام این اطلاعات x,y,d رو بوسیله ی usart بخونم و جداسازی کنم.نمیدونم میشه از مد سنکرون اتفاده کنم یا نه؟
      یا اینکه برا خوندن اطلاعات از دستور scanf میتونم استفاده کنم؟ اگه میشه آیا باید بافر دریافت رو 24 تایی یا بیشتر انخاب کنم؟
      ممنونم از راهنماییهتوون. :rolleyes:

      دیدگاه


        #4
        پاسخ : اتصال موس ps2 به میکرو avr

        من خودم کار نکردم ولی تو سایت و مرکز دانلود میتونید راجع به این مطلب پیدا کنید

        دیدگاه


          #5
          پاسخ : اتصال موس ps2 به میکرو avr

          خیلی search کردم ولی چیزی که به دردم بخوره پیدا نکردم.
          خواهش میکنم راهنماییم کنید :cry2:

          دیدگاه


            #6
            پاسخ : اتصال موس ps2 به میکرو avr

            خواهشن کسی میتونه راجبه خوندن اطلاعات ارسالی از موس بوسیله ی usart میکرو avr کمکی به من بکنه؟ ؟؟
            البته با کدویژن.
            بسیار ممنوون میشم.

            دیدگاه


              #7
              پاسخ : اتصال موس ps2 به میکرو avr

              من این فایل رو از همین جا دانلود کردم اما امروز هرچی گشتم نتونستم صفحه شو پیدا کنم برای همین خودم پلود کردم. امیدوارم بدردت بخوره
              http://dashkhaneh.persiangig.com/document/mouse.pdf

              دیدگاه


                #8
                پاسخ : اتصال موس ps2 به میکرو avr

                سلام دوستان
                من زیاد تو برنامه نویسی میکرو وارد نیستم لطف کنید منو راهنمایی کنید
                میخواستم با استفاده از scrolling wheel موس 20 تا سطح ولتاژ از 10- تا 10+ ایجاد کنم اگه موسم ps2 باشه چطوری میتونم این برنامه رو بنویسم اصلا پالس تولید شده توسط wheel موس چجوری تغییر میکنه من اصلا از positioning موس نمیخوام استفاده کنم فقط scroll و کلیک چپ و راست
                please help me

                دیدگاه


                  #9
                  پاسخ : اتصال موس ps2 به میکرو avr


                  کد:
                  #ifndef _MOUSE_H_
                  #define _MOUSE_H_
                  // ==============================================
                  #include <avr/io.h>
                  #include <compat/deprecated.h>
                  // ==============================================
                  // Mouse connections
                  #define PIN_MS 	PIND
                  #define PORT_MS 	PORTD
                  #define DDR_MS		DDRD
                  #define CLOCK_MS 	3
                  #define DATAPIN_MS 	4
                  
                  #define MS_DATA0()		{cbi(PORT_MS,DATAPIN_MS);sbi(DDR_MS,DATAPIN_MS);}
                  #define MS_DATA1()		{cbi(PORT_MS,DATAPIN_MS);cbi(DDR_MS,DATAPIN_MS);}
                  #define MS_DATA()		bit_is_set(PIN_MS,DATAPIN_MS)
                  
                  #define MS_CLK0()		{cbi(PORT_MS,CLOCK_MS);sbi(DDR_MS,CLOCK_MS);}
                  #define MS_CLK1()		{cbi(PORT_MS,CLOCK_MS);cbi(DDR_MS,CLOCK_MS);}
                  #define MS_CLK()		bit_is_set(PIN_MS,CLOCK_MS)
                  // ==============================================
                  void ms_send(char val);
                  void ms_update();
                  char ms_read();
                  // ==============================================
                  #define MOUSE_ACK      0xfa
                  #define MOUSE_ERROR     0xfc
                  #define MOUSE_RESEND    0xfe
                  #define MOUSE_RESET     0xff
                  #define MOUSE_REMOTE_MODE  0xf0
                  #define MOUSE_READ_DATA   0xeb
                  #define MOUSE_ENABLE_REPORT 0xf4  
                  // ==============================================
                  unsigned char mouse_x , mouse_y , mouse_btn;
                  volatile unsigned char event_mouse[4*32] , msdev_rind , msdev_wind;
                  char mouse_timeout , mouse_inited = 0 , ms_error = 0;
                  char ms_edge , ms_bitcount;
                  
                  void fe();
                  void inhibitt();
                  void idlee();
                  void requ();
                  char getps2();
                  void sendps2(char value);
                  //
                  void init_mouse();
                  void update_mouse();
                  // ==============================================
                  void fe()
                  {
                  	char mouse_wait;
                  	
                    mouse_timeout = 1;
                    for(mouse_wait = 0 ; mouse_wait != 100; mouse_wait++)
                    {
                      if(MS_CLK())
                      {
                        mouse_timeout = 0;
                        break;
                      }
                        
                      _delay_us(10);
                    }
                    
                    for(mouse_wait = 0 ; mouse_wait != 100; mouse_wait++)
                    {
                      if(!MS_CLK())
                      {
                        mouse_timeout = 0;
                        break;
                      }
                      _delay_us(10);
                    }
                  }
                  // ==============================================
                  inline void inhibitt()
                  {
                    MS_CLK0();
                    MS_DATA1();
                  }
                  // ==============================================
                  inline void idlee()
                  {
                    MS_CLK1();
                    MS_DATA1();
                  }
                  // ==============================================
                  inline void requ()
                  {
                    MS_CLK1();
                    MS_DATA0();
                  }
                  // ==============================================
                  char getps2()
                  {
                  //Data sent from the device to the host is read on the falling edge of 
                  //the clock signal
                  
                    char val = 0,i;
                    char p = 0;
                    //sync to device
                    idlee();
                    
                    ms_error = 0;
                    
                    //start bit 0
                    fe();
                    if(mouse_timeout)
                      return 0;
                    if(MS_DATA())
                      ms_error = 1;
                    //
                    for(i = p = 0; i != 8 ; i++)
                    {
                      fe();
                      val = val>>1;
                      if(MS_DATA())
                      {
                        val |= 0x80;
                        p = !p;
                      }
                    }
                    //pairity
                    fe();
                    if(p == MS_DATA())
                      ms_error = 1;
                    //stop bit
                    fe();
                    if(!MS_DATA())
                      ms_error = 1;
                    
                    inhibitt();
                    return val;
                  }
                  // ==============================================
                  void sendps2(char value)
                  {
                  // data sent from the host to the device is read on the rising edge.
                    char p = 0,i;
                    char t , mouse_wait;
                    inhibitt();
                    _delay_us(100);
                    requ();
                    
                    for( i = 0 ; i != 8 ; i++ )
                    {
                      fe();
                      t = !(value & 1<<i);
                  		
                  		if( t ){MS_DATA0();}else{MS_DATA1();}
                      
                      if(t)
                        p++;
                    }
                    
                    fe();
                    //send pairity
                  	if(p && 1){MS_DATA0();}else{MS_DATA1();}
                    fe();
                    //get ack
                    MS_DATA1();
                    for( i = 0; i < 0xff ; i++ )
                    {
                      for(mouse_wait = 0 ; mouse_wait != 0xff; mouse_wait++)
                        {
                          if(!MS_DATA())
                          {
                            mouse_timeout = 0;
                            i = mouse_wait = 0xfe;
                          }
                          else
                            mouse_timeout = 1;
                        }
                      _delay_us(1);
                    }
                    fe();
                    //
                    inhibitt();
                  }
                  //==========================================
                  void init_mouse()
                  {
                    char i;
                  
                  	mouse_x = mouse_y = mouse_btn = 0;
                  	mouse_timeout = mouse_inited = ms_error = 0;
                  	
                    for( i = 0; i < 10 ; i++ )
                    {
                      mouse_inited = ms_error = 0;
                      //reset
                      sendps2(0xff);
                      //ack
                      if(getps2() != MOUSE_ACK)
                        ms_error = 1;
                      if(getps2() != 0xaa)
                        ms_error = 1;
                      if(getps2() != 0x00)
                        ms_error = 1;
                      //enable data reporting
                      sendps2(MOUSE_ENABLE_REPORT);
                      if(getps2() != MOUSE_ACK)
                        ms_error = 1;
                      if(!ms_error)
                      {
                        mouse_inited = 1;
                        return;
                      }
                    }
                  }
                  // ==============================================
                  void update_mouse()
                  {
                    static char timeout_counter = 0;
                    char t , t2;
                    
                    if(!mouse_inited)
                    {
                      init_mouse();
                      return;
                    }
                    t = getps2();
                  	if(ms_error)
                  		return;
                    
                    if(mouse_timeout || ms_error)
                    {
                      timeout_counter++;
                      if(timeout_counter == 0xff)
                        init_mouse();
                      mouse_timeout = ms_error = 0;
                      return;
                    }
                    timeout_counter = 0;
                    //check always 1 bit
                    if(!(t & 0x08))
                      return;
                    
                    mouse_btn = t & 0x03;
                  	
                    //check x overflow
                    t2 = getps2();
                    if(ms_error)
                      return;
                    if((t & 0x40) == 0)//x overflow
                    {
                      //check x sign bit
                      mouse_x = t2>>1;
                      if( t & 0x10 )
                        mouse_x |= 0x80;
                    }
                  
                    //check y overflow
                    t2 = getps2();
                    if(ms_error)
                      return;
                    if((t & 0x80) == 0)//y overflow
                    {
                      //check y sign bit
                      mouse_y = t2>>1;
                      if( (t & 0x20) )
                        mouse_y |= 0x80;
                  		mouse_y = -mouse_y;
                    }
                  	idlee();
                  	_delay_ms(1);
                  	inhibitt();
                  }
                  // ==============================================
                  #endif
                  بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                  اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                  دیدگاه

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