Forum: Projekte & Code AT89S52 8051 Projektvorstellung: Mehrkanalsound, Matrixdisplay, SpaceInvaders, SPI, Trackermusik


von Matthias Larisch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Wie ich vor einiger Zeit in einer Frage zum Thema 8051 - Keil - 
Codeerzeugung mal angekündigt hatte, habe ich zusammen mit Nils Heitmann 
ein 8051 Projekt im Rahmen einer Lehrveranstaltung im Studium 
durchgeführt. Dort ist einiges an Zeit reingeflossen, sodass ich dieses 
hier gerne einmal vorstellen würde.

Aufgabe war es, ein 8051 Board mit einem AT89S52, einem 8 kByte Ram 
sowie einem GAL16V8 als Adressdekoder zu entwerfen. Es steht eine LED 
Matrix mit 14x20 Zeichen zur Verfügung, welche ein Select- sowie ein 
Datenregister enthält, die am Adress/Datenbus angeschlossen werden. Die 
Matrix besteht aus 2* 5 Spalten mit je 7 Zeilen, das Selectregister 
aktiviert einen der fünf Spaltentreiber oder wählt eines von den 8 (2*4) 
Latches vor den Zeilen aus, um die Daten zu aktualisieren.
Ferner soll ein kleines Spiel umgesetzt werden.

Aus Spaß, Interesse und Tätigkeitsdrang erweiterten wir unser Board um 
eine Soundausgabe mittels eines ebenfalls per MMIO eingebundenen Latches 
gefolgt von einem 8 bit R2R DAC und einem kleinen Verstärker. Um damit 
auch was sinnvolles tun zu können, bauen wir noch ein 28C256 32 kByte 
EEPROM ein.

Der Code findet sich im Anhang.

Vermutlich wird niemand dieses Projekt als ganzes brauchen, jedoch 
finden sich einige Teile darin:
a) recht zügige SPI Slave Implementierung. Der von uns verwendete USBasp 
zum Programmieren ermöglicht (mit spezieller PC Software ohne 
Firmwaremodifikation) das Übertragen von 4 SPI Bytes vom/zum Target. 
Dies wird ausgenutzt, um über die ISP Schnittstelle mit dem Controller 
sprechen zu können. In der spi_asm.A51 sind Funktionen zum Lesen und 
Schreiben implementiert. die spi_command.c implementiert eine Art 
Protokoll darauf, um mit der beigefügten Software usbasp-spi einzelne 
Bytes im data/xdata Bereich lesen und schreiben zu können. Ferner ist 
eine Block-Schreiberoutine eingebaut, welche das (erträglich schnelle) 
reprogrammieren des EEPROMS ermöglicht. Da der EEPROM Programmer am 
Uniarbeitsplatz standardmäßig die Softwarewriteprotection aktiviert hat, 
gibt es auch eine Möglichkeit, diese zu entfernen :). Alle Kommandos, 
die eine Antwort vom 8051 zum PC senden, sind direkt in Assembler 
implementiert, da nur eine SPI-Bitzeit Zeit ist, um die Daten 
bereitzustellen (eventuell ein schlechtes Protokolldesign, aber so gings 
am einfachsten). Leider ergibt sich etwas Redundanz: Die 
Assemblerfunktion RW_BYTE kann die Funktion READ_BYTE vollständig 
ersetzen - sie ist durch Optimierung genausoschnell geworden.

b) schnelle Ansteuerung einer Displaymatrix nach obigem Schema. 
display.c beschreibt die Datenstruktur und die Zugriffsfunktionen, 
display_asm.A51 stellt den Timerinterrupt zur Ausgabe sowie eine 
Pixel-Setzfunktion zur Verfügung. Bilder werden doppelt gepuffert, bei 
Bedarf gibt es noch einen dritten Hintergrundpuffer (ungetestet, da doch 
nicht gebraucht). Da der Zeichenvorgang im Vergleich zur Ausgabe recht 
selten erfolgt und sowieso eine Berechnung erfordert, wird das Bild in 
einem Format abgelegt, welches eine sehr schnelle Ausgabe ermöglicht. 
Noch schneller ginge es, wenn der Adressdekoder eine Art DMA 
implementieren würde, in dem ein Teiladressbereich sowohl RAM als auch 
Display-Daten adressiert - dann würde ein einfacher Lesezugriff reichen 
(Diese Idee hatte eine andere Gruppe im Kurs, die Umsetzung ist aus 
nicht näher untersuchten Gründen gescheitert)

c) Sound. In einer Infostruct werden Informationen über bis zu 16 
Samples abgelegt. Diese sind in einem 4 Bit signed PCM Format. Die 
Nibbles werden unabhängig adressiert, d.h. in einem Byte können sich 
Daten aus 0, 1 oder 2 Samples befinden, unabhängig voneinander. Die 
Struktur ist im Code näher beschrieben. Die Samplerate beträgt 
fCPU/12/256, in unserem Fall 6510,417 Hz.
Das Abspielen von bis zu 4 Samples parallel ist möglich. Zusätzlich kann 
beim Abspielen resampled werden nach vorgegebener Tabelle. Es erfolgt 
keine Interpolation. Das Resample erfolgt so korrekt, dass ein 
wiederholendes Abspielen eines kurzen Samples den gewünschten Ton 
ergibt, ohne zusätzliche Unstetigkeiten an der Sprungstelle.

d) MOD Tracker ähnliches Musikformat. Zum Abspielen von Musik gibt es 
eine (sehr rudimentäre) Implementierung des "fmod" getauften Formats. 
Ich hab vergessen, wofür das f stehen sollte :) Es ist jedenfalls dem 
Amiga MOD sehr ähnlich, benötigt aber 1 Byte weniger pro Zeile pro 
Kanal. Eigentlich funktioniert nur der Arpeggio Effekt und die Jump to 
Order sowie Pattern Break Effekte und Song Speed richtig - die anderen 
sind entweder garnicht oder falsch implementiert.

e) PixInvaders. Ein SpaceInvaders Clone. Selbsterklärend :) Leider keine 
"motherships" und nur ein Leben. Tipp: Im Ordner pcsim befindet sich 
eine Simulationsumgebung für das Spiel. Könnt ihr mal ne Runde zocken :)

f) Font renderer: Ebenfalls recht rudimentär eine Möglichkeit, Texte 
mittels von bdf2c erzeugten und in C Datenfeldern gespeicherten Fonts 
anzuzeigen.


Das Projekt ist von unserer Seite her beendet, d.h. wir entwickeln daran 
auch nicht weiter. Der offensichtlich von uns erstellte Code darf gerne 
beliebig für nicht-kommerzielle Zwecke verwendet werden. Sollte er in 
nahezu unveränderter Form in irgendwelchen bedeutsameren Projekten 
verwendet werden, würden wir uns sehr über eine kurze Nachricht freuen.
Hinweis: Es liegen auch Dateien bei, von denen wir nicht Urheber sind. 
Dies ist entsprechend gekennzeichnet. Bei Weiterverwendung ist darauf zu 
achten, hier keine Rechte zu verletzen.

Und wie immer: Keine Garantie für nichts. Vor allem die PC Tools 
enthalten gröbere Fehler. Das usbasp-spi taugt nicht zum Flashen des 
Programmspeichers, obwohl es die Option bietet. Das Projekt befindet 
sich nicht in einem SDCC-kompilierfähigen Zustand, aber dort war es 
irgendwann mal. Daher finden sich noch Überreste der Kompatiblität.


Entstehungszeit: November 2011 bis Februrar 2012. Git sagt, es gab 146 
Commits mit 11819 Additions sowie 3293 Deletions. Dies dürfte 
größtenteils handgeschriebener Code sein :)

Gruß,

Matthias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.