Ремонтируем джойстики

Авторы: 

У вас поломались все джойстики от 3DO? Не беда - мы их запросто починим!

Протокол джойстиков 3DO

Распиновка порта консоли:

  1. GND
  2. VCC
  3. Aidio left
  4. Audio right
  5. VCC
  6. CONFIG (выход стороны 3DO)
  7. CLOCK (выход со стороны 3DO)
  8. GND
  9. 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

Приготовление новых джойстиков

Первим делом готовим ремкомплект:

  1. Чип с прошивкой (нужен будет программатор, для внутрисхемного программирования ножек у 2313 маловато).
  2. Монтажная платка с обвязкой для чипа
  3. Шлейф для соединения с платой джойстика

Ремкомплект

Пример монтажа на джойстик от сеги.
1. Высверливается оригинальный чип джойстика сеги и зачищаем натфелем края от заусенец из дорожек - чтобы не было замыканий.
2. Зачищаем дорожки к кнопочным контактам и подпоять к ним шлейф.

3. Другой конец шлейфа распаивается по монтажке.
4. Шнур для соединения с приставкой подпаивается к ремкомплекту и одна из земель (или отдельный провод) соединяется с землей на плате джойстика.

В конце все прячем в корпусе и играемся ))