Gamoover

Besoin de contacter un admin pour une proposition, une suggestion ou discuter d'un probleme ?
C'est ici : High_Cobra, AsPiC ou Pich

Menu

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.

Voir les contributions Menu

Sujets - KodeIn

#1
Le Bistrot de l'Arcade / Quelques mots en passant.
Jeudi 13 Octobre 2011, 02:30:21 AM
Bonjour tout le monde!

Je profite du fait que j'ai quelques soucis de sommeil pour vous rédiger une petite bafouille rapide.
Comme vous l'aurez peut-être remarqué, moi qui squattait ce forum à longueur de journées/semaines/mois, je me fais plus que rare... Tendance inexistant en fait.
Mes grands projets arcade et électronique, ont pris un violent coup de frein suite à une intérim salvatrice pour mon compte en banque et mon estomac, mais destructrice de mon temps libre.

De plus, après un bilan rapide lors de mon 29ème anniv', il s'est avéré que j'avais omis un élément essentiel dans mes grands plans d'avenir :
Etre en possession d'un véhicule motorisé et du permis qui va avec!

La voiture étant hors de portée de portefeuille à l'heure actuelle, je me suis donc rabattu sur la moto (un vieux rêve).
Donc depuis août, je planifie, me démerde pour financer l'achat d'une (toute) petite moto, de ses accessoires et autres dépenses administratives, ainsi que du permis.
Et c'est seulement maintenant que ces planifications sont en train de porter leurs fruits.

J'ai donc fait l'acquisition d'une moto, une Skyteam Club neuve, pour être exact. Réplique chinoise à moteur gonflé (125cc au lieu de 50cc) du Honda Dax avec sa bonne bouille de mini moto bien rétro.
Là, je viens de réussir mon permis théorique.
Et j'attaque donc les 6h de pratique en moto école pour obtenir le permis A provisoire dès la fin de ce mois.


Donc actuellement, toute mon énergie passe dans le boulot et la moto.
Une fois le permis provisoire acquis, les heures passées dans les trajets de bus se transformeront en quelques dizaines de minutes à moto.
A ce moment, je compte bien recommencer à participer activement à la vie de cette communauté, finalement rénover ma borne et terminer les tutos concernant le MSP430  :-\



A bientot  ^-
#2
Bonjour tout le monde!

J'avais besoin d'un projet tangible pour me motiver à continuer la rédaction des tutos sur le MSP430.
Comme j'ai tout un tas de documentation sur le protocole des manettes NES & SNES, un panel de borne à recâbler, un contrôleur arcade à créer pour ma SNES et de l'exploration de MSP430 à faire, je me suis dit que j'allais combiner le tout. ;D


Table des matières
 •Comment fonctionnent les joypads NES et SNES?
       •Le CMOS 4021
             •Ses 5 fils de connexions
             •Son fonctionnement
             •Usage dans le cas de la SNES

 •Le projet
       •Panel Board
       •Main Board


Comment fonctionnent les joypads NES et SNES?
J'aime beaucoup le système que Nintendo a utilisé pour la communication entre les joypad NES, SNES et la console.
Ce système simple, efficace, peu cher à implémenter et facile à faire évoluer repose entièrement sur un composant, le CMOS 4021.


Le CMOS 4021
Pour comprendre le fonctionnement de ce composant, on va d'abord regarder quelle sont les connections entre le joypad et la console.

Ses 5 fils de connexions
5 fils sont nécessaires pour piloter un 4021, les voici:
• Vdd - alimentation électrique.
• Masse - alimentation électrique.
• DATA - la sortie série.
• P/S ou LATCH - le signal qui va déclencher la "traduction" et la transmission.
• CLOCK - nécessaire pour que le 4021 sache quand envoyer le bit suivant.

Son fonctionnement

Le signal d'horloge est continuellement envoyé au composant.
Si le signal est haut sur CLOCK et P/S, alors la transmission commence. Le huitième "bloc" transmet l'état de l'entrée P8 jusqu'à ce que le signal d'horloge retombe.
Le bloc est alors inactif, il laisse passer les valeurs du bloc suivant.
Au signal d'horloge suivant, le septième bloc transmet l'état de P7 et ainsi de suite jusqu'à P1.

Usage dans le cas de la SNES
Le 4021 permet donc de "sérialiser" 8 entrées parallèles, ça ne suffit pas pour la manette SNES :
• 4 directions
• 4 boutons (ABXY)
• 2 gâchettes
• Start
• Select
=> 12 entrées.
Heureusement, le 4021 possède une entrée série, on peut donc "chainer" deux 4021, ce qui permet de passer de 8 à 16 signaux.
Il faudra simplement connecter la sortie Q8 du second 4021 à l'entre Serial In du premier et faire durer le signal P/S 16 cycles d'horloge au lieu de 8.
Et voici ce qu'on obtient à la sortie de ce montage :

Les 4 derniers bits sont utilisés pour décrire le périphérique connecté à la SNES. Dans notre cas, si on a besoin de plus de boutons, ils sont disponibles.


Conclusions
Ce système me semble particulièrement élégant et très bien pensé, tout est dans la simplicité.
Comme je le disais, les ingénieurs de chez Nintendo ont bien travaillés, ils ont utilisés un composant très courant et peu cher de manière intelligente.
(La solution des ingénieurs Sega me parait beaucoup moins élégante.)

Bien entendu, il doit certainement exister des puces plus récentes nécessitant moins de connections (1-Wire et autres joyeusetés) que je pourrais utiliser pour réduire les fils entre le panel et le JAMMA. Mais ça va à l'encontre d'un de mes buts : pouvoir faire un contrôleur arcade pour ma SNES.



Le projet
Donc, on sait comment fonctionne la manette SNES, on peut donc fabriquer son circuit pour une manette.
Mais il n'y a pas de MSP430 et ça ne sert à rien dans une borne…
L'idée, c'est de faire un second PCB qui servira d'interface entre le JAMMA et le panel, dont le cerveau sera un MSP430.


Panel Board
A l'heure actuelle, je n'ai pas encore le matos (breadboard, puces, leds, …), mais ça ne m'a pas empêché de commencer à plancher sur les PCB qui seront nécessaires.

Pour le PCB qui se fixera sous le panel, c'était facile, j'ai pioché sur le net ce schéma reprenant le circuit d'une manette :


Quelque jours de combat entre Eagle et moi (ENOOOORME merci à Iro pour avoir supporté mes MP  ^-) ont donné ce résultat:

Plus un ptit coup de toshop pour le logo de ce que je voudrais appeler mon site web. Le logo gamoo sera aussi ajouté par la suite ^^


Voici le typon, il est fourni sans aucune garantie! Si vous l'utilisez, c'est à vos risques et périls. Les dimensions du PCB sont de 50*37,5mm, l'image est en 600dpi.
J'attends les fonds pour faire un proto sur breadboard. Et si le test est convaincant, faudra que je trouve un bonne âme équipée de ce qu'il faut pour produire des PCB  ;)


Le fonctionnement intrinsèque du circuit a été expliqué plus haut, je vais donc me contenter d'expliquer 2-3 détails au sujet de ce PCB.
Avant toutes choses, j'ai souhaité éviter d'utiliser des composants montés en surface. Mon but était de permettre à tout le monde réaliser cette carte, il fallait donc que les composants soient faciles à souder.
Comme on peut le remarquer, malgré tous mes efforts, je n'ai pas réussit à router toutes les pistes sur une seule face, il faudra donc utiliser des petits bout de fil ici représentés en rouge.
PULLUP1 et PULLUP2 sont des réseaux de 8 résistances avec une broche commune (pour un total de 9 broches), j'ai préféré utiliser un réseau, c'est bien plus compact sur le PCB que 16 résistances distinctes. La raison de la présence de ces résistances est qu'on travaille avec du CMOS et que tous les input ne seront pas forcément utilisés. Il fallait donc équiper toutes ces entrées de résistances pull up, qui vont maintenir l'entrée à un niveau logique haut (1). Dans ce cas, le bouton poussoir est connecté à la masse, quand on l'actionnera, il fera passer l'entrée à un niveau bas (0).
La LED bicolore sert à la fois de témoin d'alimentation et de témoin d'activité de transmission de données. Elle est totalement facultative, mais c'est toujours utile d'avoir une preuve visuelle. Merci à Iro qui m'a conseillé de mettre un témoin d'alim, j'ai un peu élargi le concept par la suite ;)
Le connecteur 5 broche (qui semble énorme) est un Molex avec détrompeur. Il me semblait essentiel de "sécuriser" cette connexion, c'est pour cette raison que j'ai choisi ce connecteur.
Le connecteur type "pin header" des 17 broches (16 input + masse) m'a semblé la solution la plus facile à implémenter. Etant donné qu'il n'y a pas de risque à le connecter à l'envers, je n'ai pas jugé nécessaire de prévoir de détrompeur physique. Un simple point de couleur sur le connecteur femelle pour repérer la broche 1 ou la masse suffira. (la masse se trouve, depuis la version 0.4, sur la broche centrale)



