Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 01:23

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 21 ] 
Автор Сообщение
 Заголовок сообщения: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 10 мар 2020, 11:15 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
Приветствую. Имеется девайс - конвертер, который позволяет подключить ко всяким старым компам (и не только старым и не только компам) PS/2 мышки. С девайсом имеется ряд проблем. Описание ниже:
1. Девайс подключается не к ПЦ, а к одному старому Спектрум-клону (Спринтер).
2. На Спринтере для работы с компортовой мышкой в досе есть драйвер. Настоящая мышка (испытывал 3 разных экземляров, 2 потом чуть позже померли совсем, последняя ещё пока живая, но тоже скоро на помойку улетит по механическим причинам) работает как часы - никаких зависаний, затупов и прочее (исключение только механические проблемы у самой мышки). протокол тут стандартный - Microsoft Mouse.
3. При подключении девайса начинаются зависания. В драйвере есть опрос ком порта на предмет данных от мышки. Сначала опрашивается регистр статуса ком порта. Если там бит D0 = 1, значит на порту данных есть данные. Читаю первый байт. Перед чтением второго и третьего байт так же проверяется регистр статуса. Это делается потому, что читать данные от мышки подряд нельзя, скорость порта 1200 бод. Значит есть некая паузка между байтами пакета (пакет состоит из 3х байт) и чтобы не пропустить данные введена проверка статуса между байтами. На реальной мышке никаких затупов нет, но с конвертором беда - на втором или третьем байте происходит потеря данных или конвертор делает отправку не полного пакета. Т.е. зависание происходит на стадии опроса регистра статуса ком порта со стороны драйвера в досе. получается бесконечный цикл до тех пор, пок ане пошевелишь мышкой. Пошевелил, комп продолжает работать. пошевелил ещё, завис опять. и так постоянно. Имея в наличии исходники конвертора (СИ код) я 3 дня потратил на его изучение и попытку всё причесать. Но незнание самой атмеги явно накладывает свой отпечаток. Архив с исходником (main.c) во вложении. Глаз у меня уже замылен и не могу что0либо придумать. Прошу помощи у Уважаемых гуру АВРок. Где может быть косяк?

Ещё раз напоминаю (и делаю на этом акцент) - настоящая компортовая мышь работает без нареканий, запинок, затупов и прочего. И только с конвертором косяк вот такой.


Вложения:
src_ps2+to_serial.zip [8.09 Кб]
Скачиваний: 63
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 10 мар 2020, 21:21 
Заглядывает иногда

Зарегистрирован: 30 янв 2020, 14:02
Сообщения: 55
Видимо важно соблюсти тайминги между передачей байтов. А вообще правильнее засниффить realmouse и сравнить с fakemouse с времянками и прочими нюансами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 10 мар 2020, 21:32 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
YFT писал(а):
Видимо важно соблюсти тайминги между передачей байтов. А вообще правильнее засниффить realmouse и сравнить с fakemouse с времянками и прочими нюансами.

я было тоже про тайминги думал, но, как я описал выше, драйвер имеет ожидание бита в регистре статуса, что данные уже летят. т.е. вроде как если прилетает с сильной задержкой, так нет. данных просто нет.
Код:
;Формат данных от MS Mouse
;7  6  5  4  3  2  1  0
;0  1  L  R Y7 Y6 X7 X6
;0  0 X5 X4 X3 X2 X1 X0
;0  0 Y5 Y4 Y3 Y2 Y1 Y0
mouse_read:   in   a,(m_status)
      rrca            ;D0 = есть данные для чтения
      ret   nc

      in a,(m_data)         ;левая и правая кнопки, Y7, Y6, X7, X6
      bit 6,a            ;первый байт пакета?
      ccf
      ret z            ;нет, выходим
      and 3fh            ;иначе читаем первый байт
      ld e,a
      in a,(m_status)         ;снова ожидаем D0
      rrca
      jr nc,$-3         ;*** ждать будем пока не прилетит
      in a,(m_data)         ;X5..X0
      bit 6,a
      ccf
      ret nz
      and 3fh
      ld l,a
      in a,(m_status)
      rrca
      jr nc,$-3         ;***
      in a,(m_data)         ;Y5..Y0
      bit 6,a
      ccf
      ret nz
      and 3fh
      ld h,a



