Важная информация

User Tag List

Страница 45 из 54 ПерваяПервая ... 414243444546474849 ... ПоследняяПоследняя
Показано с 441 по 450 из 531

Тема: Контроллер клавиатуры для "Пентагон-128" на ATMega8/48/88/168/328

  1. #441

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Спасибо, информация ценная.
    Я вот что ещё нашёл:
    https://osdev.fandom.com/ru/wiki/%D0...%81%D0%B0_PS/2

    Здесь как раз описан сам процесс передачи непосредственно байта информации, как нужно управлять линиями Clock и Data, что ожидать на этих линиях при приёме байта от клавиатуры, какие паузы требуется выжидать после каждой смены уровня сигнала. Для начала я хочу проверить и убедиться, насколько согласованно происходит управление и прослушивание линий Clock и Data. И если там всё в порядке, тогда перейду к изучению непосредственно передаваемых кодов.
    Последний раз редактировалось Northwood; 21.04.2020 в 23:21.
    С уважением, Александр

  2. #442

    Регистрация
    30.08.2010
    Адрес
    Санкт-Петербург
    Сообщений
    1,263
    Спасибо Благодарностей отдано 
    53
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    163 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Northwood Посмотреть сообщение
    если кто-нибудь кинет в меня ссылкой на описание стандарта, по которому должно происходить взаимодействие контроллера с клавиатурой, то буду премного благодарен.
    http://abzac.retropc.ru/content?id=421

    Этот пользователь поблагодарил krotan за это полезное сообщение:

    Northwood(22.04.2020)

  3. #443

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ура! Победил прошивку 5.5, удалось заставить её работать с моей клавиатурой "A4 Tech KL-7MU"

    Вся проблема оказалась в неверных задержках - они оказались слишком малы.
    Сам алгоритм взаимодействия с клавиатурой оказался правильным, всё соответствует описанному протоколу PS/2.

    Но!

    1) Я сравнил реальные задержки в паузах перед началом передачи 11-битного пакета после установки 0 на линиях CLK и Data, с учётом установленной константы задержки для кварца 20 МГц, с необходимыми паузами в описании PS/2, и они оказались в 1,5 раза меньше необходимого. Правильные задержки получились после изменения константы как для кварца 32 МГц. Но это не помогло.

    2) Изучив в документации детально процесс обмена данных между клавиатурой и хостом, как я уже говорил раньше, я повесил светодиоды на порт B и на разных этапах зажигал тот или иной светодиод, чтобы выяснить, в каком месте обмен зависает. И вот тут оно мне повыносило мозг:

    а) когда я в прошивке повесил включение 1-го светодиода после выхода из подпрограммы "KBD_SEND_BYTE" (после завершения передачи всего 11-битного пакета, после самой первой передачи в клавиатуру команды "сброс" - байта 0xFF), а 2-го светодиода после приёма ответа из клавиатуры, то оказалось, что прошивка зацикливается на самом первом этапе, т.е. во время попытки передать клавиатуре команду "сброс".
    б) но когда я повесил включение светодиодов внутри подпрограммы "KBD_SEND_BYTE" после каждого из этапов - перед началом передачи, после передачи стартового бита, после передачи 8 бит данных, после передачи бита чётности и после передачи стопового бита, то подпрограмма успешно проходила до конца. Хотя для зажигания и выключения светодиодов я не использовал регистры, всё делал побитовыми командами sbi и cbi. Убираю зажигание светодиодов - и подпрограмма зависала, поэтому выяснить, на каком конкретно этапе она зависает, не удалось. Однако, в подпрограмме "KBD_SEND_BYTE" в нескольких местах используется задержка - подпрограмма "SMALL_WAIT", и тогда я решил измерить, сколько тактов она занимает вместе с вызовом rcall - 8 тактов, и сколько занимает моя подпрограмма, которая управляет тремя светодиодами - 13 тактов. После того, как я в подпрограмме "SMALL_WAIT" дописал 5 шт NOP, тем самым добавив ей дополнительные 5 тактов, клавиатура начала нормально работать. Но всё это в совокупности с исправлением константы общей задержки.
    Последний раз редактировалось Northwood; 24.04.2020 в 23:52.
    С уважением, Александр

    Эти 2 пользователя(ей) поблагодарили Northwood за это полезное сообщение:

    krotan(25.04.2020), Shofer(10.04.2023)

  4. #444

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У меня есть две клавиатуры PS/2, одна более старая - "A4 Tech KL-7MU", она работает без вопросов, а вторая более новая - "A4 Tech KL-23MU", и с ней имеются проблемы. Вторая клавиатура не работает ни на старой прошивке версии 1.3, ни на новой.

    Напомню, что изначально с версией 5.5 у меня не заработала ни одна клавиатура, пришлось увеличить задержку в подпрограмме SMALL_WAIT, и как я понял, это особенность работы конкретного микроконтроллера ATmega48PA-PU - после того как подержали в 0 KB_CLK, потом сигнал отпустили, переведя 5-й бит порта C в режим чтения и уровень 1 обеспечивается резистором подтяжки на плате контроллера, то эта 1 не сразу начинает считываться из порта PinC, для этого и вызывалось короткое ожидание SMALL_WAIT. Особенностью МК ATmega48PA-PU является то, что это время ожидание пришлось увеличить с 8 до 13 тактов.

    И так, клавиатура "A4 Tech KL-7MU", как я сообщил ещё несколько дней назад, заработала нормально. Но попробовал снова подключить клавиатуру "A4 Tech KL-23MU" и она не смотря ни на что не захотела работать.

    Удалось выяснить, что не удаётся передать команду "сброс" (байт 0xFF):
    Подержали в течении 100 мкс в нуле CLK и Data, отпустили CLK, далее клавиатура выдаёт 1-й тактовый импульс: дождались 0 на CLK, мы передаём 1-й бит данных (уровень 1 из байта 0xFF), клавиатура выдала 1 на CLK, а далее тактовые импульсы из клавиатуры прекращаются. Т.е. всё стопорится после передачи 1-го бита из команды 0xFF (сброс), МК зависает на вечном ожидании 0 на CLK.

    Если вначале работы прошивки я убираю выдачу команды "сброс", а сразу начинаю основной цикл работы с клавиатурой, то клавиатура нормально работает, кроме индикаторов - они не горят. Т.е. клавиатура игнорирует любые попытки зажечь индикаторы, но нормально считываются все нажатые клавиши.
    Последний раз редактировалось Northwood; 29.04.2020 в 13:41.
    С уважением, Александр

    Эти 2 пользователя(ей) поблагодарили Northwood за это полезное сообщение:

    Gesha86PK(22.02.2022), Shofer(10.04.2023)

  5. #445

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Northwood Посмотреть сообщение
    Удалось выяснить, что не удаётся передать команду "сброс" (байт 0xFF):
    Подержали в течении 100 мкс в нуле CLK и Data, отпустили CLK, далее клавиатура выдаёт 1-й тактовый импульс: дождались 0 на CLK, мы передаём 1-й бит данных (уровень 1 из байта 0xFF), клавиатура выдала 1 на CLK, а далее тактовые импульсы из клавиатуры прекращаются. Т.е. всё стопорится после передачи 1-го бита из команды 0xFF (сброс), МК зависает на вечном ожидании 0 на CLK.
    Судя по картинке, 100мкс в нуле нужно держать только CLK: http://4a4ik.blogspot.com/2015/07/ps2.html .
    Еще там написано:
    0xFF (Reset) - клавиатура отвечает "подтверждаю" (ack = 0xFA), затем переходит в состояние "Reset".
    То есть после посылки команды ей нужно дать возможность прислать нам 0xFA, и только после сброса придёт 0xAA.
    Вообще очень похоже на то, что клавиатура вообще не понимает наши команды, может ей бит чётности не нравится? Или микроконтроллер меняет данные не по тому фронту...

  6. #446

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Судя по картинке, 100мкс в нуле нужно держать только CLK: http://4a4ik.blogspot.com/2015/07/ps2.html .
    На картинке одно, а в тексте немного другое:

    Когда хост желает начать передачу данных, он сначала выставляет на линии Data и Clock логические нули и удерживает их не менее 100 мкс,
    Допускаю, что на картинке временная диаграмма изображена не точно, а тексту доверия больше.

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Еще там написано:
    0xFF (Reset) - клавиатура отвечает "подтверждаю" (ack = 0xFA), затем переходит в состояние "Reset".
    То есть после посылки команды ей нужно дать возможность прислать нам 0xFA, и только после сброса придёт 0xAA.
    Вообще очень похоже на то, что клавиатура вообще не понимает наши команды, может ей бит чётности не нравится? Или микроконтроллер меняет данные не по тому фронту...
    Вы невнимательно прочитали:
    Команда "Reset" не отправляется вообще, тактовые импульсы со стороны клавиатуры прекращаются после первого же отправленного бита, который = 1.

    Но если в передаваемой команде последний бит = 0, например, команда 0xF0 (установить Scan Code), то такая команда отправляется успешно.
    Но эта клавиатура глючит и на ПЦ. Она периодически самопроизвольно сбрасывается, из-за чего каждый день по десять раз в день приходится заходить в настройки клавиатуры и восстанавливать скорость автоповтора и заново включать Num Lock. Но не уверен, что эти две проблемы связаны друг с другом.
    Последний раз редактировалось Northwood; 29.04.2020 в 20:03.
    С уважением, Александр

    Этот пользователь поблагодарил Northwood за это полезное сообщение:

    Gesha86PK(22.02.2022)

  7. #447

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Оттуда же:
    Есть 3 начальных состояния линий Data и Clock:
    Data = 1, Clock = 1 - хост ждёт данные от устройства
    Data = 1, Clock = 0 - хост хочет передать данные устройству
    Data = 0, Clock = 0 - Передача данных запрещена
    Не уверен что резкий переход из состояния 0/0 в состояние 1/1 клавиатура воспримет как наше желание отправить ей команду. Поскольку она посылает один импульс, вероятнее всего это ACK, а поскольку DATA=1, клавиатура пытается сказать что она ничего не понимает.

    PS: Невнимательно прочитал, про переход DATA в 1 не было. Может особенность клавиатуры после разрешения передачи данных отправлять один бит.
    Последний раз редактировалось blackmirror; 29.04.2020 в 21:09.

  8. #448

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Оттуда же:
    Не уверен что резкий переход из состояния 0/0 в состояние 1/1 клавиатура воспримет как наше желание отправить ей команду. Поскольку она посылает один импульс, вероятнее всего это ACK, а поскольку DATA=1, клавиатура пытается сказать что она ничего не понимает.
    Я уже пробовал и так и так:
    1) Выставляем CLK=0, пауза 5 мкс, выставляем Data=0, пауза 100 мкс, отпускаем CLK=1, пауза 13 тактов и далее ждём, когда клавиатура выставит CLK=0.
    2) Выставляем CLK=0, пауза 100 мкс, выставляем Data=0, пауза 5 мкс, отпускаем CLK=1, пауза 13 тактов и далее ждём, когда клавиатура выставит CLK=0.

    Клавиатуре "A4 Tech KL-23MU" по барабану, хоть так, хоть так, команду "Reset" передать не возможно. Стартовый бит=0 передаётся, бит0 данных=1 передаётся, а дальше CLK от клавиатуры прекращаются, хоть ты тресни, если пропустить Reset и перейти в основной цикл, то все клавиши опрашиваются, обрабатываются, клавиатурой можно пользоваться. Но индикаторы молчат.

    Клавиатуре "A4 Tech KL-7MU" тоже по барабану, хоть так, хоть так работает отлично, без каких либо вопросов, команду "Reset" выполняет, индикаторы работают.

    Цитата Сообщение от blackmirror Посмотреть сообщение
    PS: Невнимательно прочитал, про переход DATA в 1 не было. Может особенность клавиатуры после разрешения передачи данных отправлять один бит.
    Не вижу смысла дальше бодаться с клавиатурой "A4 Tech KL-23MU". Максимум что я сделаю, это ограничение ожидания CLK=0 и 1, так чтобы если в течении 15 мс CLK от клавиатуры не пришёл, передача байта в клавиатуру обрывалась и микроконтроллер не зависал, а продолжал работать дальше. Вот здесь лучше всего будет воспользоваться таймером прерывания.
    Последний раз редактировалось Northwood; 30.04.2020 в 11:08.
    С уважением, Александр

    Этот пользователь поблагодарил Northwood за это полезное сообщение:

    Gesha86PK(22.02.2022)

  9. #449

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Выкладываю версию 5.6.1.
    Что изменилось по сравнению с 5.5:

    1) Чуть добавил тактов задержки вначале передачи байта из контроллера в клавиатуру, иначе не работало у меня на ATmega48PA-PU;
    2) Изменил раскладку горячих клавиш:
    • F12 - Reset;
    • Print Screen - Magic;
    • Pause / Break - Пауза On/Off (включение / отключение вечного WAIT);
    • Scroll Lock - Тумблер1 On/Off (для включения / отключения Турбо-режима);
    • Right Shift + Scroll Lock - Тумблер1 + Тумблер2 On/Off (только с внешним генератором, для включения / отключения Турбо2-режима).

    3) Сделал ограничение ожидания CLK от клавиатуры. Теперь если CLK не пришёл в течении 15 мс, то отправка или приём байта прерывается (используется таймер внутреннего прерывания). В предыдущих версиях МК зацикливался на вечном ожидании CLK.

    Выложил 2 архива для разных микроконтроллеров: для ATmega-8A и ATmega48PA.

    - - - Добавлено - - -

    P.s. Третья цифра в номере версии теперь будет обозначать раскладку горячих клавиш.

    Т.е. раскладка для x.x.1:

    • F12 - Reset;
    • Print Screen - Magic;
    • Pause / Break - Пауза On/Off (включение / отключение вечного WAIT);
    • Scroll Lock - Тумблер1 On/Off (для включения / отключения Турбо-режима);
    • Right Shift + Scroll Lock - Тумблер1 + Тумблер2 On/Off (для включения / отключения Турбо2-режима).


    По мере появления желающих получить другую раскладку, сделаю версии 5.6.2, 5.6.3 и т.д.

    - - - Добавлено - - -

    P.p.s.

    В архивах вложены 2 варианта принципиальной схемы и описание фьюзов:

    а) с внешним кварцем;
    б) с внешним генератором.

    Внимание!
    Перед тем как шить фьюзы под внешний генератор, убедитесь, что Ваш адаптер для программатора тактирует микроконтроллер внешним генератором, а не просто подключает кварц, иначе после прошивки фьюзов Вы потеряете возможность дальнейшей перепрошивки микроконтроллера! Хотя собрать внешний генератор на 1 микросхеме совсем не сложно.
    Вложения Вложения
    Последний раз редактировалось Northwood; 30.04.2020 в 18:51.
    С уважением, Александр

    Эти 2 пользователя(ей) поблагодарили Northwood за это полезное сообщение:

    Cooper(07.01.2024), Gesha86PK(22.02.2022)

  10. #450

    Регистрация
    06.01.2011
    Адрес
    г. Днепр, Украина
    Сообщений
    804
    Спасибо Благодарностей отдано 
    43
    Спасибо Благодарностей получено 
    198
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сделал 2-й вариант раскладки горячих клавиш.
    Кроме того, убрал реакцию на клавишу F11, которая частично дублировала клавишу Pause/Break, которую я забыл убрать прошлый раз, поэтому размеры hex-файлов уменьшились.

    Нумерацию версий вернул 2-значную, т.к. гораздо удобней оказалось к именам файлов добавлять префикс "keys1", "keys2".

    Keys1:

    • Reset - F12;
    • Magic - Print Screen;
    • Pause - Pause/Break;
    • Fixed Button1 - Scroll Lock;
    • Fixed Button1 + Fixed Button2 - Right Shift + Scroll Lock (работает только с внешним генератором).


    Keys2:

    • Reset - Print Screen;
    • Magic - F12;
    • Pause - Pause/Break;
    • Fixed Button1 - Scroll Lock;
    • Fixed Button1 + Fixed Button2 - Right Shift + Scroll Lock (работает только с внешним генератором).


    Если будут другие пожелания, сделать ещё варианты раскладки горячих клавиш, то добавлю варианты.
    Вложения Вложения
    С уважением, Александр

    Эти 2 пользователя(ей) поблагодарили Northwood за это полезное сообщение:

    Felix_73(09.05.2020), Gesha86PK(06.12.2021)

Страница 45 из 54 ПерваяПервая ... 414243444546474849 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 112
    Последнее: 03.08.2020, 16:24
  2. Ответов: 3
    Последнее: 16.10.2010, 14:04
  3. Продам плату "Пентагон-128K" + примочки
    от Atari в разделе Барахолка (архив)
    Ответов: 3
    Последнее: 20.03.2010, 13:30
  4. Продам печатные платы: от "Львов-48" и клавиатуры
    от Tim0xA в разделе Барахолка (архив)
    Ответов: 9
    Последнее: 27.12.2008, 16:41
  5. Ответов: 3
    Последнее: 23.07.2007, 19:10

Ваши права

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