Main Board
Petit souci, dans une borne le panel fonctionne en 5V, hors les MSP430 acceptent maximum 3,3V.
Pas d'inquiétude! On va se faire un petit circuit d'alim pour abaisser un voltage déjà dispo dans la borne (5V ou 12V) à 3,3V.
Pour ça, il me semble qu'un LM3940 ou similaire, avec ses condos, ça serait parfait.

Oui, mais les sorties du MSP430 vers le JAMMA seront aussi 3,3V, du coup… c'est là qu'interviennent les sn74lvc4245a.
Le sn74lvc4245a est un bus de 8 bits prenant 3,3V d'un côté et 5V de l'autre, nickel!

Du point de vue du MSP430, on a besoin d'un grand nombre d'I/O, potentiellement 16 pour les sorties et 3 pour le panel.
Donc, le format DIP, avec ses 20 broches, sera un peu short niveau des I/O…
Il va falloir employer le format TSSOP qui met à disposition 28 broches, mais moins facile à souder, puisque c'est du CMS.




EDIT : mise à jour du typon, version 0.4 maintenant au format paysage plutôt que portrait.  <:)
#3
Now loading... Please wait.

Timer et signal d'horloge.
Grâce au timer, nous allons, dans un premier temps, faire clignoter nos leds (on y revient toujours, quand on débute, c'est la solution la plus simple).
Ensuite j'espère arriver à générer un signal PWM - toujours grâce au timer - pour modifier l'intensité lumineuse de notre led.



Tout d'abord, un rappel des opérateurs bitwise.
Parce que moi, je ne m'en lasse pas! :-\

AND : &
|
OR : |
|
XOR : ^
|
NOT : ~


BitA BitB BitA&BitB
0
0
0
0
1
0
1
0
0
1
1
1
|

BitA BitB BitA|BitB
0
0
0
0
1
1
1
0
1
1
1
1
|

BitA BitB BitA^BitB
0
0
0
0
1
1
1
0
1
1
1
0
|

BitA ~BitA
0
1
1
0
Et n'oubliez pas que ces opérations s'effectuent bit à bit!

Les éléments du MSP430G2231 que nous utiliserons lors de ce tuto.




Pourquoi modifier la fréquence du signal d'horloge?
Les MSP430 sont équipés d'un oscillateur interne, que Ti nomme le Digitally Controlled Oscillator - ou DCO -.
Cet oscillateur est calibré de manière logicielle à 1MHz avec ±3% d'erreur (le réglage est disponible via CALDCO_1MHz). A partir des MSP430G2232, le calibrage est fait pour 8, 12 et 16MHz.
La précision du DCO est largement suffisante pour les applications où la précision n'est pas essentielle. Si une grande précision est nécessaire, il sera indispensable d'équiper son µC avec un cristal externe de 32KHz - LFXT1CLK, Low Frequency eXTernal CLocK 1 -.
(certains MSP430 peuvent avoir jusqu'à 2 sources d'horloge externes)

La fréquence de 1MHz du DCO est le signal d'horloge utilisé par défaut - si rien n'est définit dans le code - par le MSP430 pour le CPU.
Cette fréquence est économe en énergie tout en conservant une vélocité tout à fait acceptable pour la plupart des utilisations "normales".
(Les MSP430 possèdent de nombreux modes de fonctionnement différents permettant de minimiser la consommation du µC, ça fera l'objet d'un autre tuto)

Mais parfois, il est nécessaire d'avoir un peu plus de "punch" et comme pour nos ordinateurs, des Hz en plus permettront une amélioration des performances du processeur.
Sachant que les MSP430 de la value line peuvent tous grimper jusqu'à 16MHz, on a de la marge à disposition.  :D

Les MSP 430 possèdent 3 lignes d'horloge :

  • MCLK - Master CLocK, pour le CPU.
    La source de ce signal peut être le DCO ou des sources externes.
    C'est le signal d'horloge ayant le plus de sources possibles.
  • SMCLK - SubMaster CLocK, utilisé pour la majorité des périphériques.
    Sa source peut être
  • ACLK - Auxiliary CLocK, c'est un signal d'horloge optionnel.
    Sa source est un cristal basse fréquence externe au µC ou, si ce cristal n'est pas présent, l'oscillateur basse fréquence - LF - interne au µC.
    Cette ligne est utilisée pour les modes de fonctionnement basse consommation.

Comment modifier la fréquence du signal d'horloge?
Il y a plusieurs éléments qui vont intervenir, peu importe l'oscillateur utilisé, comme les registres BCSCTL1 et BCSCTL2 (Basic Clock System ConTroL).
Pour le DCO, le registre permettant de modifier la fréquence est DCOCTL - DCO ConTroL -, celui-ci est divisé en deux parties.

Les 3 bits de DCOx nous permettent de choisir la fréquence.
Les 5 bits de MODx contrôlent la modulation entre la fréquence sélectionnée par DCOx et celle directement supérieure. De manière à obtenir une plage de fréquence plus diversifiée.

Pourquoi utiliser un timer?
Un timer a de nombreuses fonctionnalités, il permet :
- de "compter" le temps jusqu'à une valeur donnée, et déclencher une interruption.
- de générer un signal PWM -pulse width modulation -.
- de comparer des intervalles de temps - et donc de capturer ceux-ci - par le biais de ses registres.

Si on repart sur nos leds qu'on souhaite faire clignoter, qu'est-ce que l'utilisation du timer va nous apporter?
Le "compteur à interruption" permet de se passer de cette boucle for infinie, mais surtout du __delay_cycles(), qui va occuper le µC pour... ne rien faire, juste perdre du temps.
La génération de signal PWM nous permet d'envisager des transitions progressives entre led allumée et led éteinte.
La comparaison d'intervalle nous permettrait de définir la rapidité de clignotement des leds par le biais du bouton.
Ce sont juste des exemples simples, mais il y a bien d'autres applications possibles.





Méthodes pour me contacter
Au cas où vous rencontriez une embûche, si vous voulez discuter ou approfondir les explications ou les explorations à propos de ces tutos, voici quelques méthodes pour me contacter :
- par ce sujet
- par MP
- par mail
- par jabber
- par msn
J'utilise la même adresse mail pour msn et jabber: kodein AT reflexd.com (j'essaye d'éviter les moissonneurs automatiques d'adresse ;) ).
#4
Une première interface de dialogue homme-machine : le bouton
Et oui, tout le monde le sait, surtout sur un forum dédié à l'arcade, que le bouton-poussoir est la plus belle invention de l'homme pour se faire comprendre d'une machine.
La seconde plus belle étant, à mon avis, le microswitch qui a grandement amélioré la première!   :P
Et donc, nous allons utiliser un bouton pour faire comprendre à notre µC qu'à certains moments, on veut que nos leds clignotent et pas à d'autres. (et je cite Balladur: "Je vous demande de vous arrêter!")



Tout d'abord, un rappel des opérateurs bitwise.
Parce que c'est toujours utile!  :D

AND : &
|
OR : |
|
XOR : ^
|
NOT : ~


BitA BitB BitA&BitB
0
0
0
0
1
0
1
0
0
1
1
1
|

