High-End 8-Bit-Mikrocontroller mit externem Speicherinterface

(C) 15.11.2005 by Daniel Porzig

Der PIC18F8720 ist mit seinem 128kB-Programmspeicher ohnehin schon sehr üppig ausgestattet. Durch das Interface für externen Speicher (EMI) kann der Programmspeicher mit Hilfe von Flash-Speicherbausteinen auf bis zu 2 MBytes aufgestockt werden.

In diesem Projekt verwende ich jedoch keinen Flash-Speicher, sondern 2x 128 KByte SRAMs. Damit bieten sich völlig neue Möglichkeiten.

Bei der Verwendung von SRAMs als Programmspeicher braucht man sich nicht um die Einhaltung der maximalen Anzahl von Schreibzyklen des Speichers kümmern. Der SRAM-Programmspeicher ist nicht nur unbegrenzt oft beschreibbar, sondern auch noch schnell.


1. Konzept
Die Idee hinter dem Projekt ist es, eine Vielzahl verschiedener Programme auf einem Mikrocontrollersystem ausführen zu können, ohne den Chip von außen jedes Mal neu programmieren zu müssen.

Die zentrale Rolle übernimmt dabei die Software im FLASH-Speicher des PIC. Hier wird ein Betriebssystem abgelegt, welches die dynamische Benutzung des externen Speichers ermöglicht.

„User-Programme“ werden mit Hilfe des Betriebssystems in den externen SRAM-Programmspeicher kopiert und dort auch ausgeführt. Als Datenträger für diese Programme sollen Speicherkarten dienen, aber auch das schlichte Herunterladen über die RS-232-Schnittstelle wäre denkbar.


Die nebenstehende Abbildung zeigt das geplante Speicherlayout. Beim Betrieb des Prozessors im "Extended Microcontroller Mode" beginnt der externe SRAM-Speicher ab Adresse 0x20000h.


2. Die Hardware
Da ich mit der kostenlosen Version von Eagle arbeite, waren die Platinenmaße mit 100 mm x 80 mm von vornherein festgelegt und Platz für eine luxuriöse Ausstattung der Prototypenplatine stand nicht zur Verfügung.

Trotzdem ist auf dem Board alles Nötige vorhanden:
Zwei 128kB SRAM-Bausteine (V62C5181024LL-35W), die zugehörige Interface-Logik (74HC373), ein RS-232-Anschluss mit Pegelkonverter (MAX232), ein Reset-Taster, ein 64kB-EEPROM (24LC512) und natürlich ein Spannungsregler für eine konstante Versorgungsspannung der Bauteile. Alle freien Port-Pins des PIC18F8720 sind auf einen 40-poligen Wannenstecker geführt.

Über Jumper kann zwischen SPI und I²C gewählt werden. Da beide Module 2 Pins teilen ist eine gleichzeitige Nutzung nicht möglich. Der 18F8722 hat hier zwar eine Lösung parat, da er zwei SPI/I²C-Module besitzt, allerdings werden die Pins des zweiten Moduls zwangsläufig für das EMI benötigt.

Das Zusammenlöten der Schaltung war allerdings nicht ganz einfach. Bei 0,5 mm Pinabstand des PIC18F8720 hört der Spaß auf! So musste ein Großteil der Lötarbeit unter meinem guten alten russischen Binokular-Mikroskop durchgeführt werden. Dort erscheinen die einzelnen Beine des Chips wie Ziegelsteine. Es bedarf also nur noch einer ruhigen Hand und einer abgefahrenen Löttechnik.

Wer das Teil nachbauen möchte, möge dies gerne tun. Erfahrungsberichte sind immer willkommen. Das Board ist für den PIC18F8720 sowie den PIC18F8722 geeignet!
Die Eagle-Dateien (geroutetes Board + Schematics) können hier heruntergeladen werden:

exmemboard_smd_spi.zip


3. Erste Tests
Nachdem das übliche erste Testprogramm (blinkende LED) bereits Zufriedenheit verbreitete, war der externe Speicher an der Reihe. Zum schnellen update der Firmware wurde auch hier erst einmal der Colt Bootloader in den PIC gebrannt.

Die ersten Tests, welche einfache Byte-Werte in den externen Speicher schrieben und zur Kontrolle zurücklasen zeigten ebenfalls vielversprechende Ergebnisse. (Die Ausgabe erfolgte zunächst über RS-232 im Windows Hyperterminal)

Der Nächste Schritt war der Anschluss des 320x240 Pixel Monochrom-LCD mit S1D13305 Controller, um eine bequemere Debug-Ausgabe zu ermöglichen.

Die folgenden Fotos zeigen die Anfänge:

Die Prototyp-Platine

Ein 6 Mhz Quarz ergibt mit dem internen Frequenzmultiplikator des PIC (PLL) eine Taktfrequenz von 24 Mhz.

(Bild anklicken zum Vergrößern)

320x240 LCD im Textmodus

