Stap 3: Programmeren van de Arduino en enkele tests doen
// /* VERBINDINGEN OP ATARI JOYSTICK Functie DB-9 Arduino AVR */ /* De NES-controller wordt aangedreven door de Arduino. Functie DB-9 Arduino AVR aan te passen aan uw hardware config #undef int
Spelen op ATARI 2600 met NES Controller door Danjovic, 2012
Gecompileerd op Arduino 0.22
//
ATARI 2600 Joystick
Hiermee activeert u achtereenvolgens de volgende Routebeschrijving vanaf een Atari 2600 Joystick
OMHOOG, OMLAAG, LINKS, RECHTS, ACTIVEREN
Pin UP (1) 2 (PD2)
BENEDEN 2 Pin 3 (PD3)
LINKS 3-pins 4 (PD4)
RECHTS van de 4 Pin 5 (PD5)
+ 5VCC 5 + 5V + Vcc
6-pins 6 (PD6) activeren
9 GND GND GND
NES-Controller
Bevat een CMOS Shift Register (CD4021). Gegevens wijzigen op verhogen grens van klok
knop volgorde zoals hieronder.
latch ___---_______________________
Clock _______-__-__-__-__-__-__-__
Gegevens xxxA B HV UP DW LF RG
GEGEVENS 2 Pin 8 (PB0)
Klink 3 Pin 9 (PB1)
KLOK 4 Pin 10 (PB2)
+ 5VCC 7 Pin 11 (PB3)
GND 8 Pin 12 (PB4)
*/
#define POWER_VIA_PORT_B3_B4 1 / / poort pinnen B3 en B4 als voeding gebruiken
#include < stdio.h >
/ * Atari Joystick-poort verbindingen * /
int Up_Pin = 2;
int Down_Pin = 3;
int Left_Pin = 4;
int Right_Pin = 5;
int Trigger_Pin = 6;
/ * NES Controller verbindingen * /
int Data_Pin = 8;
int Latch_Pin = 9;
int Clock_Pin = 10;
int PWR5V_Pin = 11; macht
int PWRGND_Pin = 12;
void setup)
{
/ * Initialiseren pinnen op de Atari 2600 aangesloten. */
Pinnen zijn als ingangen te emuleren open collector uitgangen ingesteld
pinMode (Up_Pin, INPUT);
pinMode (Down_Pin, INPUT);
pinMode (Left_Pin, INPUT);
pinMode (Right_Pin, INPUT);
pinMode (Trigger_Pin, INPUT);
Initialiseren van Klink uitgangen als nul, dus voor het activeren van een pin de richting
naar uitvoer worden gewijzigd
digitalWrite (Up_Pin, laag);
digitalWrite (Down_Pin, laag);
digitalWrite (Left_Pin, laag);
digitalWrite (Right_Pin, laag);
digitalWrite (Trigger_Pin, laag);
/ * Initialiseren pinnen op de NES-controller aangesloten. */
PIN instellen als zoals vereist in-/ uitgangen
pinMode (Data_Pin, INPUT);
pinMode (Latch_Pin, uitvoer);
pinMode (Clock_Pin, uitvoer);
NES controller signalen initialiseren
digitalWrite (Data_Pin, hoge); inschakelen van pullup weerstand
digitalWrite (Latch_Pin, laag);
digitalWrite (Clock_Pin, laag);
Controleren of voor het aandrijven van de NES joystick of niet
#ifdef POWER_VIA_PORT_B3_B4 / / voeding voor NES controller via poort B3 en B4
PORTB & = ~ _BV(PORTB4); Grond
PORTB | = _BV(PORTB3); VCC
DDRB | = _BV(PORTB3) | _BV(PORTB4); uitgangen maken
delay(100); wachten op dingen te stabiliseren
#endif
}
Een klokcyclus uitvoeren op NES controller Clock lijn
VOID do_clock (void) {}
digitalWrite (Clock_Pin, hoge); Verhogen van de pin klok
delayMicroseconds(10); pauzes voor de 10 microseconden
digitalWrite (Clock_Pin, laag); de pin vertrekt
delayMicroseconds(50); pauzes voor een ander 10 microseconden
}
/*
Hier is onze hoofdlus. Het kwesties een puls klink dan begint te reat de status van de knoppen.
De Atari joystick poort pinnen zijn ingesteld volgens met de status van de bits van de shift leest
Registreer binnen de NES-controller.
*/
void loop)
{
digitalWrite (Latch_Pin, hoge); Verhogen van het signaal van de klink
delayMicroseconds(30); Houd het voor 30 microseconden
digitalWrite (Latch_Pin, laag); Terugkeer klink signaal op laag niveau
delayMicroseconds(10); houden voor meer 10 microseconden
Verwerken van knop A (Vergeet niet: een nul staat, knop ingedrukt)
Als (digitalRead(Data_Pin))
{
pinMode (Trigger_Pin, INPUT); Unassert pin (nul betekent knop ingedrukt)
}
anders
{
pinMode (Trigger_Pin, uitvoer); Assert pin
}
do_clock(); Een klok-puls wordt gegenereerd aan het einde van elke bit
Verwerken van knop B / / zowel NES knop genereert een trigger aan Atari
Als (digitalRead(Data_Pin))
{
pinMode (Trigger_Pin, INPUT); Unassert pin
}
anders
{
pinMode (Trigger_Pin, uitvoer); Assert pin
}
do_clock();
Skip Select-knop
do_clock();
Skip startknop
do_clock();
OMHOOG richting
Als (digitalRead(Data_Pin))
{
pinMode (Up_Pin, INPUT); Unassert pin
}
anders
{
pinMode (Up_Pin, uitvoer); Assert pin
}
do_clock();
Proces naar beneden richting
Als (digitalRead(Data_Pin))
{
pinMode (Down_Pin, INPUT); Unassert pin
}
anders
{
pinMode (Down_Pin, uitvoer); Assert pin
}
do_clock();
Proces LINKSAF richting
Als (digitalRead(Data_Pin))
{
pinMode (Left_Pin, INPUT); Unassert pin
}
anders
{
pinMode (Left_Pin, uitvoer); Assert pin
}
do_clock();
Proces richting
Als (digitalRead(Data_Pin))
{
pinMode (Right_Pin, INPUT); Unassert pin
}
anders
{
pinMode (Right_Pin, uitvoer); Assert pin
}
do_clock(); Beetje nutteloos, maar onderhouden te houden van het patroon
Na het lezen van alle knoppen, wacht 10 milisseconds vóór volgende lezing
delay(10);
}