BitA BitB BitA|BitB
0
0
0
0
1
1
1
0
1
1
1
1
|

BitA BitB BitA^BitB
0
0
0
0
1
1
1
0
1
1
1
0
|

BitA ~BitA
0
1
1
0
Et n'oubliez pas que ces opérations s'effectuent bit à bit!

Les éléments du MSP430G2231 que nous utiliserons lors de ce tuto.





Intro
Pour cet exercice, on va partir du tuto-002 avec de légères modifications pour rendre le code plus "solide".

#include <msp430g2231.h>

void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // désactivation du watchdog
P1OUT &= ~(BIT0 | BIT6); // bits de sorties correspondants à P1.0 et P1.6 à 0
P1DIR |= (BIT0 | BIT6); // définit P1.0 et P1.6 en tant que sorties

for (;;)
{
 P1OUT ^= (BIT0 | BIT6); // inversion de l'état des bits de sorties 0 et 6
 __delay_cycles(250000); // de manière a réduire la vitesse de clignotement
}
}


Vous remarquerez que l'opérateur de concaténation/addition "+" a disparu.
La raison est simple, cet opérateur additionne bêtement les valeurs : 0000‿0001₂ + 0000‿0001₂ = 0000‿0010₂.
Hors, vu que nous manipulons majoritairement des valeurs binaires, les opérateurs bitwise permettent d'éviter des bourdes : 0000‿0001₂ | 0000‿0001₂ = 0000‿0001₂.
Donc si par erreur on tape P1OUT ^= (BIT0 | BIT0); seul le BIT0 de P1OUT sera modifié.
Alors qu'avec P1OUT ^= (BIT0 + BIT0); on se serait retrouvé avec le BIT1 de P1OUT modifié... bonjour le merdier!
(Merci a Keube pour m'avoir signalé ça dans le tuto-002  ^-)

Premiers pas dans la gestion du bouton poussoir
Pour que notre µC sache que notre bouton, raccordé à P1.3, est une entrée, il suffit de définir le BIT3 de P1DIR à 0. Ou de ne pas toucher au BIT3 de P1DIR, par défaut tous les bits de registres sont réinitialisés à 0 à chaque démarrage du µC (mon choix personnel).

Comment récupérer l'état du bouton? Deux solutions se présentent à nous.
La première, est d'aller voir "manuellement" quel est l'état du BIT3 de P1IN dans une boucle. Cette méthode est tout à fait fonctionnelle, mais un peu laborieuse et on va gaspiller pas mal de ressources.

Les MSP430 nous permettent une seconde solution bien plus "raffinée" et performante pour gérer ce genre d'événements. Et ce sont les interruptions.
Une interruption, comme son nom l'indique, interrompt le processus en cours d'exécution, "note" l'endroit où il en était dans son processus, et exécute le code lié à l'interruption, puis reprend là où il en était. Je ne rentrerai pas dans les détails de ce processus, cette petite explication rapide est suffisante pour comprendre le principe fondamental. Dans notre cas, l'interruption se déclenchera lorsque l'on poussera sur le bouton.
Conclusion, nous allons nous oublier P1IN en faveur de P1IE (Port 1 Interrupt) et passer le BIT3 de ce dernier à 1 pour définir P1.3 comme déclencheur d'interruption. P1IE |= BIT3;
Mais il faut aussi activer le gestionnaire d'interrupts dans le µC, pour ça, il est nécessaire de rajouter la ligne suivante après l'assignation du BIT3 au gestionnaire d'interruptions du port 1__enable_interrupt();

Le corps du code
Bon, on a définit la condition de déclenchement de l'événement, maintenant, il faut définir modifier la boucle de clignotement des leds.
Le plus simple est d'utiliser une variable et une condition. On initialise cette variable à 0, on va utiliser une variable globale de type nombre entier non signé.
(Variable globale = variable définie en dehors des fonctions. Nombre entier non signé ça signifie que si on lui assigne un chiffre négatif, il ne tiendra pas compte du "-")
unsigned int blinking = 0;
Dans la boucle, si cette variable est plus grande que 0, alors le changement d'état des deux bits contrôlant les leds se produit, sinon, on continue la boucle.

for (;;)
{
 if(blinking > 0){
  P1OUT ^= (BIT0 | BIT6); // inversion de l'état des bits de sorties 0 et 6
 __delay_cycles(250000); // de manière a réduire la vitesse de clignotement
 }
}


Ce qui s'exécute durant l'interruption
Il nous reste encore à produire le code qui va s'exécuter lors d'une interruption.
#pragma vector=PORT1_VECTOR
Citation de: keube le Jeudi 26 Mai 2011, 23:54:18 PM
De façon générale dans les microcontroleurs on trouve une table de vecteurs d'interruptions à une adresse donnée de la mémoire. Sur le msp430 (celui du tuto?) elle se trouve entre 0x0FFFFh et 0xFFC0h.
A chaque adresse correspond une fonction à appeler quand l'interruption tombe.  Par exemple, toujours sur le même micro, l'interruption correspondant au port 1 se trouve en 0x0FFE4h.
Ton #pragma vector=PORT1_VECTOR va donc placer une "redirection" vers l'interruption __interrupt void Port_1(void) à cette adresse.

Note qu'elle est commune à tout le port 1, et tu dois donc y gérer les interruptions des 8 pins si tu en actives plusieurs.


__interrupt void Port_1(void)
{

Le "__interrupt" préviens que ce n'est pas une simple fonction, mais le code de gestion de l'interruption. Cette fonction particulière, ne renverra rien - le "void" - et ne prends rien comme argument - le (void) -.


blinking ^= 0x01;

Alors, le préfixe 0x indique au compilateur que la valeur est une valeur haxadécimale. Par défaut, les valeurs hexadécimales sont codées sur 16 bits, juste ce qu'il nous faut pour "remplir" un unsigned int. 0x01 vaut donc 0000‿0000‿0000‿0001₂.
Pour le reste, vous devriez être capable de comprendre l'effet de cette ligne de code.


P1IFG &= ~BIT3;

P1IFG (Port 1 Interrupt FlaG) est - semble-t-il - le registre dans lequel sont stockés le fait qu'un interrupt s'est déclenché sur un des bits. Pour que l'interrupt puisse à nouveau se produire, il faut nettoyer le registre, d'après ce que j'ai compris.

//OPTIONNEL

P1IES ^= BIT3;

P1IES - Port 1 Interrupt Edge Select - ce registre va permettre de sélectionner sur quel flanc du signal l'interruption va se produire. Si un bit est à 0 (par défaut), c'est le flanc montant, à 1 c'est le flanc descendant.
Ce que cette ligne de code fait, c'est que les leds ne clignoteront que lorsque le bouton sera enfoncé.
//OPTIONNEL


P1OUT &= ~(BIT0 | BIT6);
}

Et on s'assure que les leds soient éteintes.

Résultat
Ce qui nous donne, au démarrage du µC, les leds sont éteintes, on appuie sur le bouton P1.3 , les leds se mettent à clignoter. Et si on appuie à nouveau, les leds s'éteignent.


#include <msp430g2231.h>

unsigned int blinking = 0; //variable globale contrôlant le clignotement

void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // désactivation du watchdog
P1OUT &= ~(BIT0 | BIT6); // bits de sorties correspondants à P1.0 et P1.6 à 0
P1DIR |= (BIT0 | BIT6); // définit P1.0 et P1.6 en tant que sorties
P1IE |= BIT3;

__enable_interrupt();

for (;;)
{
 if(blinking > 0){ // si blinking est plus grand que 0, alors on clignote, sinon, on ne fait rien
  P1OUT ^= (BIT0 | BIT6); // inversion de l'état des bits de sorties 0 et 6
 __delay_cycles(250000); // de manière a réduire la vitesse de clignotement
 }
}
}

