Wednesday, 30 October 2013

Brûler un firmeware sur une puce ATMEGA8

J'utilise un ISP (In-System Programming) bas de gamme (usbasp) mais qui fait parfaitement bien l’affaire.

Pour référence, je met la connectique:

Pour faire simple on va brancher le connecteur USB sur l'ordinateur pour qu'il alimente le µC et au travers du connecteur ISP.
On peut alors vérifier au moyen d'un multimètre si on a bien 5V entre les pin 7 et 8 de l'ISP et entre les pin 7 et 8 du µC (Atmega8) également.


Maintenant on va tester si le programmateur fonctionne, et donc s'il voit le µC qui lui est connecté par l'ISP.

Par exemple en lisant la mémoire flash de l'atmega8
sudo avrdude -p m8 -P /dev/parport0 -c usbasp -U flash:r:-:i -E noreset

Il devrait répondre ainsi :
avrdude: WARNING: -E option not supported by this programmer type
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: reading flash memory:
Reading | ################################################## | 100% 3.16s
avrdude: writing output file "<stdout>"
:00000001FF
avrdude: safemode: Fuses OK
avrdude done.  Thank you. 


Super !! Ça fonctionne !

Un peu d'explication :
sudo, car on a besoin d'accéder à la ressource matérielle du port parallèle. 
-p m8, indique le modèle de µC.  
-P /dev/parport0, spécifie le port sur lequel est connecté le programmateur (port parallèle).  
-c usbasp, indique le nom du programmateur.  
-U flash:r:-:i 
-E noreset, pour s'adresser à la mémoire flash du µC en mode lecture.
 
Programatin de la Puce : 
Reste à programmer le µC pour y mettre le fichier .hex 
sudo avrdude -p m8 -c usbasp -U flash:w:/"PATH"/"FILE".hex 

Ce qui renvoie :
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/"PATH"/"FILE".hex"
avrdude: input file /"PATH"/"FILE".hex auto detected as Intel Hex
avrdude: writing flash (1898 bytes):
Writing | ################################################## | 100% 1.16s
avrdude: 1898 bytes of flash written
avrdude: verifying flash memory against /"PATH"/"FILE".hex:
avrdude: load data flash data from input file /"PATH"/"FILE".hex:
avrdude: input file /"PATH"/"FILE".hex auto detected as Intel Hex
avrdude: input file /"PATH"/"FILE".hex contains 1898 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.81s
avrdude: verifying ...
avrdude: 1898 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you. 
Super !! 

Mais... Il manque une étape cruciale, la programmation des bits fusibles. En effet, sans cela l'oscillateur @12Mhz du montage ne sera pas pris en compte par le µC qui continuera d'utiliser son oscillateur interne.

Les valeurs appropriée pour mon projet sont:
ATMEGA8 builds: high byte = 0xc9, low byte = 0x9f 
 
Donc j'envoie la ligne suivante: 
sudo avrdude -p m8 -P /dev/parport0 -c usbasp -Uhfuse:w:0xc9:m -Ulfuse:w:0x9f:m 

Ce qui donne :
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xc9"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.01s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xc9:
avrdude: load data hfuse data from input file 0xc9:
avrdude: input file 0xc9 contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0x9f"
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.01s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x9f:
avrdude: load data lfuse data from input file 0x9f:
avrdude: input file 0x9f contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
 
Il ne reste plus qu'à tester....

Adaptateur N64 to GC 1.0

Qu'il soit possible de jouer aux jeux N64 sur la Wii est une chose merveilleuse (Merci Nintendo!), mais naturellement, l'expérience est bien plus authentique avec les vraies manettes d'origine.

Ce billet est un portage du circuit développer par Raphaël Assénat (raphnet technologies).
Raphaël utilise une carte générique de sa conception pour son adaptateur. J'ai volontairement limité ma carte au strict minimum de composant. Je n'utilise donc pas son Multiuse tiny1 PCB.

Voici donc le schéma du PCB:

Ce Schéma a été produit avec Fritzing

 La plaque de prototypage:

Liste des composants:

