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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.