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