#pragma vector=PORT1_VECTOR // Joker
__interrupt void Port_1(void) // initialisation de la fonction interrupt
{
blinking ^= 0x01 // blinking étant une variable globale, elle est aussi accessible depuis l'interrupt et ici, on inverse l'état de son BIT0
P1IFG &= ~BIT3; // Remise à 0 du flag d'interrupt
// P1IES ^= BIT3; // Changement de flanc pour la génération d'interruption
P1OUT &= ~(BIT0 | BIT6); // on s'assure que les leds sont bien éteintes après un appuis sur le bouton
}


Challenge!
Je vais corser un peu par rapport au précédent.
Pour ce challenge, vous allez partir de votre solution au challenge précédent.
Ensuite, il faut qu'au démarrage les 2 leds soient éteintes.
Au premier appuis sur le bouton, les leds doivent clignoter alternativement.
Au second appuis, les deux doivent être éteintes.
Et bien sur, ça doit fonctionner plus de 2 fois sans reset  ;)

Si vous voulez pousser le vice à fond, il y a une requête supplémentaire, il faut qu'au troisième appuis, le clignotement reprenne là où il avait été interrompu!
(Challenge battu, même la partie vicieuse =:)) )




Encore merci à Keube, il m'est d'une grande aide, aussi bien pour la rédaction que pour améliorer ma façon de coder  ^-^




Méthodes pour me contacter
Au cas où vous rencontriez une embûche, si vous voulez discuter ou approfondir les explications ou les explorations à propos de ces tutos, voici quelques méthodes pour me contacter :
- par ce sujet
- par MP
- par mail
- par jabber
- par msn
J'utilise la même adresse mail pour msn et jabber: kodein AT reflexd.com (j'essaye d'éviter les moissonneurs automatiques d'adresse ;) ).
#5
Comment faire clignoter les deux leds présentes sur le Launchpad?
Pour ce tuto, je vais utiliser le MSP430G2231 (parce qu'il est déjà sur mon launchpad), mais le 2211 fonctionnera tout aussi bien.
Si vous n'avez pas encore fait vos premiers pas avec CCS, je vous invite à aller voir le tuto-001, qui explique comment installer CCS et comment créer un projet pour MSP430.
Avant d'attaquer le code, il reste encore une étape importante, il va falloir que je vous explique l'architecture physique et logique de ce µC.
(Attention, je vais vous faire chauffer les neurones!)

L'architecture logique et physique du MSP430 sur son LaunchPad

Comme on peut voir sur le schéma, le µC est équipé de :

  • 2kB de mémoire flash
  • 128B de RAM
  • un CPU avec 16 registres
  • un port P1 gérant 8 I/O
Le reste des éléments composants le µC ne nous intéressent pas dans l'immédiat.
Au niveau logique pure, les leds du launchpad sont connectées au port P1, sur les I/O 0 et 6, et du point de vue physique, la led rouge est connectée à la pin 2 qui correspond à P1.0 et  la led verte est connectée à la pin 8 qui correspond à P1.6.

Voici donc en vert, les éléments du µC qu'on va utiliser de manière "volontaire".


Maintenant qu'on sait où sont connectées les leds aussi bien au niveau logique que physique, comment passer cette information au µC?
Et bien, il va falloir configurer les registres liés à P1. Sous le nom "barbare" de registre se cachent une série d'adresses de zones mémoire. Pour simplifier, ce sont ces registres qui font l'interface entre la couche logique et la couche physique du µC.
En premier lieu, il nous faut définir le sens des I/O, dans notre cas P1.0 et P1.6 sont des sorties. Le registre qui s'occupe de ça se trouve à l'adresse 0x22, pour simplifier, on l'a nommé "P1DIR" (Port 1 DIRection). Ce registre est un "mot" de 8 bits et chaque bit correspond à un I/0 de P1. Un bit à 1 indique que que l'I/O est une sortie et inversement, un bit à 0 indique une entrée.
Ils faut donc passer les bits 0 et 6 de P1DIR à 1, de cette façon, le µC sait que ses deux pins sont connectées à quelque chose qui attend de recevoir des impulsions.

Ardu, hein?
Mais c'est indispensable d'avoir une bonne idée sur comment les registres fonctionnent pour pouvoir programmer votre µC.
Toutes les actions qui nécessitent une interaction entre le programme et les composants internes - timer, etc. - ou externes via les ports de communication - GPIO, SPI, I²C, etc. - se font via les registres.
Par exemple, pour allumer ou étreindre les leds, il faudra jouer sur le registres "P1OUT".

Maintenant qu'on a une bonne idée de comment ça marche, il est temps de passer au code!

Les mains dans le cambouis... enfin, le code quoi ;)

#include <msp430g2231.h>

Ce fichier .h (header) va nous permettre - par exemple - d'utiliser le nom du registre plutôt que son adresse hexadécimale. Ça rend le code beaucoup plus clair, je vous recommande de TOUJOURS inclure le .h correspondant au µC que vous utilisez.
C'est dans ce fichier que sont définies, par exemple, les valeurs de BIT0 et BIT6 que nous allons utiliser par la suite.
Si on va regarder dans son code, on découvrira que BIT0 est défini à la valeur 0x01 ( 0000‿0001₂ ) et BIT6 à la valeur 0x40 ( 0100‿0000₂).