комментарии с пометкой *** как раз есть те места, где происходит зависание, т.е. при ожидании 2го или 3го байта. от сюда вопрос - какие тайминги могут не совпадать, что происходит потеря байта?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 11 мар 2020, 13:01 
Заглядывает иногда

Зарегистрирован: 30 янв 2020, 14:02
Сообщения: 55
Возможно там нужна фиксированная задержка, ни больше ни меньше? Неужели сложно встать копеечным анализатором и сравнить? Наверняка всё наглядно будет ясно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 11 мар 2020, 14:04 
Заглядывает иногда

Зарегистрирован: 22 мар 2012, 21:55
Сообщения: 89
Откуда: г.Пермь
del


Последний раз редактировалось emax 13 мар 2020, 13:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 11 мар 2020, 15:11 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
emax писал(а):
собрал, нашел ps/2 мышь , откомпилил, просто зашил. Посмотрел как работает. Сразу бросается в глаза, что нет пакетной синхронизации. Данные обрабатываются сплошным потоком. Для большого компа это пойдет, а вот Ваш (спековский) драйвер четко делит пакеты. В этом и проблема.

я так подозреваю, что разбирать внутри атмеги весь поток от ПС/2 мышки на пакеты и отправлять тоже пакетно будет весьма накладно. на больших компах тоже в драйвере есть разбор пакета по байтам. а иначе как понять в каком из байт будут кнопки, а в каком координаты?!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 11 мар 2020, 15:22 
Заглядывает иногда

Зарегистрирован: 22 мар 2012, 21:55
Сообщения: 89
Откуда: г.Пермь
del


Последний раз редактировалось emax 13 мар 2020, 13:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 11 мар 2020, 16:19 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
emax писал(а):
Sayman писал(а):
я так подозреваю, что разбирать внутри атмеги весь поток от ПС/2 мышки на пакеты и отправлять тоже пакетно будет весьма накладно. на больших компах тоже в драйвере есть разбор пакета по байтам. а иначе как понять в каком из байт будут кнопки, а в каком координаты?!


не сложно, попробую поправить. Что лишнего можно выбросить пока?
- поддержка колесика
- поддержка средней кнопки
- протокол EM84520
- переход к загрузчику
- изменение скорости на ходу.
- отладчик.

дааа, это всё лишнее. там же попутно заметные баги, это типа RS232_BUF_SIZE 512, хотя переменная размера буфера uint8_t, т.е. 8 бит, не влезает туда 512. переменные ps2m_x, ps2m_y зачем то uint16_t, при этом 9й бит протокола PS/2 не обрабатывается:
https://wiki.osdev.org/PS/2_Mouse
в первом байте, биты D5 - D4. это признак знака в "координатах" мышки. а в коде я не увидел их обработку.
я пробовал делать так:
Код:
//сначала зачитал в ps2_byte1, ps2_byte2, ps2_byte3 все 3 байта данных, а потом
   ps2m_buttons = ps2m_byte1 & 3;                     //правая и левая кнопки (D1 - D0)
   ps2m_x = ((ps2m_byte2 & 0xfe) >> 1) | ((ps2m_byte1 & 0x10) << 3);      //D4 = 9bit = sign for X coord
   ps2m_y = -1*(((ps2m_byte3 & 0xfe) >> 1) | ((ps2m_byte1 & 0x20) << 2));      //D5 = 9bit = sign for Y coord
   ps2m_byte1 = 0;
   ps2m_byte2 = 0;
   ps2m_byte3 = 0;

так будет явно более правильно и соответствовать координатам компортовой мышки. и всё бы ничего, но эта бесявая пауза, зависание вымораживает.
если сможешь подправить, будет здорово!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 11 мар 2020, 17:04 
Заглядывает иногда

