Ремонтируем джойстики
У вас поломались все джойстики от 3DO? Не беда - мы их запросто починим!
Протокол джойстиков 3DO
Распиновка порта консоли:
- GND
- VCC
- Aidio left
- Audio right
- VCC
- CONFIG (выход стороны 3DO)
- CLOCK (выход со стороны 3DO)
- GND
- DATA (выход со стороны устройства ввода)
Формат сигнала CLOCK:
___|0|----(синхронизирующий импульс ~ 0.0005 c. )-----|1|___(пауза ~0.0005 c. )___|2|---|3|__|4|---|5|__|6|---|7|__|8|---|9|__...............
Мелкие импульсы имеют период ~0.000008 c. По фронту |1| выдается перый бит потока данных со стороны устройств на линию DATA, по фронту |3| - второй и т.д. При подключении внешнего устройства по цепочке необходимо обеспечить корректное проходждение данных по линии CONFIG через джойстик, для этого по переднему фронту читаем CONFIG и выдаем его следующему устройству через полтора периода. Например - считали бит по фронту |0| и выдали по фронту |3|, следующий бит читаем по фронту |2|, а выдаем по фронту |5| и т.д. Если к устройству не подключено дополнительных устройств - то по окончанию выдачи данных на линию DATA должен быть выставлен высокий уровень.
Формат данных для джойстика следующий:
1,0,0,Down,Up,Right,Left,A,B,C,P,X,R,L,0,0
Причем, нажатой кнопке соответствует высокий уровень, а отпущенной - низкий.
Вот вроде и все - далее берем микроконтроллеры, паяльники и обращаете в веру 3DO джойстики ее убийц, ну или воскрешаем поломанные джосы )))
Схема и код
В ходе экспериментов была сделана полная замена чипу оригинального джойстка с поддержкой цепочных подключений, разве что фильтры стоит на линии сделать для надежности, но это уж сами =)
Схема
Код несложный и вполне помещается ATiny2313, при этом контроллер должен работать на частоте 8МГц:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#define _3DO_CLK (PIND&2)
#define _3DO_LATCH (PIND&1)
#define _3DO_SET_DATA PORTD|=4
#define _3DO_CLEAR_DATA PORTD&=~4
#define _EXT_DATA (PIND&0x40)
#define _EXT_SET_CLK PORTA|=2
#define _EXT_CLEAR_CLK PORTA&=~2
#define _EXT_SET_LATCH PORTA|=1
#define _EXT_CLEAR_LATCH PORTA&=~1
uint8_t WaitSynk()
{
uint16_t cnt=0;
while(_3DO_CLK){cnt++;};
_EXT_CLEAR_CLK;
return cnt>>8;
}
int main()
{
uint8_t val[16],cnt,exflag,t1,t2;
DDRD = 0x4;
PORTD = 0xff;
DDRA = 0x3;
PORTA = 0x5;
DDRB = 0;
PORTB = 0xff;
while(1)
{
val[0]=1;
val[1]=val[2]=0;
t1=~PINB;
val[3]=t1&2;
val[4]=t1&1;
val[5]=t1&8;
val[6]=t1&4; //лево
t2=~PIND;
val[7]=t2&8;
val[8]=t2&0x10;
val[9]=t2&0x20;
val[10]=t1&0x80;
val[11]=t1&0x40;
val[12]=t1&0x20;
val[13]=t1&0x10;
val[14]=val[15]=0;
if(_3DO_CLK)
{
_EXT_SET_CLK;
t2=_3DO_LATCH;
cnt=WaitSynk(); //ожидаем синхроимпульс
if(cnt<2)goto finita; // ----_
cnt=0;
if(val[cnt])_3DO_SET_DATA;
else _3DO_CLEAR_DATA;
while(!(_3DO_CLK));
val[cnt]=_EXT_DATA; //читаем следующее устройство в цепочке
_EXT_SET_CLK; // _____-
next_bit:
cnt++;cnt&=15;
t1=t2;
t2=_3DO_LATCH;
while(_3DO_CLK);
_EXT_CLEAR_CLK;
if(val[cnt])_3DO_SET_DATA;
else _3DO_CLEAR_DATA;
if(t1)_EXT_SET_LATCH; //выдаем данные на следующее устройство в цепочке
else _EXT_CLEAR_LATCH;
exflag=0;
while(!(_3DO_CLK))
{
exflag++;
if(exflag==100) goto finita; //сворачиваемся при отсутствии синхроимпульсов
}
val[cnt]=_EXT_DATA; //читаем следующее устройство в цепочке
_EXT_SET_CLK;
goto next_bit;
}
finita:
_3DO_SET_DATA;
}
return 0;
}
Состояния фузов следующие:
OSCCALs = 70 73 _LOW = 0xE4 CKDIV = 1 CKOUT = 1 SUT = 2 CKSEL = 4 _HIGH = 0xD9 DWEN = 1 EESAVE = 1 WDTON = 1 BODLEVEL = 4 RSTDISBL = 1 _EXT = 0xFF SELFPRGEN = 1
Приготовление новых джойстиков
Первим делом готовим ремкомплект:
- Чип с прошивкой (нужен будет программатор, для внутрисхемного программирования ножек у 2313 маловато).
- Монтажная платка с обвязкой для чипа
- Шлейф для соединения с платой джойстика
Ремкомплект
Пример монтажа на джойстик от сеги.
1. Высверливается оригинальный чип джойстика сеги и зачищаем натфелем края от заусенец из дорожек - чтобы не было замыканий.
2. Зачищаем дорожки к кнопочным контактам и подпоять к ним шлейф.
4. Шнур для соединения с приставкой подпаивается к ремкомплекту и одна из земель (или отдельный провод) соединяется с землей на плате джойстика.
В конце все прячем в корпусе и играемся ))
Проект эмуляции