Pages: [1]   Go Down
Author Topic: emuler une manette Nes via un arduino  (Read 644 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour!

Je cherche à reproduire le signal qu'envoie une manette Nes à la nintendo en utilisant un arduino.
en me basant sur ce document :http://tinyurl.com/5mpm98

j'ai relié le port manette de la console à un arduino en mettant le Latch sur la pin 2, Clock sur la 3(mais je ne m'en sert pas pour le moment), et un data en pin 4 configurée en output.

j'ai dans mon code pour écrire sur le port data ceci :
if (FlagLatch=1) { // le latch viens de redescendre à l'état bas
//je lance mon signal à la Nes
for (int i = 1; i <= 7; i ++) {
  delayMicroseconds(6);
  digitalWrite(DataOut,DataListValue);
  delayMicroseconds(6);
}
}

Mais j'ai une incohérence de ce qui ce produit sur la Nes
croyez-vous que l'arduino respecte bien les microseconds ou en gros il se décale petit à petit. J'ai le souvenir qu'en assembler quand on programme un pic chaque instruction prend 1microsecond est-ce la même chose avec l'arduino?   :-?

Si quelqu'un a une idée c'est super smiley

  




« Last Edit: November 26, 2008, 09:24:24 am by tonin59 » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bon j'essaye d'avancer sur mon idée.

 Finalement je vais utiliser le module spi mais je suis pas encore très familier avec la chose. l'idée étant de faire ceci :
Utiliser le module SPI de l'AVR en mode SLAVE. Utiliser la pin
MISO pour transmettre les données vers la console, et SCK pour suivre le clock provenant de la console.

Mettre le latch sur une pin d'interruption. Dans la routine
correspondante, écrire l'octet équivalent à l'état de boutons désiré
dans le registre SPDR pour qu'il soit prêt dès le premier front
d'horloge.

pour rappel voic le protocol d'envoie des données de la nes :
"every 16,67 millisecond the nes CPU send to arduino a 12 microSec Data Latch
    6 microSec after a clock pulse at 6microsec indicate on each  rising edge the button state bit by bit :
    A,B,select,start,...."


à priori je dois mettre SPCR comme ceci :

SPIE en 1
SPE en 1
DORD ????? je crois 0 mais gros doute
MSTR doit être à 0 car en esclave
CPOL ??? je crois 1
CPHA doit être à 0 car je li sur front montant
SPR1 et SPR0 à  00 car il vaut mieux que j'aille vite

donc SPCR = 11001000

voici le début de mon code pour le moment suis-je juste ?

#define DATAOUT  12//MISO
#define SPICLOCK  13//sck
#define LATCHPIN 0//NesLATCH

void setup() {
pinMode(DATAOUT, OUTPUT);
pinMode(SPICLOCK,INPUT);

 attachInterrupt(LATCHPIN, SendData, FALLING);

// SPCR = 11001000
SPCR = (1<<SPIE)|(1<<SPE)|(1<<CPOL);
delay(10);
}




« Last Edit: November 29, 2008, 12:36:27 pm by tonin59 » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'essaye toujours d'avancer
si quelqu'un a une idée pourquoi je reste coincé dans le while de la routine je suis preneur  smiley
et aussi pourquoi quand j'affiche SPDR il ne vaut pas controller_data??
Code:
/*
PIE - Enables the SPI interrupt when 1
SPE - Enables the SPI when 1
DORD - Sends data least Significant Bit First when 1, most Significant Bit first when 0
MSTR - Sets the Arduino in master mode when 1, slave mode when 0
CPOL - Sets the data clock to be idle when high if set to 1, idle when low if set to 0
CPHA - Samples data on the falling edge of the data clock when 1, rising edge when 0
SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz)

SPIE en 0
SPE en 1
DORD je crois 0 car le MSB vient en 1° de gauche
MSTR doit être à 0 car en esclave
CPOL  0  car l'etat normal de l'horloge est bas
CPHA doit être à 0 car je li sur front montant
SPR1 et SPR0 à  00

01000000
SPCR = (1<<SPE);
    
*/

#define DATAOUT  11//MOSI
#define SPICLOCK  13//sck
#define LATCHPIN 0//NesLATCH

// valeur des boutons
#define NES_A       B00000001
#define NES_B       B00000010
#define NES_SELECT  B00000100
#define NES_START   B00001000
#define NES_UP      B00010000
#define NES_DOWN    B00100000
#define NES_LEFT    B01000000
#define NES_RIGHT   B10000000

// controller data Start in first
byte controller_data = B11110111;
//
byte ClearSPI;



void setup() {
  Serial.begin(9600);
  attachInterrupt(LATCHPIN, SendData,FALLING );
  pinMode(DATAOUT, OUTPUT);
  pinMode(SPICLOCK,INPUT);
 
  //SPCR est 01000000
  SPCR = (1<<SPE);
  // clear SPSR
  ClearSPI=SPSR;
  ClearSPI=SPDR;

  delay(10);
  
}


void loop() {
}

void SendData()
{
  
 
  SPDR = controller_data;  // ecrire la valeur des boutons dans SPDR
  
  Serial.println(SPDR,BIN);


  while (!(SPSR & (1<<SPIF)))     //fini de transmettre
  {
  };
  
  
  
 }

« Last Edit: November 30, 2008, 07:16:21 pm by tonin59 » Logged

Pages: [1]   Go Up
Jump to: