vendredi 12 janvier 2018

Busy Bee partie 4, breakout

Dans cette quatrième partie consacrée au EFM8BB10F8G je discute de l'implémentation du jeu breakout. Il s'agit d'un jeu d'arcade datant de 1976. Il s'agit de casser un mur de brique à l'aide d'une balle qui rebondie sur les murs extérieurs ainsi que sur la palette que le joueur déplace de gauche à droite dans le bas de l'écran.

Breakout

Le MCU EFM8BB10F8G ne possède que 512 octets de mémoire RAM divisé en 256 octets de mémoire interne idata et 256 octets de mémoire externe xdata. La mémoire externe est utilisée comme mémoire vidéo ce qui limite la résolution d'écran à 64 pixels par 32 pixels en monochrome. C'est suffisant pour ce jeu. J'ai créé un projet appellé BBchip8 dans simplicity studio. je l'ai appellé ainsi pour 2 raisons. La première étant que la résolution est la même que pour l'émulateur CHIP-8 et la seconde est que j'ai implémenté dans les fichiers chip8.c et keypad.c des fonctions qui permettent d'écrire d'autre jeux dans le style CHIP-8 en utilisant la même base de code. D'ailleurs le jeu breakout utilisant moins de la moitié de la mémoire programme il serait possible d'ajouter un autre jeu sur la même plateforme et d'offrir un menu de sélection à l'utilisateur. Le jeu tétris entrerais dans la mémoire restante.

schématique du circuit

schématique

prototype

Bien que le jeu breakout n'utilise que 2 boutons j'ai installé 6 boutons, 4 boutons de directions et plus les boutons A et B. Ça donne plus de flexibilité à la plateforme matérielle pour l'installation d'autres jeux.

Utilisation du configurateur

Il s'agit d'un projet créer avec le configurateur.

Un oscillateur à cristal externe avec une fréquence de 25.175Mhz est utilisé. Fsys fonctionne à la fréquence maximale.

Le watchdog timer est désactivé.

Le Programmable counter array est utilisé pour générer le signal NTSC. Les 3 canaux sont utilisés.

Les 3 canaux fonctionnent en mode 1, 16 bits software timer.

Le périphérique SPI est utilisé pour sérialiser les pixels vidéo.

La minuterie 0 est utilisée pour les délais et la minuterie 1 pour les sons.

Les interruptions sur le PCA et sur le TIMER0 sont activées.

Une fois la configuration matérielle complétée j'ai modifié le type d'interruption pour le périphéarique PCA dans le fichier interrupts.c de la façons suivante:

SI_INTERRUPT_USING (PCA0_ISR, PCA0_IRQn,1)// use register bank 1
L'objectif de cette modification est de réduire le temps de réponse de l'interruption en utilisant la banque de registre 1 au lieu de la banque 0. Ça évite d'avoir à sauvegarder le contenu des registres de la banque 0 sur la pile. Si on retourne dans le configurateur pour faire des modifications après cette modification manuelle. Le configurateur va regénérer l'interruption originale sans effacer cette modification. Le compilateur va signaler une erreur puisqu'il y aura 2 routines pour PCA0_ISR. Il faudra donc supprimer celle créée par le configurateur.

organisation du code.

  • Le fichier chip8.c contient les routines pour la gestion vidéo, les sons, la routine pause() pour les délais ainsi que des routines pour le générateur pseudo-aléatoire. Le générateur pseudo-aléatoire utilise le convertisseur analogue/numérique pour lire une entrée inexistante. En effet à la mise sous tension le registre ADC0MX contient 0x1F. Avec cette valeur l'entrée du convertisseur est flottante. On lit donc le bruit produit par le MCU. Seul le bit le moins significatif est conservé, celui-ci étant suffisamment aléatoire pour cette application. La fonction random() accumule le nombre de bits demandés en appelant répétitivement rand_bit() qui est la fonction qui lit la sonde de température.
  • Le fichier keypad.c contient les routines pour la lecture des boutons.
  • Le fichier breakout.c contient la logique du jeu.
  • Les autres fichiers sont ceux générés automatiquement par le configurateur. Dans le fichier interrupts.c le code pour la gestion des interruptions PCA et TIMER0 a été ajouté manuellement.
L'ensemble du projet est disponible sur github.

vidéo démo

Aucun commentaire:

Publier un commentaire

Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.