Das LCD besitzt zum Glück die LCD-Interface v4 - Platine von Wallbraun Electronics inclusive Inverter für die CCFL-Hintergrundbeleuchtung. Der Anschluss gestaltet sich dadurch sehr einfach und unkompliziert.
Zur Ansteuerung wird Port F des PIC verwendet, zusätzlich werden noch 5 weitere Pins zur Steuerung benötigt.

(Bild anklicken zum Vergrößern)

Speichertest

Das einfache Programm schreibt den ganzen externen SRAM mit definierten Werten voll und prüft anschließend auf Abweichungen.
Primär sollte damit getestet werden, ob das External Memory Interface (EMI) so funktioniert wie geplant.
Da zwei 8-Bit-SRAMs verwendet werden, wird das EMI im Byte-Write-Modus betrieben.

(Bild anklicken zum Vergrößern)


Das folgende Bild zeigt die bereits bekannte 3D-Engine modifiziert für den 18F8720:

Auch hier wird das Bild zunächst im internen RAM des Mikrocontrollers berechnet und dann als ganzer Block an das Display gesendet.
Das "Grafikfenster" ist in diesem Fall 144 x 80 Pixel groß (für viel mehr reicht der interne RAM) leider nicht.
Die Grafik pixelweise zu berechnen und auch pixelweise ans Display zu senden dauert viel zu lange (zum Setzen eines Pixels muss zunächst ein Byte vom Display gelesen, verändert und wieder zurückgesendet werden). Dadurch ließe sich die Grafik aber natürlich in 320 x 240 anzeigen :)
Das EMI beschränkt die maximale Frequenz des Systems allerdings auch auf 24 Mhz...man sollte sich also nicht zu viel erhoffen.
Das berechnete 3D-Bild wird in einem bestimmten Intervall im externen RAM abgespeichert und direkt wieder (unter dem Original) angezeigt.




4. Betriebssystem
Mit der zur Zeit der Entwicklung des Mikrocontrollersystems aktuellen Version des CCS C Compilers war es nicht möglich, die Interrupt-Service-Routines (ISR) wie geplant in den externen SRAM-Programmspeicher zu verlagern. Dies hat leider zwangsläufig zu einer Modifikation des Konzepts geführt. Momentan wird der Prozessor daher im Modus "Mikroprozessor mit Bootblock" betrieben, womit man leider auf den größten Teil des internen Programmspeichers verzichten muß. Vom internen Speicher kann nur der 512 Bytes große Bootblock genutzt werden. Das ist schade und sorgte dafür, dass die Umsetzung des Konzeptes etwas anspruchsvoller geworden ist. Die folgende Abbildung zeigt das Speicherlayout, wie es derzeit verwendet wird:

Mikroprozessor mit Bootblock - Modus

Der PIC18F8720 kann in verschiedenen Konfigurationen betrieben werden. Ausser im "Extended Microcontroller Mode" wird das external memory interface noch im "Microprocessor with Boot Block Mode" unterstützt.
Der ganz entscheidende Nachteil dieser Konfiguration wird in der nebenstehenden Abbildung deutlich:
Es können nur die ersten 512 Bytes des internen Programmspeichers genutzt werden! Auf den Rest der 128 kB gibt es keinen Zugriff.
Auch wenn dies eine enorme Verschwendung darstellt, löst dies das Problem mit der Kompilerrestriktion.
Wie die Abbildung des Speicherlayouts zeigt, kann man hier problemlos die Interrupt-Service-Routines an die Adresse 0x200 verfrachten, da der externe SRAM an dieser Adresse beginnt.
Der Loader im Boot Block läd in dieser Variante das Betriebssystem beim Power-Up des Systems aus dem externen I²C-EEPROM und schreibt es in den externen SRAM. In der Programmiersprache C ist es allerdings nicht besonders einfach, einen Loader zu entwickeln, der im Boot Block des Prozessors Platz hat. Die Dekodierung des Hex-Files muss möglichst bereits am PC erfolgen, um diese rechenintensiven Programmteile dem PIC zu ersparen.

Die Übertragung der Firmware über die serielle Schnittstelle (RS-232) erfolgt mit Hilfe eines kleinen Windows-Programms (geschrieben mit Borland C++ Builder).
Das Betriebssystem (EMOS) empfängt immer 24-Byte-große Datensätze und schreibt die eingehenden Daten direkt an die mitgesendete Adresse im SRAM.
Um das Betriebssystem auf dem PIC zu entlasten wird die HEX-Datei durch den Firmware Loader bereits konvertiert.


Auch ein Update des Betriebssystems ist von dem Firmware Loader aus möglich. Hier macht sich der Vorteil bemerkbar, dass ein externes EEPROM zum Abspeichern des Betriebssystems genutzt wird. Da das Betriebssystem auf dem PIC im externen SRAM ausgeführt wird, kann das Speicherabbild im EEPROM natürlich problemlos vom Betriebssystem aus überschrieben werden.