Зарегистрирован: 30 янв 2020, 14:02
Сообщения: 55
Sayman писал(а):
emax писал(а):
собрал, нашел ps/2 мышь , откомпилил, просто зашил. Посмотрел как работает. Сразу бросается в глаза, что нет пакетной синхронизации. Данные обрабатываются сплошным потоком. Для большого компа это пойдет, а вот Ваш (спековский) драйвер четко делит пакеты. В этом и проблема.

я так подозреваю, что разбирать внутри атмеги весь поток от ПС/2 мышки на пакеты и отправлять тоже пакетно будет весьма накладно. на больших компах тоже в драйвере есть разбор пакета по байтам. а иначе как понять в каком из байт будут кнопки, а в каком координаты?!


Saleae Logic умеет расшифровывать пакеты PS/2 mouse, коробочки по 200-300р в изобилии на али.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 11:24 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
Подключил реальную мышку к ПЦ, включил hyper terminal. Мышка ВСЕГДА посылает пакеты по 3 байта!
Подключил fake mouse (конвертер). ВУАЛЯ - пакет битый, то 3 байта, то 2 байта. последний третий байт не прилетает.
так что на ПЦ тоже есть проблема с этим конвертором.

про логические анализаторы - я не железячник, к сожалению, как ими пользоваться даже примерно не представляю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 13:24 
Заглядывает иногда

Зарегистрирован: 30 янв 2020, 14:02
Сообщения: 55
Sayman писал(а):
Подключил реальную мышку к ПЦ, включил hyper terminal. Мышка ВСЕГДА посылает пакеты по 3 байта!
Подключил fake mouse (конвертер). ВУАЛЯ - пакет битый, то 3 байта, то 2 байта. последний третий байт не прилетает.
так что на ПЦ тоже есть проблема с этим конвертором.

про логические анализаторы - я не железячник, к сожалению, как ими пользоваться даже примерно не представляю.

Там ничего сложного, ребенок разберется. Кодовое слов поиска "Saleae". Ну, по крайней мере, круг поиска сузился.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 15:07 
Заглядывает иногда

Зарегистрирован: 22 мар 2012, 21:55
Сообщения: 89
Откуда: г.Пермь
del


Последний раз редактировалось emax 13 мар 2020, 13:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 15:33 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
emax писал(а):
как то так

очень жаль, но не работает. 0 реакции на мои шевеления мышкой.
на всякий случай:
http://trolsoft.ru/ru/sch/mouse-ps2-to-serial
это и есть этот конвертер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 16:40 
Заглядывает иногда

Зарегистрирован: 22 мар 2012, 21:55
Сообщения: 89
Откуда: г.Пермь
del


Последний раз редактировалось emax 13 мар 2020, 13:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 18:07 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
emax писал(а):
а фьузы, как поставили? Как в статье? WDTON отключите. Проверил на мышках, которые нашел, с шариком и оптической, работает.

да, все фьюзы как в статье. WDTON - отключить собаку?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 18:13 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 5038
Откуда: Кемеровская область, Киселевск
ты не знаешь для чего WDTON? че спрашиваешь то каждое слово

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 19:28 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
Oxford писал(а):
ты не знаешь для чего WDTON? че спрашиваешь то каждое слово

а чё нервничать-то? я же написал, что не железячник, в атмегах не разбираюсь. где и какие фьюзы и зачем они тоже не знаю. поэтому и спрашиваю. в коде оригинальном вижу инициализацию (включение) собаки. предположение моё было, что включается программно, а оно ещё и галочкой при прошивки можно врубать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 12 мар 2020, 19:48 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 5038
Откуда: Кемеровская область, Киселевск
Ну раз полез в мк изучай. Мануал есть открой прочитай.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 13 мар 2020, 09:01 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
выключил собаку. байты в порт полетели, но 3й байт по прежнему не отправляется это во1х, и во в2х, вместо координат мышки и кнопок летит просто какая-то фигня. подключил конвертер к ПЦ - мышь не работает там вообще, а ГТ так же показывает потерю (периодическую) третьего байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 13 мар 2020, 09:52 
Заглядывает иногда

Зарегистрирован: 22 мар 2012, 21:55
Сообщения: 89
Откуда: г.Пермь
del


