Paso 3: Programar el Arduino y haciendo algunas pruebas
// /* CONEXIONES EN JOYSTICK ATARI Función DB-9 Arduino AVR */ /* El controlador NES es alimentado por el Arduino. Función DB-9 Arduino AVR adaptarse a su configuración de hardware #undef int
Juego de ATARI 2600 con el controlador NES mediante Danjovic, 2012
Compilado en Arduino 0.22
//
Joystick ATARI 2600
Activa secuencialmente las siguientes direcciones de un Joystick de Atari 2600
ARRIBA, ABAJO, IZQUIERDA, DERECHA, GATILLO
1 Pin 2 (PD2)
PASADOR 2 3 (PD3)
IZQUIERDA 3 Pin 4 (PD4)
DERECHA 4 Pin 5 (PD5)
+ 5VCC 5 + 5V + Vcc
ACTIVAR Pin 6 6 (PD6)
GND 9 GND GND
Controlador de NES
Contiene un registro de desplazamiento CMOS (CD4021). Cambio de datos en la frontera de subida del reloj
secuencia de botón como abajo.
latch ___---_______________________
Clock _______-__-__-__-__-__-__-__
Datos xxxA B SL ST UP DW LF RG
DATOS 2 Pin 8 (PB0)
PESTILLO pasador 3 9 (PB1)
RELOJ de 4 Pin 10 (PB2)
+ 5VCC 7 Pin 11 (PB3)
GND 8 pines 12 (PB4)
*/
#define POWER_VIA_PORT_B3_B4 1 / / pines puerto B3 y B4 del uso como fuente de alimentación
#include < stdio.h >
/ * Conexiones de puerto de Atari Joystick * /
int Up_Pin = 2;
int Down_Pin = 3;
int Left_Pin = 4;
int Right_Pin = 5;
int Trigger_Pin = 6;
/ * Las conexiones de controlador de NES * /
int Data_Pin = 8;
int Latch_Pin = 9;
int Clock_Pin = 10;
int PWR5V_Pin = 11; energía
int PWRGND_Pin = 12;
void setup)
{
/ * Inicialización pines conectados a Atari 2600. */
Pernos se establecen como entradas para emular salidas de colector abierto
pinMode (Up_Pin, entrada);
pinMode (Down_Pin, entrada);
pinMode (Left_Pin, entrada);
pinMode (Right_Pin, entrada);
pinMode (Trigger_Pin, entrada);
Inicializar salidas Latch como cero, por lo tanto para activar un pin de la dirección
se modificará a la salida
digitalWrite (Up_Pin, bajo);
digitalWrite (Down_Pin, bajo);
digitalWrite (Left_Pin, bajo);
digitalWrite (Right_Pin, bajo);
digitalWrite (Trigger_Pin, bajo);
/ * Inicialización pines conectados al controlador de NES. */
Pines como entradas y salidas según se requiera
pinMode (Data_Pin, entrada);
pinMode (Latch_Pin, salida);
pinMode (Clock_Pin, salida);
Inicializar las señales del controlador de NES
digitalWrite (Data_Pin, alto); permiten resitor de pullup
digitalWrite (Latch_Pin, bajo);
digitalWrite (Clock_Pin, bajo);
Compruebe ya sea para el joystick NES o no
#ifdef POWER_VIA_PORT_B3_B4 / / fuente de alimentación para el controlador NES via puerto B3 y B4
PORTB & = ~ _BV(PORTB4); Tierra
PORTB | = _BV(PORTB3); VCC
DDRB | = _BV(PORTB3) | _BV(PORTB4); hacer salidas
Delay(100); Espere que las cosas se estabilicen
#endif
}
Realizar un ciclo de reloj controlador de NES línea de reloj
void do_clock (void) {}
digitalWrite (Clock_Pin, alto); Levantar el pin de reloj
delayMicroseconds(10); pausas de 10 microsegundos
digitalWrite (Clock_Pin, bajo); sale el pin
delayMicroseconds(50); pausas para otro 10 microsegundos
}
/*
Aquí está nuestro bucle principal. Emite un pulso de cierre entonces comienza a reat el estado de los botones.
Los pines de puerto de joystick de Atari se establecen de acuerdo con el estado de los bits de cambio
registro en el controlador NES.
*/
void loop)
{
digitalWrite (Latch_Pin, alto); Aumentar la señal de cierre
delayMicroseconds(30); Mantenga por 30 microsegundos
digitalWrite (Latch_Pin, bajo); Retorno de la señal de cierre a bajo nivel
delayMicroseconds(10); manténgalo durante más 10 microsegundos
Botón A de procesos (Recuerde: un cero significa que el pulsador)
Si (digitalRead(Data_Pin))
{
pinMode (Trigger_Pin, entrada); Unassert pin (cero significa que el pulsador)
}
otra cosa
{
pinMode (Trigger_Pin, salida); Afirmar pin
}
do_clock(); Un pulso de reloj se genera al final de cada bit
Proceso B Botón / / botón de NES tanto genera un disparador de la Atari
Si (digitalRead(Data_Pin))
{
pinMode (Trigger_Pin, entrada); Unassert pin
}
otra cosa
{
pinMode (Trigger_Pin, salida); Afirmar pin
}
do_clock();
Botón seleccionar SKIP
do_clock();
Botón de inicio de salto
do_clock();
POR la dirección
Si (digitalRead(Data_Pin))
{
pinMode (Up_Pin, entrada); Unassert pin
}
otra cosa
{
pinMode (Up_Pin, salida); Afirmar pin
}
do_clock();
Proceso por dirección
Si (digitalRead(Data_Pin))
{
pinMode (Down_Pin, entrada); Unassert pin
}
otra cosa
{
pinMode (Down_Pin, salida); Afirmar pin
}
do_clock();
Proceso de dirección izquierda
Si (digitalRead(Data_Pin))
{
pinMode (Left_Pin, entrada); Unassert pin
}
otra cosa
{
pinMode (Left_Pin, salida); Afirmar pin
}
do_clock();
Dirección correcta del proceso
Si (digitalRead(Data_Pin))
{
pinMode (Right_Pin, entrada); Unassert pin
}
otra cosa
{
pinMode (Right_Pin, salida); Afirmar pin
}
do_clock(); Un poco inútil, pero guardado para mantener el patrón
Después de leer todos los botones, espere 10 milisseconds antes de la próxima lectura
Delay(10);
}