void main(void)
{

On définit une fonction "main".
Le "void" qui précède "main" indique que la fonction ne renverra rien comme résultat, alors que celui entre parenthèse nous indique que la fonction ne requiert aucune valeur en entrée.


WDTCTL = WDTPW + WDTHOLD;

Alors, ça, c'est le truc le plus "ésotérique" du code. Cette ligne de code désactive le "watchdog timer" - WDT -... Et là, vous allez remarquer qu'une toute petite ligne de code peut mener à une longue explication :D
D'après ce que j'ai pu décrypter, c'est un système qui permet de détecter si le µC est actif ou si son programme l'a planté, si il est planté, le WDT vas redémarrer le µC.
Et, si j'ai bien compris, c'est à nous de gérer cet outil dans notre logiciel, ce qui est au-delà de mes compétences à l'heure actuelle. Donc, pour gagner du temps, j'ai choisi le désactiver purement et simplement.
WDTCTL (WDT ConTroLler) est donc un registre, mais ce registre est protégé. Pour écrire dedans, il faut utiliser le WDTPW (WDT PassWord). Dans notre cas, on souhaite stopper totalement le WDT, d'ou l'usage de la valeur WDTHOLD (HOLD - suspendre) en combinaison avec WDTPW.


P1OUT &= ~(BIT0 + BIT6);

Et là on a droit à une seconde ligne de code rikiki qui va générer une grosse explication!  :D
Donc, dans cette ligne de code, on s'assure que les leds sont éteintes. Pour ce faire, c'est le registre de 8 bits nommé P1OUT (Port 1 sorties) qu'on doit modifier.
L'I/O P1.0 correspondant au bit 0 de P1OUT et P1.6 correspondant au bit 6 de P1OUT, doivent être à 0 pour que les leds soit éteintes dès le démarrage du µC.
P1OUT
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
Port 1
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
Valeur binaire
X
0
X
X
X
X
X
0
(Les valeurs binaires se lisent de droite à gauche, donc le bit 0 est à droite et le bit 7 à gauche. Les X désignent des emplacements où il on se fiche de la valeur binaire.)
Maintenant, pourquoi utilise "&=" et pas simplement "="?
La combinaison &= c'est comme si on faisait "P1DIR = P1DIR & (BIT0 + BIT6)".
L'opérateur & est ce qu'on appelle un opérateur bitwise, il va effectuer l'opération binaire AND bit à bit* sur les deux membres de l'opération.
(* c'est à dire qu'il va effectuer l'opération & entre le bit 0 du premier membre et du second membre, et ensuite la même chose pour tous les autres bits des membres.)
La table de vérité de la fonction AND est la suivante :

BitA BitB BitA&BitB
0
0
0
0
1
0
1
0
0
1
1
1
~ opérateur bitwise NOT : donc si Octet1 = 0100‿0001₂, alors ~(Octet1) = 1011‿1110₂.
Si P1OUT = 0100‿1001₂, alors 0100‿1001₂ & 1011‿1110₂ = 00001000₂ on a bien modifié que les bits qu'on voulait éteindre.


P1DIR |= (BIT0 + BIT6);

Wohooo et de trois!  ;D Ne m'en voulez pas, je vais faire bref!
Ici, on veux configurer P1.0 et P1.6 en tant que sorties.
Et en va s'en assurer grâce à l'opérateur bitwise | correspondant à la fonction binaire OR:

BitA BitB BitA|BitB
0
0
0
0
1
1
1
0
1
1
1
1
Partons du principe que P1DIR vaut 01001000₂, si on applique un OR avec 0100‿0001₂ nous donnera comme résultat 0100‿1001₂.
Le |= nous permet dont de nous assurer que les bits qui doivent être passés à 1 le sont, sans toucher à l'état des autres bits.  ^-


for (;;)
{

Une petite boucle for sans arguments, ce qui veut dire qu'elle va tourner éternellement.
(Généralement, une boucle for se construit de cette façon : for(initialisation d'une variable compteur ; comparaison entre la variable compteur et une autre valeur; incrémentation ou décrémentation de la variable compteur){code à exécuter})
C'est bien utile quand on veut faire des logiciels "à cycles" rapidement et simplement.


P1OUT ^= (BIT0 + BIT6);

Gniiii encore un opérateur bitwiiiise  >:D
Mais je vous rassure, là, je crois bien qu'on les a tous fait  :D
^ c'est l'opération binaire XOR (ou exclusif)

BitA BitB BitA^BitB
0
0
0
0
1
1
1
0
1
1
1
0
Si P1OUT = 0100‿1001₂, alors 0100‿1001₂ ^ 0100‿0001₂ = 0000‿1000₂ on donc inversé l'état des bits désignés par (BIT0 + BIT6) \o/


__delay_cycles(250000);
}
}

Ahhh, ça, c'est une fonction qui permet de stopper pendant 250000 cycles l'exécution du code.
Ça évite d'avoir les leds qui clignotent trop vite.
Vous pouvez jouer avec cette valeur pour provoquer de jolies crises d'épilepsie... je rigole, ne le faites pas!  :-X

Voilà, le code est complet, si vous compilez et programmez votre MSP430 avec ce code, il devrait faire clignoter les deux leds de concert.

Challenge!
Je vous propose de chercher comment modifier le code pour que les leds s'allument alternativement!
La modif très simple, si vous avez bien lu le tuto, vous devriez trouve très rapidement.
S'il vous plait, ne postez pas votre réponse. ^-




Méthodes pour me contacter
Au cas où vous rencontriez une embûche, si vous voulez discuter ou approfondir les explications ou les explorations à propos de ces tutos, voici quelques méthodes pour me contacter :
- par ce sujet
- par MP
- par mail
- par jabber
- par msn
J'utilise la même adresse mail pour msn et jabber: kodein AT reflexd.com (j'essaye d'éviter les moissonneurs automatiques d'adresse ;) ).
#6
Programmer les µC compatibles avec le LaunchPad
Pour programmer les µC compatibles avec le LaunchPad, la méthode la plus simple est d'utiliser un IDE.

D'abord qu'est-ce qu'un IDE?
Un IDE (Environnement de Développement Intégré) est un logiciel regroupant un éditeur texte (avec coloration syntaxique, etc...), un compilateur et généralement un débugger. (C'est effectivement le cas pour CCS)

Quels sont les IDE disponibles?
CCS et IAR sont les deux IDE sous Windows recommandés par Ti.
Il y a d'autres IDE pour Linux ou osX, mais soit ils sont payant, soit ce sont des outils en ligne de commande, mais ils feront l'objet d'un autre tutorial ou d'une mise à jour de celui-ci.
La plupart de ces IDE ou autres compilateurs utilisent le C comme langage de programmation.
Il existe un compilateur en assembleur, c'est un langage intéressant, mais très bas niveau (ça ne veut pas dire que le langage est idiot, mais qu'il est très près du langage machine ;)). Donc un peu ardu.

Lequel choisir?
Je vous conseille de débuter avec CCS pour la raison suivante :
La où IAR nous permet de compiler un programme de 4kB, CCS permet un programme de 16kB.
Hors, les plus "gros" MSP430 compatibles avec le LaunchPad (les MSP430G25xx) comportent un espace programmable de 16kB.
Donc, quitte à apprendre à manier un IDE, autant en choisir un couvrant tous les MSP430 accessibles à notre matériel.

Où télécharger CCS et IAR?
Sur la page concernant le LaunchPad du wiki de Ti, ici
Pour télécharger CCS il vous faudra un login Ti et remplir un petit "bon d'exportation" dans lequel vous devrez expliquer l'usage que vous ferez du logiciel. Bien entendu, évitez de dire, "pour déconner" que c'est pour développer du matos militaire, des radars ou des trucs du genre  :D
Comme pour le questionnaire que vous devez remplir dans l'avion pour aller aux USA, c'est un peu ridicule, mais ils prennent ça TRES au sérieux.
Le lien que Ti vous fournira (sur la page suivant et par email) pour télécharger CCS sera valide pendant 16 jours, au-delà vous devrez refaire une demande.

Okay, CSS est téléchargé, je fais quoi maintenant?
Je pars du postulat que vous savez décompresser un fichier ZIP et lancer l'installateur.

Il ne vous reste plus qu'à lancer l'exécutable.


Cliquez sur Next autant de fois qu'il faudra pour arriver à ça (vous devrez, entre-temps, accepter la licence) :


Appuyez sur OK, malgré cette alarme, tout a toujours fonctionné parfaitement  :D


Ici, choisissez l'option "MSP430-only Core Tools" ça vous évitera d'installer tout un tas de modules qui ne vous seront pas utiles ;)


Rien à changer, sauf si vous souhaitez utiliser un autre programmateur pour MSP430 que le Launchpad, qui ne serait pas USB.


Appuyez sur Next à plusieurs reprises pour arriver à cet écran. C'est à ce moment que l'installation de CCS va débuter. Ne vous étonnez pas si des fenêtres apparaissent et disparaissent, ce sont les modules qui s'installent.


Et voilà installation terminée!

Premier contact/première compilation avec CCS! (A.K.A. Tuto-001)
Nous allons simplement reprogrammer le MSP430G2231 avec son programme original (clignotement des 2 leds et senseur de t°).
Lancez CCS.


Un joli splashscreen noir et rouge va s'afficher, et ensuite, un dialogue pour la création d'un workspace va apparaitre.
Pour en avoir fait les frais lors de ma première installation, je vous recommande de mettre votre workspace à la racine de votre partition et d'éviter d'utiliser des caractères accentués ou des espaces dans le nom du dossier. Mon prénom contenant des accents, CCS avait des soucis pour s'y retrouver. :?


Créez un nouveau projet CCS.


On va le nommer Tuto-001, appuyez sur Next.


Vous finirez par arriver à cet formulaire où vous devrez choisir pour quel modèle de MSP430 vous allez développer. La liste déroulante de gauche permet de choisir la famille de MSP430 (dans notre cas, les MSP430Gxxxx) et celle de gauche permet de choisir quel modèle (MSP430G2231).
Vous pouvez finaliser la création du projet.


Cliquez droit sur le projet et ajouter un fichier source C.
Par habitude je nomme le fichier source contenant la fonction main() avec le nom main. Vous pouvez le nommer comme vous le souhaitez, mais je vous conseil de prendre cette bonne habitude  ;)
Validez la création de "main.c".

Vous pouvez maintenant copier/coller le contenu de ce fichier "main.c" dans votre "main.c".

C'est maintenant qu'il faut brancher votre Launchpad à votre machine, windows devrait installer automatiquement tous les pilotes nécessaires (si ce n'est pas le cas, réinstallez CCS!).

Et cliquez sur l'espèce de cafard vert, en haut à gauche dans la barre d'outils.

Sans déconner, main.c a été modifié! ;D
Ben oui alors, sauve. Là, il va y avoir des lignes qui vont défiler et si tout s'est bien passé, vous allez tomber sur l'écran suivant.


Patientez un peu, il compile le code et tente d'établir la connexion avec le launchpad et de programmer le µC.


Et il ne se passera rien tant que vous n'aurez pas cliqué sur le bouton play appelé "Run".
A ce moment le launchpad devrait se comporter comme prévu par son programme.


Pour arrêter le débug, il suffit de cliquer sur le bouton stop rouge, appelé "Terminate All".

Félicitations, vous avez programmé votre MSP430!
Vivement le Tuto-002 où nous allons créer un programme pour faire clignoter les leds rouge et verte du launchpad (la folie totale, non?). :P
#7
LaunchPad & MSP430: présentation

«LaunchPad»?

Le LaunchPad est un kit de développement pour les microcontrôleurs - abbrégé µC - Texas Instruments - Ti - de la série MSP430G2xxx au format Dual Inline Package - DIP -, comportant jusqu'à 20 pins.
Il est particulièrement intéressant pour les débutants de par son prix très bas, à peine 4,30$ et les frais de port sont offerts.
C'est probablement le kit «prêt à l'emplois» le moins onéreux à l'heure actuelle.


µC, MSP430G2xxx, DIP... ??? o_O
Attention, partie très technique, j'ai essayé de faire simple et d'expliquer au maximum les termes, mais ça reste principalement du jargon électronique/informatique.

Un µC se présente sous la forme petit bout de plastique ou céramique avec des points de connexion électrique sous forme de petites pattes, pin ou pads métalliques. Il existe différents formats de boitiers, mais le seul compatible avec le LaunchPad et donc le seul qui nous intéresse, c'est le format DIP déjà cité. Format grandement favorisé par les hobbyistes, parce que facile à manipuler et souder. Pour des applications «pro», on choisira un des versions Composants Montés en Surface - CMS - prenant bien moins d'espace sur un circuit imprimé - PCB -.

A gauche un G2211 DIP, plus précisément 14PDIP car le boitier est en plastique - Plastic DIP - et possède 14 pins.
A droite deux G2553 au format 20TSSOP - thin-shrink small outline package - dans leur package industriel.
Les puces au format TSSOP sont généralement vendues sous forme de rouleau de "bande perforée" pour le placage automatisé des CMS sur les PCB par des robots.


Une puce est nommée µC si elle contient un processeur, un peu de mémoire Flash ou de l'EEPROM - Electrically Erasable Programmable Read Only Memory - qui va contenir son programme, et de la RAM pour pouvoir stocker les valeurs temporaires. Les pins servent au µC à «dialoguer» avec l'extérieur, elles sont appelées I/O - Input / Output - de manière générale, mais dans le cas des µC, on parle de GPIO - General Purpose Input Output - car on peut modifier leur usage par programmation.
Un µC étant considérablement plus petit que le processeur de votre PC de tous les jours, sa puissance s'en trouve bien réduite, mais aussi sa consommation électrique. Ce qui permet de les utiliser dans l'électronique embarquée - montre-bracelet , calculatrice, voiture, lecteur MP3, etc. - et même en fonctionnant sur piles/batteries de petite taille, conserver une grande autonomie.

Et le MSP430, alors, y viens d'où, y a quoi dedans, ...?_?
Concentrons nous sur le MSP430, c'est un type assez récent de µC que Ti a commencé à produire en 2010 - il me semble - et continue à étoffer à l'heure actuelle. Les MSP430 sont des µC à très basse consommation électrique, c'est à dire qu'il consomment encore moins que la plupart des autres µC, tout bénef pour nos piles!
La série MSP430G2xxx, aussi appelée Value Line par Ti, sont des MSP430 particulièrement peu chers.
Attention, peu cher ne signifie pas qu'ils sont peu puissant, admirez plutôt :

  • fonctionne sur des tensions entre 1,8 et 3,6V
  • consomme ± 220µA par MIPS actif, si alimenté en 2,2V
  • réveil du mode de veille en moins de 1µs
  • 10, 16 ou 24 GPIO, en fonction du nombre de pins présentes sur la puce
  • architecture RISC 16 bits
  • de 128 à 512 Bytes de RAM
  • de 0,5 à 16 KiB de mémoire Flash pour le programme interne - firmware -
  • jusqu'à 16MHz, en fonction du modèle le maximum peut être 8MHz
  • jusqu'à 16 Millions d'Instructions Par Seconde - MIPS - en fonction du modèle
  • comparateur analogique
  • convertisseur de signal analogique en digital
Pour une comparaison rapide et un peu "crapuleuse", le processeur d'un Amiga 500, le Motorola 68000, effectue ±0,7MIPS à ±7MHz et le Motorola 68020 d'un Macintosh II, 2,6MIPS à 16MHz.
Attention, il existe une différence majeure entre un MPS430 et ces processeurs. Les Motorola sont des processeurs 32bits tandis que le MPS430 est 16bits. Si je ne m'abuse, cela signifie que le MSP430 ne pourra manipuler que des valeurs contenues dans 16bits.
Mais quand on voit les jeux que les développeurs ont réussit à pondre sur la SNES avec un CPU 16bits, je me dis que c'est largement assez. :D

Et comment je programme le MSP430 qui est sur le LaunchPad, moi?
Ti propose deux IDE - Integrated Development Environnment, Environnement de développement intégré - gratuits mais exclusivement sous Windows. Les utilisateurs de Linux et d'os X devront se contenter d'outils console/terminal. Rien de bien méchant, mais c'est moins confortable, il faut le reconnaitre.
Ces deux IDE sont IAR Embedded Workbench KickStart et Code Composer Studio - CCS -.
Dans leur version gratuite, ils sont limités à des programmes de 4kB pour IAR et 16kB pour CCS, donc petite préférence pour CCS qui permettra de programmer tous les MSP430 compatibles avec le LaunchPad. (le G2553 possède 16kB de mémoire flash)
Comme dit plus haut, si un éditeur texte vous suffit, qu'un makefile et la console/le terminal ne vous font pas peur - une fois tout bien installé/configuré, un "make install" dans le dossier du projet suffit -, tout ce qu'il vous sera nécessaire est disponible sur le net.
Et voici le tuto détaillé pour installer et commencer à utiliser CCS sous Windows!  ;)

Comment commander?
Intéressé? Passez commande sur le site de Ti, seulement 4,30$! Les frais de livraisons sont gratuits et pas de problèmes de douanes, le colis est envoyé depuis Ti Europe.
Et si vous êtes intéressé par les interfaces type touchpad, Ti propose le Capacitive Touch BoosterPack pour le LaunchPad à 10$.
D'autres vendeurs tels que Mouser ou Digi-Key le proposent aussi, mais il coute plus cher...

Qu'allez vous recevoir?
Le kit contient le PCB rouge du LaunchPad, des connecteurs et un cristal d'horloge sous forme de composant monté en surface à souder, deux MSP430 (un G2211 et un G2231), un câble usb ainsi qu'un guide de découverte rapide : "Meet the LaunchPad".
Pas des CD, les IDE et autre compilateurs de code source proposés par Ti sont à télécharger sur le net.

Le G2231 est monté d'origine sur le LaunchPad et programmé avec une petite démo. Il suffit de brancher le LaunchPad à son PC avec le câble USB et la démo fait clignoter les LEDs rouge et verte. Dès qu'on appuie sur le bouton gauche, le µC va passer en mode lecture de température. Si la température chute sous le point de référence, la LED rouge s'allumera de manière de plus en plus intense, si la température va au-delà de la référence, la verte s'allumera de plus en plus intensément.

Mes tutoriels fait à l'ancienne rien que pour vous!
Tuto 001 : Installer CCS, compiler du code et programmer votre µC pour la première fois.
Tuto 002 : Les opérations bitwise et les registres grâce auxquels nous allons faire clignoter les leds.
Tuto 003 : La base des interruptions, ou comment "parler" à votre µC avec un bouton-poussoir.
Et bien d'autres à venir!

Documentation. Attention, tout est en anglais.
Page wiki de Ti dédiée au Launchpad
User guide du Launchpad
User guide des µC MSP430x2xxx
Datasheet MSP430G2211
Datasheet MSP430G2231