Die User-Programme können während der Ausführung jederzeit durch das Senden eines Stop-Kommandos vom Firmware Loader aus beendet werden.
Anschließend wird direkt die Ausführung des Betriebssystems fortgesetzt. Das bereits geladene Programm kann nun jederzeit erneut ausgeführt werden (bis es vom Loader aus durch anderen Code ersetzt wird).


5. Testprogramme ("User-progs")
Eine wirklich sinnvolle Anwendung für das vorgestellte Mikroprozessorsystem bietet sich in dieser Form bislang nicht, da die User-Programme nach dem Booten des Betriebssystems zunächst über die serielle Schnittstelle in den SRAM geladen werden müssen.
In Kombination mit SD-Speicherkarten wird es möglich, Firmware direkt automatisch von der Speicherkarte zu lesen und auszuführen.
Um die Funktionalität des Systems zu testen habe ich einige User-Programme geschrieben. Alle Programme sowie das Betriebssystem beinhalten Treiber für das 320x240 Pixel - Monochrom-LCD.

Startbildschirm des Betriebssystems (EMOS)

Bislang besteht das Betriebssystem fast ausschließlich aus den Lademodulen, welche über die serielle Schnittstelle (RS-232) Firmware empfangen und im SRAM oder im EEPROM abspeichern.

(Bild anklicken zum Vergrößern)

Das 3D Testprogramm

Um die Rechenpower des Systems zu demnonstrieren habe ich die PIC 3D-Engine für den 18F8720 modifiziert. Bei 24 Mhz lassen sich hier ca. 25 Frames / Sekunde erreichen.

(Bild anklicken zum Vergrößern)

Primzahlrechner

Dieses einfache Programm testet von einem Startwert ausgehend alle Zahlen auf mögliche Teiler und bestimmt so Primzahlen.
Sobald die Zahlen mehr als 6 Stellen haben, braucht man allerdings eine gehörige Portion Geduld =)

(Bild anklicken zum Vergrößern)

Grafische Darstellung der Mandelbrotmenge

Hierbei handelt es sich um einen C-Quelltext, den ich einst irgendwo im Internet gefunden und nun für meinen Singleboardcomputer modifiziert habe.
Bei Programmstart lassen sich ein paar Parameter wie z.B. Auflösung und Zoom einstellen.
Die Berechnung eines 320x240-Pixel-Bildes dauert bei ausreichender Genauigkeit allerdings schon mal 20 Minuten (ist halt nur ein 8-Bit-Prozessor)

(Bild anklicken zum Vergrößern)



6. Kommentare
Das Mikrocontrollerboard bietet durch seine Konzeption viele Möglichkeiten. Der Verhältnismässig riesige und schnelle SRAM-Speicher kann z.B. auch zum Aufzeichnen von Daten genutzt werden.
Auch für Steuerungsaufgaben ist das System bestens gerüstet. Es wäre z.B. denkbar, das Board als Steuerung für eine Fräsmaschine zu benutzen. Über die serielle Schnittstelle würde man das Steuerungsprogramm per PC oder SD-Speicherkarte für ein spezielles Teil in den Speicher laden, anschließend würde das Mikrcocontrollerboard die Fertigung eines oder einer Serie des Teils selbständig durchführen.
Sobald das SD-Speicherkarteninterface integriert ist, wäre es auch möglich, durch Anschluss eines MP3-Dekoderchips und Digital/Analogwandler das Board als MP3-Player zu mißbrauchen.
Das Board bietet somit noch viele Experimentiermöglichkeiten =)
Während der Entwicklung der Software - besonders des Betriebssystems - hat sich jedoch gezeigt, dass die Verwendung des PICs in dieser Form nicht unbedingt im Sinne des Erfinders lag. Zum Beispiel traten sehr bald Probleme bei der Unterstützung des externen SRAMs durch den CCS C Compiler auf.
Diese zwangen mich dazu, das Board im "Microprocessor with Bootblock Mode" zu betreiben und auf den größten Teil des 128kB FLASH-Speichers zu verzichten.
Anschließend musste ich eigene Routinen für das Auslesen eines externen I²C-EEPROMs entwickeln, da bei Benutzung der Hardware-Routinen der Bootloader nicht in den 512 Bytes großen Bootblock gepaßt hätte.
Der Bootvorgang des Betriebssystems ist leider auch nicht besonders flott. Um das derzeit 5kB-große Betriebssystem aus dem EEPROM in den SRAM zu kopieren braucht der Mikrocontroller ca. 15 Sekunden. Allerdings ist dieser Bootvorgang im Normalfall nur einmal nach dem Einschalten der Spannungsversorgung notwendig. Ist das Betriebssystem erst einmal geladen, können beliebig viele Programme nacheinander in den SRAM übertragen und ausgeführt werden.

Wer an den Sourcecodes der einzelnen Programme, des Betriebssystems oder des Bootloaders interessiert ist bzw. sonstige Fragen zu dem Projekt hat, kann mir wie immer gerne mailen.


Home
Letztes Update: 28.10.2007