Ремонтируем джойстики
У вас поломались все джойстики от 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. Шнур для соединения с приставкой подпаивается к ремкомплекту и одна из земель (или отдельный провод) соединяется с землей на плате джойстика.
В конце все прячем в корпусе и играемся ))