{"id":259,"date":"2017-11-23T00:19:18","date_gmt":"2017-11-22T23:19:18","guid":{"rendered":"http:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=259"},"modified":"2017-12-30T19:24:51","modified_gmt":"2017-12-30T18:24:51","slug":"30-ps2_mouse-library-stm32f4","status":"publish","type":"page","link":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=259","title":{"rendered":"30-PS2_Mouse-Library (STM32F4)"},"content":{"rendered":"<p><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-previous\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=257\" title=\"29-PS2_Keyboard-Library (STM32F4)\"><span class=\"meta-nav\">\u2190<\/span> 29-PS2_Keyboard-Library (STM32F4)<\/a><\/div><\/div><!-- #nav-below --><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-next\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=380\" title=\"31-USB_CDC-Library (STM32F4)\">31-USB_CDC-Library (STM32F4) <span class=\"meta-nav\">&rarr;<\/span><\/a><\/div><\/div><!-- #nav-below --><\/p>\n<p>Mit dieser Library kann eine PS2-Maus an die\u00a0STM32F4-CPU angeschlossen werden.<\/p>\n<p>Zum Betrieb wird eine externe Interrupt-Leitung und ein normaler GPIO-Pin ben\u00f6tigt. Ich habe PB7 und PA8 am Discovery-Board benutzt.<\/p>\n<p>Die Maus muss nach dem Init gepollt werden und liefert in einer Struktur die Koordinaten Werte f\u00fcr die X- und Y-Achse, den Status von zwei Maustasten und falls es eine Intelli-Maus ist noch den Wert der Z-Achse, was dem Mausrad entspricht.<br \/>\n<em>Hinweis : Die Maus braucht nach PowerOn ca 500ms bevor sie bereit ist.<\/em><\/p>\n<p>Mann kann (bzw. muss) f\u00fcr alle 3 Achsen einen Maximumwert im H-File einstellen, damit kein \u00dcberlauf entstehen kann. Ich hab im Moment die Aufl\u00f6sung vom Display (320\u00d7240) eingestellt\u2026die Zahlen sind aber beliebig.<\/p>\n<p>Die Maus die ich hier habe l\u00e4uft nur mit 5V. Ich hab sie direkt an die GPIOs angeschlossen (ohne Pegelwandler) das scheint zu funktionieren.<\/p>\n<p>Wegen der Interrupt-Leitung wird auch die Library \u201cSTM32_UB_EXT_INT5TO9\u2033 ben\u00f6tigt.<\/p>\n<p><strong>PS2-Steckerbelegung :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/04\/ps2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1214\" src=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/04\/ps2-203x300.jpg\" alt=\"ps2\" width=\"203\" height=\"300\" \/><\/a><\/p>\n<p><strong>Benutzte Pins :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">Clock an PB7 (per externem Interrupt-7)\r\nData an PA8<\/pre>\n<p><strong>Voraussetzungen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">Benutzte Module der CooCox-IDE : GPIO\r\nBenutzte Librarys : STM32_UB_EXT_INT5TO9<\/pre>\n<p><strong>Enumerationen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  MOUSE_INAKTIV = 0,    \/\/ Mouse abgeschaltet\r\n  MOUSE_AKTIV,          \/\/ Mouse eingeschaltet\r\n  MOUSE_NEW_DATA        \/\/ Neue Daten vorhanden\r\n}PS2_MOUSE_STATUS_t;<\/pre>\n<p><strong>.<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  MOUSE_SPEED_10 =0,    \/\/ 10 Messungen pro sek (100ms)\r\n  MOUSE_SPEED_20,       \/\/ 20 Messungen pro sek (50ms)\r\n  MOUSE_SPEED_40,       \/\/ 40 Messungen pro sek (25ms)\r\n  MOUSE_SPEED_60,       \/\/ 60 Messungen pro sek (16,6ms)\r\n  MOUSE_SPEED_80        \/\/ 80 Messungen pro sek (12,5ms)\r\n}PS2_MOUSE_SPEED_t;<\/pre>\n<p><strong>.<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  BTN_RELEASED =0,      \/\/ Taste losgelassen\r\n  BTN_PRESSED           \/\/ Taste bet\u00e4tigt\r\n}PS2_MOUSE_BTN;<\/pre>\n<p><strong>Struktur der Mausdaten :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef struct {\r\n  PS2_MOUSE_BTN btn_left;     \/\/ Status der linken Maustaste\r\n  PS2_MOUSE_BTN btn_right;    \/\/ Status der rechten Maustaste\r\n  uint16_t xpos;              \/\/ aktuelle X-Pos\r\n  uint16_t ypos;              \/\/ aktuelle Y-Pos\r\n  uint16_t zpos;              \/\/ aktuelle Z-Pos (Mausrad)\r\n}PS2_MOUSE_DATA_t;\r\nPS2_MOUSE_DATA_t PS2_MOUSE_DATA;<\/pre>\n<p><strong>Funktionen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">void UB_PS2_Mouse_Init(void);                            \/\/ zum initialisieren der Maus\r\nErrorStatus UB_PS2_Mouse_Start(PS2_MOUSE_SPEED_t mode);  \/\/ zum aktivieren der maus\r\nPS2_MOUSE_STATUS_t UB_PS2_Mouse_GetData(void);           \/\/ zum Abfragen der Mausdaten<\/pre>\n<p><strong>Beispiel :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">\/\/--------------------------------------------------------------\r\n\/\/ File     : main.c\r\n\/\/ Datum    : 03.04.2013\r\n\/\/ Version  : 1.0\r\n\/\/ Autor    : UB\r\n\/\/ EMail    : mc-4u(@)t-online.de\r\n\/\/ Web      : www.mikrocontroller-4u.de\r\n\/\/ CPU      : STM32F4\r\n\/\/ IDE      : CooCox CoIDE 1.7.0\r\n\/\/ Module   : CMSIS_BOOT, M4_CMSIS_CORE\r\n\/\/ Funktion : Demo der PS2-Mouse-Library\r\n\/\/ Hinweis  : Diese zwei Files muessen auf 8MHz stehen\r\n\/\/              \"cmsis_boot\/stm32f4xx.h\"\r\n\/\/              \"cmsis_boot\/system_stm32f4xx.c\"\r\n\/\/--------------------------------------------------------------\r\n\r\n#include \"main.h\"\r\n#include \"stm32_ub_ps2_mouse.h\"\r\n#include \"stm32_ub_led.h\"\r\n\r\nvoid Delay(volatile uint32_t nCount)\r\n{\r\n  while(nCount--)\r\n  {\r\n  }\r\n}\r\n\r\nint main(void)\r\n{\r\n  PS2_MOUSE_STATUS_t check;\r\n\r\n  SystemInit(); \/\/ Quarz Einstellungen aktivieren\r\n\r\n  \/\/ Init der LEDs\r\n  UB_Led_Init();\r\n\r\n  \/\/ Init der PS2-Maus\r\n  UB_PS2_Mouse_Init();\r\n\r\n  \/\/ kleine Pause\r\n  Delay(50000000);\r\n\r\n  \/\/ PS2-Maus aktivieren (10 samples\/sec)\r\n  UB_PS2_Mouse_Start(MOUSE_SPEED_10);\r\n\r\n  while(1)\r\n  {\r\n    \/\/ Maus-Daten abfragen\r\n    check=UB_PS2_Mouse_GetData();\r\n    if(check==MOUSE_INAKTIV) {\r\n      UB_Led_On(LED_RED); \/\/ keine Maus vorhanden\r\n    }\r\n    else if(check==MOUSE_NEW_DATA){\r\n      UB_Led_Toggle(LED_GREEN); \/\/ neue Daten vorhanden\r\n\r\n      \/\/ Blaue LED mit linker Maustaste ein\/ausschalten\r\n      if(PS2_MOUSE_DATA.btn_left==BTN_PRESSED) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>Hier die Library zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/04\/ub_stm32f4_ps2_mouse_v100.zip\">ub_stm32f4_ps2_mouse_v100<\/a><\/p>\n<p>Hier der komplette CooCox-Projektordner zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/04\/Demo_30_PS2_MOUSE.zip\">Demo_30_PS2_MOUSE<\/a><\/p>\n<h3 id=\"comments-title\">3 Antworten auf <em>30-PS2_Mouse-Library (STM32F4)<\/em><\/h3>\n<ol class=\"commentlist\">\n<li id=\"li-comment-1413\" class=\"comment even thread-even depth-1\">\n<div id=\"comment-1413\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/49ede02f2320eb7f39cde91ebae95068?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Pavel Negrobov<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">25. Februar 2014 um 12:14<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hi. I don\u2019t know German, so I will write English. Sorry, it\u2019s some bad, I am russian.<\/p>\n<p>I tried your PS\/2 mouse with my STM32F4Discovery. And I got very different results with my 5 different PS\/2 mouses.<br \/>\n1. Old Genius Netscroll+Eye optical mouse, approximately 2002 year release. Driver works very fine.<br \/>\n2. Old ball mouse without wheel from end 199x years. Don\u2019t works, because it is not Intellimouse, it is standard mouse, and don\u2019t understand F2h command. Your driver retuns error during initialization in this case. Why? Although all decoding algorithm fine understands both types of mouses and works correctly. I fixed it:<br \/>\n<code><br \/>\n\/\/ warte auf ID<br \/>\nP_PS2_Mouse_Timeout_RX ( 50000 );<br \/>\n\/\/      if(P_PS2_Mouse_Timeout_RX(50000)==ERROR)<br \/>\n\/\/      return(ERROR);<br \/>\n3. Two modern Logitech RX250 USB\/PS2 mouses. One of them works, other - not. I still do not understand why.<br \/>\n4. Modern PS\/2 mouse, marked as \"Trust\". Does not work. I researched this mouse a little. On your driver it does not generate interrupt. I some rewrite P_PS2_Mouse_Send procedure:<br \/>\nstatic ErrorStatus P_PS2_Mouse_Send ( uint8_t dataByte )<br \/>\n{<br \/>\nGPIO_InitTypeDef GPIO_InitStruct;<\/code><\/p>\n<p>PS2_MOUSE_VAR.receive_code = 0;<\/p>\n<p>\/\/ \u0420\u0435\u0436\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438<br \/>\n\/\/ PA3 (\u0434\u0430\u043d\u043d\u044b\u0435) &#8211; \u0432\u044b\u0445\u043e\u0434<br \/>\nP_PS2_Mouse_SetGPIO_TX ( );<\/p>\n<p>\/\/ PA4 (CLK) &#8211; \u0432\u044b\u0445\u043e\u0434<br \/>\nGPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;<br \/>\nGPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;<br \/>\nGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br \/>\nGPIO_InitStruct.GPIO_OType = GPIO_OType_PP;<br \/>\nGPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;<br \/>\nGPIO_Init ( GPIOA, &amp;GPIO_InitStruct );<\/p>\n<p>\/\/ PA3, PA4 := 1<br \/>\nGPIO_SetBits ( GPIOA, GPIO_Pin_3 );\/\/ Data := 1<br \/>\nGPIO_SetBits ( GPIOA, GPIO_Pin_4 );\/\/ Clk := 1<\/p>\n<p>delay ( 300 );\/\/ 300 mks<br \/>\nGPIO_ResetBits ( GPIOA, GPIO_Pin_4 );\/\/ Clk := 0<br \/>\ndelay ( 300 );\/\/ 300 mks<br \/>\nGPIO_ResetBits ( GPIOA, GPIO_Pin_3 );\/\/ Data := 0<br \/>\ndelay ( 10 );\/\/ 10 mks<br \/>\nGPIO_SetBits ( GPIOA, GPIO_Pin_4 );\/\/ CLK := 1<\/p>\n<p>PS2_MOUSE_VAR.mode = TX_MODE;\/\/ Transmit mode<br \/>\nPS2_MOUSE_VAR.send_code = dataByte;<br \/>\nPS2_MOUSE_VAR.receive_code = 0;<\/p>\n<p>\/\/ PA4 &#8211; Clk := 1<br \/>\nGPIO_SetBits ( GPIOA, GPIO_Pin_4 );<\/p>\n<p>UB_Ext_INT4_Init ( );<\/p>\n<p>if ( P_PS2_Mouse_Timeout_TX ( 50000 ) == ERROR )<br \/>\nreturn ERROR;<\/p>\n<p>if ( P_PS2_Mouse_Timeout_RX ( 50000 ) == ERROR )<br \/>\nreturn ERROR;<\/p>\n<p>if ( PS2_MOUSE_VAR.receive_code != PS2_MOUSE_CMD_ACK )<br \/>\nreturn ERROR;<\/p>\n<p>return SUCCESS;<br \/>\n} \/\/ P_PS2_Mouse_Send<\/p>\n<p>This algorithm taken from some Arduino code.<br \/>\nAfter this I received all interrupts, but most mouse commands returns undocumented code F8h or FCh \u2013 error.<\/p>\n<p>What are you think about this?<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-1414\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-2\">\n<div id=\"comment-1414\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">25. Februar 2014 um 19:51<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>hi,<br \/>\n2.) the Command F2h \u201cGet Device ID\u201d is a standard PS\/2 Command. see <a href=\"http:\/\/www.computer-engineering.org\/ps2mouse\/\" rel=\"nofollow\">http:\/\/www.computer-engineering.org\/ps2mouse\/<\/a> . the mouse MUST send a answer. The only unknown is the delay time between the request and the answer from the mouse. To spare a timer i used only a for-n loop\u2026so try to increment the delay and check if the mouse send an ID-Code. Without receiving a valid ID-Code my driver set an error. \u201cMOUSE_TYP_UNKNOWN\u201d<\/p>\n<p>4.) a return code FCh is a \u201cerror\u201d or \u201cNACK\u201d command from the mouse.<\/p>\n<p>sorry, but i didn\u2019t spent a lot of time in this library, so you must fix this at your own. I think the delay times are a point to start. and read the doku i linked maybe my software is not 100% implemented the right protocol.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-1415\" class=\"comment even thread-odd thread-alt depth-1\">\n<div id=\"comment-1415\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/49ede02f2320eb7f39cde91ebae95068?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Pavel Negrobov<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">25. Februar 2014 um 20:31<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Thanks.<br \/>\nIf I got new results of my researches, I shall write this.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Mit dieser Library kann eine PS2-Maus an die\u00a0STM32F4-CPU angeschlossen werden. Zum Betrieb wird eine externe Interrupt-Leitung und ein normaler GPIO-Pin ben\u00f6tigt. Ich habe PB7 und PA8 am Discovery-Board benutzt. Die Maus muss nach dem Init gepollt werden und liefert in &hellip; <a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=259\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":144,"menu_order":30,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[128],"tags":[9,67,7],"class_list":["post-259","page","type-page","status-publish","hentry","category-stm32f4","tag-library","tag-ps2-maus","tag-stm32f4"],"_links":{"self":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=259"}],"version-history":[{"count":3,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/259\/revisions"}],"predecessor-version":[{"id":1568,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/259\/revisions\/1568"}],"up":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/144"}],"wp:attachment":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}