Info importante!
Ti, comme la plupart des gros fondeurs de puces, a un système d'échantillons gratuits, la livraison depuis les USA est offerte et exempte de TVA : pas de frais de douane  =:)) . Il y a quelques conditions bien entendu: 2 pièces par modèles, 4 modèles de puces maximum et jurer sur l'honneur que ce n'est pas pour développer des armes bactériologiques...  ;D

Note pour ceux qui voudraient des µC plus costaux
Potentiellement, le LaunchPad est capable de programmer tous les MSP430 compatibles avec le Spy-Bi-Wire, sans exception.
Mais pour ce faire, il faudra que vous mettiez au point un adaptateur, puisque le seul format supporté physiquement par le launchpad, ce sont les DIP 14 & 20 maximum.
#8
Dossier plus détaillé avec pleins d'explications sur les termes techniques : http://www.gamoover.net/Forums/index.php?topic=23628.0  ;)

Texas Instruments vend pour un prix plancher un kit de développement pour la ligne de microcontrôleurs basse consommation MSP430.

Le LaunchPad pour le MSP430 à 4.30$.
Le kit contient la carte USB de programmation/test/débug/émulation et 2 microcontrôleurs.
Ces microcontrôleurs possèdent les caractéristiques suivantes: 8MHz de type RISC 16bits, 128kB de ram, 2kB de flash et 10 I/O.
Ils effectuent 8MIPS, par comparaison, le CPU 68000 d'un amiga effectue ±0,7MIPS et le 68020 d'un Macintosh II, 2,6MIPS. ;)



Ils mettent aussi en vente un Boosterpack contentant un touchpad capacitif.
(Les boosterpacks sont des "cartes filles", d'autres modèles seront probablement produits. Il est simple de créer ses propres boosterpack)
Il coûtera 10$, mais est disponible à 4,30$ pour une durée limitée.


Le launchpad et le boosterpack sont expédiés gratuitement depuis les Pays-bas par DHL, il n'y a donc aucun risque de frais de douanes.

N'oubliez pas que la plupart des fondeurs de puces proposent des "samples" gratuits de leurs composants.
Très utile lorsque l'on souhaite tester des composants inconnus sans débourser un centime.
Les samples que j'ai commandé chez TI m'ont été expédiés TRES rapidement depuis le Dakota du nord par Fed-Ex.

Mes tuto fait à l'ancienne rien que pour vous!
Tuto-001 : Installer CCS, compiler du code et programmer votre µC.
Tuto-002 : Les opérations bitwise et les registres grâce auxquels nous allons faire clignoter les leds.
Tuto-003 : La base des interruptions, ou comment "parler" à votre µC avec un bouton-poussoir.
Et bien d'autres à venir!

[Edit] Refonte du premier message pour centraliser toutes les infos. Plus facile à lire pour quelqu'un qui n'aurait pas envie de relire toute la discussion.
#9
Le Bistrot de l'Arcade / [Résolu] Au secours de ma PSP
Samedi 26 Mars 2011, 14:24:44 PM
Bonjour...

Désolé de polluer le forum avec quelque chose qui n'a rien à voir avec l'arcade, mame ou les jeux rétro.

Je vous explique, j'étais tranquillou en train de faire une update du firmware de ma PSP slim.
Bien entendu, je ne prends plus la peine de la brancher sur le secteur pour cette opération tellement courante grâce à Sony.
Et il s'avère que cette fois, ma PSP a décidé de se suicider du haut de la table.
Comme la batterie et le couvre-batterie tiennent en place plus par miracle qu'autre chose, ils ont mis les bouts au moment du choc au sol.

Sans grand espoir, j'ai voulu allumer ma psp, et effectivement, écran noir + led verte pendant 30 secondes et ensuite, elle s'éteint.
Ma PSP est bel et bien brickée  :oo:

Donc je cherche une personne dans la région de Liège, équipée d'une PSP - slim de préférence - avec custom firmware, qui serait assez aimable pour me faire un kit Despertar del Cementerio (batterie + memory stick).
Ce kit pourrait probablement sauver ma PSP et me permettre de jouer de nouveau à mes jeux - dont certains fraichement acquis -.

N'hésitez pas à me contacter par MP.
#10
Bon, je vous fait la partie roadtrip en texte, parce que pas de photos. Dizoulay missious  :-[



R.T.
Attention, âmes sensibles, s'abstenir... surtout que c'est long.


Le message de Bal au sujet de la borne générique pas chère en Belgique n'étaient pas tombé dans l'œil d'un sourd... heu, bref.
Après contact par MP il m'a dit où elle se situait et à ce prix, ça m'aurait fait mal de passer à côté!
Etant sans permis de conduire, "Papa, au secours". Mettre une borne dans une clio... moyen bas comme idée donc "très cher fréro, pourrais-tu nous prêter ta voiture du boulot où l'essence il est gratuit pliiz?". Coup de bol, tout se goupille nickel  ^-

Voyage de 150km (±300 aller-retour) aller confortable, départ de Liège à 8h, arrivée à Couvin à 9h45.
On ne s'est "perdu" que 2 fois - no GPS inside -  ;D

Une fois sur place, mon père et moi repérons assez rapidement la borne.
Je tourne un peu autour de la borne, histoire de faire un premier constat avant achat:
- BEAUCOUP de poussière *ATCHOUM!*, ça réveille mes allergies instantanément
- le t-molding a essaye de se faire la malle, pour le punir il a été empalé sur place par des clous
- quelques éclats dans le bois... et le t-molding sur certains angles
- des toiles d'araignées PARTOUT... PLEIN  :(
- tien, pas de panneau à l'arrière de la borne, faudra acheter une plaque de contreplaqué ou de mdf, histoire de boucher le trou béant.
- que vois-je de mes petits yeux incrédules?  :-X Mais c'est un PCB!
- le moniteur est bien la et il a Hantarex écrit de partout
- panel rafistolé, ils ont riveté à l'arrache une plaque de métal sur le panel existant  >:(
- joysticks et boutons en sale état, pas grave, je ne comptais pas les utiliser
- rouille à profusion, ais-je déjà mentionné la poussière... et les toiles d'araignée?
-pas de serrure pour la porte des monnayeurs... ah, si, elle est dans la boite, elle a été forcée et arrachée.

Une petite discussion avec le paternel s'en suit :
Lui : "Tu vas VRAIMENT acheter ÇA?"
Moi : "Ben oui"
Lui : "Pour 25€, t'es sûr?"
Lui : "Ça serait moi, je préférerais repartir sans!"
Moi : "Ben, même dans cet état, une borne pour 25€ c'est une relativement bonne affaire."
Lui : "... Bah, c'est toi qui voit!"

Payement des 25€.
Sortie - difficile vu que je suis épais comme un sandwich SNCF -  de la borne pour chargement.
Comme un blaireau je manque de me prendre le moniteur sur les pieds, heureusement, je le sauve in extrémis avec le genou *OUCH*

Et là commence le joyeux "Merde, la borne est trop haute, elle rentrera JAMAIS dans la bagnole".  :-)=
Je vire le moniteur de la borne, histoire qu'elle ne pèse plus qu'un demi âne mort.
On pousse, tire, bascule ... le coffre ne ferme pas et mon père refuse de rouler avec une ficelle pour tenir la porte sur 150km.
Bon, plus qu'une solution, avancer le siège passager... Ce qui ne s'avère pas suffisant il faut aussi le basculer en avant.
Ouaiiis, je vais faire un voyage de retour trop confortable avec les genoux dans le tableau de bord et le crâne à deux doigts du pare-brise!

Tout le voyage a été un concerto de cliquetis divers et variés, qui avaient une légère tendance à stresser mon père.
Personnellement, très vite, les cliquetis ont cessés de m'inquiéter, par contre, le mal de dos et de genoux lié à la position atroçe...
12h, Liège, ENFIN!

On décharge, tout rentre dans mon appart... sauf que j'ai à peine la place pour me déplacer maintenant  :D
Petit détail rigolo, j'ai cassé ma clef dans la serrure de la porte de l'immeuble. J'ai pu récupérer le morceau dans la serrure, mais il a fallu sonner chez le voisin du dessus pour qu'il nous ouvre la porte  :-((

Mon père me laisse, je le remercie chaudement parce que faire des conneries de ce genre à 68 ans, c'est pas tout le monde qui y arrive!



Paparazzi time!
Avec des vraies photos faites à l'objectif frotté au beurre salé dedans!©


Extérieur:

La borne avec le petit mouchoir pour caler la porte ce qui a effectivement réduit grandement le nombre de cliquetis qui stressaient mon père  :D
On peut apercevoir - vaguement entre deux cristaux de sel -, au bas de la borne, le bac à pièces sans porte devant... sauf qu'elle est bien présente, mais elle tient plus d'une trappe que d'une porte.
C'est à dire qu'elle ne possède pas de gonds, c'est une patte qui se cale derrière la façade d'un côté et de l'autre, la serrure qui solidarisent la porte à la borne. Cette porte a été judicieusement positionnée sur le bac à pièces coinçant relativement bien les deux dans la borne. (et ça devait aussi être une source de grincements/cliquètements)


La borne après un bon coup d'éponge et un peu moins floue.


Plaque rivetée par-dessus le panel originel.


Grille type voitures années 80-90 pour le baffle

Intérieur:

PCB mystère à deux étages Grosses chance que ça soit un boot de Xain'd Sleena  :mrgreen:
(Et vu la qualité de la photo, vous n'allez pas pouvoir m'aider :D )



Alimentation





Moniteur et quelques détails de la platine.
Il est petit mais n'a pas l'air d'être marqué.
En même temps, si l'écran avait été plus grand, la borne ne serait jamais passée par la porte de mon appart  :P
Je subodore, vu la longueur des câbles et la tronche du support moniteur, que l'écran peut être mis soit à l'horizontale, soit en tate. J'aime!


J'allais presque oublier le câble d'alim sur le toit de la borne ¿avec son interrupteur?



Et les monnayeurs mécaniques, que j'avais totalement oublié de prendre en photo!
Comme on peut voir, les loupiotes qui éclairent les "tarifs" dans le plastique rouge ne sont plus connectées. Bien entendu, ça sera reconnecté et si nécessaire, remplacé par des leds toutes neuves.



Suite du programme


Ben y a du boulot!
Là, je me suis posé bien confortable pour récupérer du voyage plié en 3 , voire en 4 et vous rédiger ce petit (ok, il était petit il y a... 1h  =:)) ) compte rendu.
Ensuite, j'irai me faire à bouffer (le casse-croute de 11h m'a fait tenir jusqu'à maintenant)  :D

Au programme de cet aprèm :
Dépoussièrage et détoilage, puis démontage du pcb, qui a pris un peu sur sa gueule - certains composants ont une ou des pattes dans le vide - et essayer de trouver des indices sur ce que c'est comme jeu. (sachant que je n'ai pas de programmeur de PROM, donc je ne peux pas lire leur contenu)