Последний раз редактировалось emax 13 мар 2020, 13:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMEGA8 ps/2 to serial mouse адаптер
СообщениеДобавлено: 13 мар 2020, 13:14 
Только пришел

Зарегистрирован: 10 мар 2020, 11:01
Сообщения: 10
emax писал(а):
Sayman писал(а):
выключил собаку. байты в порт полетели, но 3й байт по прежнему не отправляется это во1х, и во в2х, вместо координат мышки и кнопок летит просто какая-то фигня. подключил конвертер к ПЦ - мышь не работает там вообще, а ГТ так же показывает потерю (периодическую) третьего байта.


был мой косяк с маской, попробуйте этот вариант.
Формат для перемещения в обратную сторону надо все равно проверять в каком коде передается, но в одну сторону работать должно.

в данном коде не только в маске проблема, там в целом посылаются данные которые ничему не соответствуют.
решил попробовать разобраться сам и сразу сел в лужу. ниже приведён пример кода - решил пойти с самого начала - обработка прерываний от ПС2 мышки. прерывания не приходят, светодиод не загорается. Вроде всё сделано по мануалу, все порты настроил, прерывания врубил, но шевеля мышкой ничего не происходит.
Код:
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
#include <avr/wdt.h>

#define F_CPU               16000000
#define DEBUG               0

#include <util/delay.h>

#include "debug.h"
#include "stddef.h"


#define led_enable()      PORTD |= _BV(5);
#define led_disable()      PORTD &= ~_BV(5);


#define PS2_CLK_PORT            D            // Ножка к которой подлючен тактовый сиг. PS/2
#define PS2_CLK_PIN               2
#define PS2_DATA_PORT            D            // Ножка к которой подлючен сигнал данных PS/2
#define PS2_DATA_PIN            4


// Включить светодиод
void flash_led()
{
   led_enable();
   TCNT2 = 0x00;
   TCCR2 = _BV(CS22)|_BV(CS21)|_BV(CS20);         // делитель на 1024
}


// Изменение тактового сигнала PS/2
ISR (INT0_vect)
{
   uint8_t a;

   flash_led();
   for(a=0; a>=255; a++);
}


// Выключение светодиода через некоторое время
ISR (TIMER2_OVF_vect)
{
   TCCR2 = 0;
   led_disable();
}

//---------------------------------------------------------------------------------
static void init(void)
{
   // Настройка портов ввода-вывода и подтягивающих резисторов
   DDRB = 0;
   DDRB = _BV(5);
   DDRC = 0;
   PORTC = _BV(0)|_BV(1)|_BV(2);
   
   DDRD = _BV(5);
   PORTD = 0;

   // Таймер 2
   ASSR = 0;
   OCR2 = 0;

   // Timer(s)/Counter(s) Interrupt(s) initialization
   TIMSK = 0;
   
   // Включаем прерывания от таймеров 2
   TIMSK = _BV(TOIE2);
   TCNT2 = 0x00;
   TCCR2 = _BV(CS22)|_BV(CS21)|_BV(CS20);         // делитель на 1024

   // Analog Comparator initialization
   // Analog Comparator: Off
   // Analog Comparator Input Capture by Timer/Counter 1: Off
   ACSR = ~_BV(ACD);
   SFIOR = 0;

   // Включение прерываний
//   sei();
}

// Инициализация PS/2
void ps2_init(void)
{
   uint16_t a;

   // Переключаем PS/2 порт на приём
   DDR(PS2_CLK_PORT) &= ~_BV(PS2_CLK_PIN);
   DDR(PS2_DATA_PORT) &= ~_BV(PS2_DATA_PIN);

   // Прерывание по срезу тактового сигнала
   GIFR = _BV(INTF0);
   GICR |= _BV(INT0);
//   MCUCR = (MCUCR & 0xFC) | 2;
   
   MCUCR = 2;
}


void main(void)
{
   uint8_t a;

   cli();

   init();
   ps2_init();

   sei();

   for(;;) {
      a++;
      _delay_ms(20);
   }

}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB