интересно а зачем для спектрума такой изврат ???
я просто отрезал внутренний контроллер и припаялся напрямик к кнопкам - все
хоть синклер хоть кемпстон.... что хочешь.
Зачем глаз через зад оперировать?
интересно а зачем для спектрума такой изврат ???
я просто отрезал внутренний контроллер и припаялся напрямик к кнопкам - все
хоть синклер хоть кемпстон.... что хочешь.
Зачем глаз через зад оперировать?
Ну дык резать то оно всегда лехче, чем отмеривать -)) Просто бывает удобно юзать джойстик денди по прямому назначению, то есть подключая его непосредственно в денди. А когда нужно, в спек. Универсальность короче сохраняется.
А я в юности решил вопрос радикально
И платка с разъемом цела, и спектрумист доволен
Всех С Наступающим!
В свете выхода новой игры Delta's Shadow имеющей возможность использования 8-ми кнопочного Kempston, возникло желание задействовать в своём Пентагоне ранее свободные линии этого интерфейса. А дабы не встраивать в корпус разъём DB9 решил подключить джойстик Dendy через переходник DB9 -> ОНЦ-ВГ-4-5-16В и плату Arduino Nano. В инете нашёл несколько примерно одинаковых скетчей считывающих данные о нажатие кнопок и отправляющих готовый байт в COM порт, собственно на их базе и был написан мой вариант скетча. К слову, ни один из скетчей не заработал с продающимися в магазинах новодельными джойстиками для Dendy, просматривая сигналы на логическом анализаторе понял, что необходима пауза в 10-20мс между пакетами сигналов Clock и Latch, с добавленной задержкой между опросами джойстик начал выдавать биты состояния кнопок. Что бы не отвыкать от привычного управления ( в Delta's Shadow на кнопке "Огонь" стоит "Прыжок") сделал две переключаемых конфигурации кнопок, переключение между ними комбинациями кнопок: "START" + "Вверх" обратное переключение "START" + "Вниз". Схема подключения я думаю будет понятна из комментариев в скетче.
Скрытый текст
#include <Arduino.h>
const int data = 2;
const int latch = 3;
const int clock = 4;
const int TICK = 12;
bool up1=true;
bool up2=true;
bool mode=false; // переключатель конфигурации джойстика
void init_joystick(int data, int latch, int clock)
{
pinMode(data, INPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
pinMode(5, OUTPUT); // D4 кнопка А
pinMode(6, OUTPUT); // D5 кнопка B
pinMode(7, OUTPUT); // D6 кнопка C
pinMode(8, OUTPUT); // D7 кнопка START
pinMode(9, OUTPUT); // D3 кнопка вверх
pinMode(10, OUTPUT); // D2 кнопка вниз
pinMode(11, OUTPUT); // D1 кнопка влево
pinMode(12, OUTPUT); // D0 кнопка вправо
digitalWrite(clock, HIGH);
}
int get_keys_state_joystick(int data, int latch, int clock)
{
digitalWrite(latch, LOW);
digitalWrite(clock, LOW);
digitalWrite(latch, HIGH);
delayMicroseconds(TICK);
digitalWrite(latch, LOW);
int keys_state = 0;
for (int i = 0; i < 8; ++i) {
keys_state += digitalRead(data) * (1 << i);
digitalWrite(clock, HIGH);
delayMicroseconds(TICK);
digitalWrite(clock, LOW);
delayMicroseconds(TICK);
}
delayMicroseconds(10000);
return keys_state;
}
void setup()
{
init_joystick(data, latch, clock);
}
void loop()
{
int bit_STATE = get_keys_state_joystick(data, latch, clock);
if ( bitRead((bit_STATE), 4)!=true & bitRead((bit_STATE), 3)!=true)
{
mode= true;
}
if ( bitRead((bit_STATE), 3)!=true & bitRead((bit_STATE), 5)!=true)
{
mode= false;
}
// кнопка A огонь
if( bitRead((bit_STATE), 0))
{
if ( mode)
{
digitalWrite(8, HIGH);
}
else
{
digitalWrite(5, HIGH);
}
}
else
{
if ( mode)
{
digitalWrite(8, LOW);
}
else
{
digitalWrite(5, LOW);
}
}
//кнопка B прыжок c дублированием кнопки вверх если mode не активен
if( bitRead((bit_STATE), 1))
{
if(mode)
{
digitalWrite(5, HIGH);
}
else
{
up2=true;
}
}
else
{
if(mode)
{
digitalWrite(5, LOW);
}
else
{
up2 = false;
}
}
//кнопка С смена костюма
if( bitRead((bit_STATE), 2))
{
digitalWrite(6, HIGH);
}
else
{
digitalWrite(6, LOW);
}
// кнопка START пауза/ выход
if( bitRead((bit_STATE), 3))
{
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
}
// кнопка вверх
if( bitRead((bit_STATE), 4))
{
up1=true;
}
else
{
up1=false;
}
if((mode&up1!=true)|(mode!=true&up1!=true|up2!=true ))
{
digitalWrite(9, LOW);
}
else
{
digitalWrite(9, HIGH);
}
// кнопка вниз
if( bitRead((bit_STATE), 5))
{
digitalWrite(10, HIGH);
}
else
{
digitalWrite(10, LOW);
}
//кнопка влево
if( bitRead((bit_STATE), 6))
{
digitalWrite(11, HIGH);
}
else
{
digitalWrite(11, LOW);
}
//кнопка вправо
if( bitRead((bit_STATE), 7))
{
digitalWrite(12, HIGH);
}
else
{
digitalWrite(12, LOW);
}
}[свернуть]
Последний раз редактировалось Lapu-Leen; 31.12.2020 в 22:51.
"Робик"
"Ленинград 48К"
"Пентагон-48К"
"Пентагон-128К" +AY+Kempston+ FDD эмулятор
"Atari 65XE"+SIO2Arduino+AstartA
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)