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
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 ?
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
et aussi pourquoi quand j'affiche SPDR il ne vaut pas controller_data??
/*
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
{
};
}