Label Part Type Properties
Atmega8 ATMega8 boitier DIL
C1 Electrolytic Capacitor boitier 100 mil [THT, electrolytic]; capacité 1µF; voltage 6.3V
C2 Ceramic Capacitor boitier 200 mil [THT, multilayer]; capacité 18pF; voltage 6.3V
C3 Ceramic Capacitor boitier 200 mil [THT, multilayer]; capacité 18pF; voltage 6.3V
GC Generic rounded female header - 6 pins boitier THT; Taille du trou 0.7mm,0.508mm; row single; forme ♀ (female rounded); broches 6; éspacement des broches 0.1in (2.54mm)
ISP Generic shrouded header - 10 pins boitier THT; Taille du trou 1.0mm,0.508mm; row double; forme ♂ (shrouded male); broches 10; éspacement des broches 0.1in (2.54mm)
N64 Generic rounded female header - 3 pins boitier THT; Taille du trou 0.7mm,0.508mm; row single; forme ♀ (female rounded); broches 3; éspacement des broches 0.1in (2.54mm)
R1 2.2k Ω Resistance boitier THT; tolérence ±5%; bands 4; résistance 2.2kΩ; éspacement des broches 400 mil
R2 0 Ω Resistance boitier THT; tolérence ±5%; bands 4; résistance 0Ω; éspacement des broches 400 mil
Y1 Crystal boitier THT; fréquence 16 Mhz; type crystal; éspacement des broches 5.08mm

La puce Atmega8 doit être programmée avec l'un de ces firmewares:

Controlleur VersionFichierMCUCommentaires
Nes/Snes1.3snes2wii-1.3.hexAtmega8 Changes in this version:
  • Added a feature to swap the NES A and B buttons. Hold A and B at power up to use it.
Nes/Snes1.1snes2wii-1.1.hexAtmega8 Changes in this version:
  • NES mode can be forced on by holding the Start button at power-up. Without this, in my opinion, NES games are almost unplayable with an SNES controller.
  • Implemented button combinations which can affect how unaccessible Gamecube buttons and sticks are reported. eg: Sending L+R pressed with a NES controller, and sending "CStick towards the right". Mostly useful to summon some emulator's menu while playing.
  • Implemented new Gamecube commands for better compatibility, eg: GCLinux.
Nes and Snes1.0snes2wii-1.0.hexAtmega8 This was the first version. Nes or Snes mode selected with jumper.
Nintendo 641.4n64_to_wii-1.4.hexAtmega8 New in this version:
  • Added 4 new button mappings, accessible by holding a C button for each mapping. These are reported to be useful for Super Smash bros Melee and Brawl.
  • Created a single page PDF documenting the supported mappings.
Nintendo 641.3n64_to_wii-1.3.hexAtmega8 New in this version:
  • It is now possible to disable the feature where the L and Z buttons are swapped by holding the 'L' button down when plugging the adapter in the console.
  • If the R button is held down when plugging the adapter into the console, the N64 C-left and C-right buttons are mapped to the Gamecube Y and X buttons. This makes it possible to play the virtual console game Sin and Punishment.
  • The joystick sensitivity can be increased by holding the Dpad right button when plugging the adapter into the console.
  • The joystick sensitivity can be decreased by holding the Dpad left button when plugging the adapter into the console.
Nintendo 641.2n64_to_wii-1.2.hexAtmega8 Version 1.1 for N64 had a reliability bug which caused some controllers to randomly reset and recalibrate during play. This is fixed in version 1.2. It is recommended that you upgrade even if version 1.1 is working for you.

Ce tableau est une copie du tableau du site de Raphaël Assénat (raphnet technologies).

Sunday, 27 October 2013

GAME CAB 1.0 - Game Controller USB - Schéma

Schéma pour la connectique des boutons et des joystick de ma borne d'arcade

Ce Schéma a été produit avec Fritzing

Typhon:

Sur ma plaque de prototypage ça fonctionne bien. Je vais lancer la production d'une plaque pour des tests approfondis (connexions de tous les boutons, tests sur une carte mère, etc...).

Note: je dois écrire un article qui décrira comment brûler la puce Atmel avec le code pour le joystick.