A court terme:
Nettoyer encore un peu la borne, acheter des piles pour appareil photo et prendre de belles photos bien nettes et pouvoir faire des photos macro.
Acheter un multimètre et une station de soudage neufs, les miens sont complètement foutu.
Re-câbler toute la borne de manière propre en prévoyant les futures modifs. Il y a des soudures qui me stressent en ce moment. Et je voudrais vraiment faire le plus clean possible pour pouvoir intervenir rapidement et assurer une bonne fiabilité à l'avenir.

A moyen terme:
Démonter les parties métalliques, les dérouiller au dremel et les traiter pour pas avoir de rechute. Re-peindre les pièces métalliques apparentes. (sachant que les pieds etc. sont quasi impossibles à atteindre vu que coucher la borne dans mon appart tient plus du tetris qu'autre chose)
Démonter le panel, virer la plaque rivetée, reboucher les trous (si possible, sinon, faudra bricoler un nouveau panel). Refaire un layout neo geo avec un joy sanwa ou seimitsu et des boutons concaves à microswitch (pas certain d'arriver à caser 4 boutons par joueur vu la taille du panel  :-\ ).
Nettoyer, re-câbler et tester l'alim (de ce que j'ai vu, tous les fusibles ont été virés, ça va être rigolo pour retrouver les bons!) donc, remettre un cable d'alimentation... et pas sur le toit de la borne.  :D
Nettoyer et tester l'écran "à vide".
Remettre en état le PCB.
Tester l'écran et le PCB ensemble.
Une fois mon slot neo geo arrivé, si l'alim et l'écran sont ok, le mettre dans la borne et JOUER!  :-)=
Refaire un ciel en carton potable (l'existant est en piteux état) et remplacer le carton noir autour de l'écran.

A long terme:
Acheter un panneau pour refaire un dos à la borne.
Replacer des serrures.

A très long terme:
Virer le t-molding, boucher les trous et les effritements sur les bords des sides, remettre du t-molding neuf et poser de beaux stickers vinyle personnalisés sur les sides.
Refaire un beau marquee.
Peindre le dos de la borne.

PS: Si vous voyez des trucs qui piquent les yeux, soit vous les niez, soit vous me les signalez gentiment, s'il vous plait, merci d'avance.
EDIT: Ajout de remerciements à Bal et WiP à 0%  :?
#11
ConsoleCabs / J'ai fait un rêve! Un rêve où Zelda …
Mercredi 02 Février 2011, 14:27:33 PM
...se jouerait à 4 sur une borne d'arcade!

Ce matin au réveil, une idée complètement dingue m'a traversée l'esprit.
Pourquoi ne pas faire une borne dédiée à Zelda Four Swords?
Ou plus exactement dédiée au jeux en "multi GBA", puisqu'il y a aussi Final Fantasy : Crystal Chronicles.
Les souvenirs des soirées Mario Kart Double Dash - FF : CC - Phantasy Star Online à 4 me sont revenus subitement.
C'est à ce moment que "Et pourquoi pas?" a frappé  :D
Imaginez 4 potes jouer sur une borne avec un grand écran commun et un petit écran devant chaque joueur, à faire les fous dans l'univers de zelda.   :-)= RHAAA NEED!

Donc pour me faire une idée plus concrète de ce que j'ai en stock et ce qu'il faut acquérir, voici ma liste des ingrédients:

  • 1 Gamecube\Wii | OK\OK - L'avantage de la Wii, c'est qu'il est possible de créer des compilations de jeux NGC sur "grand" DVD ou d'utiliser un chargeur d'ISO depuis un disque USB.
    Ca évite de devoir changer de disque pour changer de jeu et donc d'ouvrir la borne.
  • 1 Zelda Four Swords | OK - Je voulais l'acheter mais ça ne s'est jamais fait, au final. En version JAP, mais je l'ai!
  • 1 Final Fantasy : Crystal Chronicles | OK - Le disque est en parfait état, pas de soucis.
  • 4 Câbles GC - GBA | OK - Déjà 2 câbles en stock et il y a eu des tonnes de clones, ça se trouve sans gros soucis
  • 4 GBA à dépiauter | KO - On ne touche pas à ma SP rouge métal, ni à ma GBA noire "afterburnerisée" par mes soins!
  • 1 Borne | KO - Mon appart est trop petit, à moins de sacrifier mon lit ou mes livres, donc plus tard.
Liste conséquente, et on remarque tout de suite qu'il me manque des éléments clefs!
Dont Zelda, j'ai jeté un coup d'œil rapide sur eBay où il est - comme d'habitude - complètement hors de prix. Il faudra que je cherche plus sérieusement.
Les 4 GBA SP ne vont pas être évidentes à trouver à des prix abordables pour mon portefeuille. Pas besoin de GBA cosmétiquement parfaites, ils faut juste qu'elles fonctionnent.

Conclusion, c'est bien une idée de dingue que je vais me mettre sous le coude pendant quelques temps.
Et dès que l'opportunité/les sous/le temps se présentera, je passerai à la réalisation!  ;D

De ce que je sais seuls FF : CC et Four Swords font du multi avec les GBA, si vous avez d'autres infos, n'hésitez pas à m'en faire part.