Ausdenken, zeichnen, bauen – kein Problem mit PSoC Creator Von Mark Saunders, Product Marketing Manager, Cypress Semiconductor Corp. Embedded-Systems-Designer haben eigentlich besseres verdient als die heute üblichen, mit Features geizenden und nur auf einen Aufgabenbereich beschränkten Tools. Auch sollten Embedded-Designs mehr sein als nur eine Kombination aus Mikrocontrollern und diskreten Bauelementen, zusammengewürfelt mit Leiterplattendesign- und Softwareentwicklungs-Tools, die voneinander nichts wissen – von einer Integration ganz zu schweigen. Programmierbare Bauelemente sind nichts Neues und auch Embedded-Software ist älter als die meisten unter uns. Bei einem Großteil des Embedded-Designs geht es außerdem ganz gezielt um spezifische Interaktionen zwischen Software und Peripherie. Man muss sich deshalb wirklich fragen, weshalb es nicht schon längst Tools gibt, die all dies zu einem Ganzen verbinden und den Designern ein einfacheres, produktiveres Arbeiten ermöglichen. Als Antwort auf diese Frage präsentierte Cypress Semiconductor im September 2009 das Embedded-Design-Tool PSoC Creator für seine neuen PSoC-Architekturen (Programmable System-on-Chip) PSoC 3 und PSoC 5. PSoC Creator kombiniert die Unterstützung für die programmierbare PSoC-Hardware mit einer komplett ausgestatteten Software-IDE (Integrated Development Environment). Das Tool abstrahiert die Hardware so, dass man kein Experte für den jeweils verwendeten Baustein sein muss. Auch von den inneren Abläufen der Peripherie, mit der man die Hardware programmiert, benötigt man keine Detailkenntnisse. Chip-interne Verbindungen und I/Os werden automatisch geroutet. Außerdem generiert das Tool APIs (Application Programming Interfaces) für die Peripherie und für On-Chip-Funktionen (Komponenten), um eine fehlerfreie Interaktion seitens der Software zu gewährleisten. Was diese Aussagen bedeuten, soll nachfolgend an einem Beispiel erläutert werden. Verschiedene analoge und digitale Komponenten werden dabei in kurzer Zeit in einem PSoC 3 Baustein konfiguriert und zu einer ebenso einfachen wie nützlichen Applikation kombiniert, die einen Pin auf etwaige Überspannungen überwacht, eine als Warnmelder dienende LD ansteuert und die Zahl der Überspannungs-Phänomene sowie die maximale Dauer dieser Zustände protokolliert. Man muss dazu weder die verwendete CPU-Architektur kennen noch wissen, wie der analoge Komparator oder der digitale Timer implementiert sind. Was über den Chip bekannt sein muss, sind lediglich die Nummern der als I/Os zu verwendeten Pins (obwohl das Tool einem selbst diese Zuordnung abnehmen könnte). Bild: PSoC 3 Baustein, montiert auf einem PSoC Developers Kit Prozessormodul Das Designprojekt gliedert sich in drei Abschnitte. Der erste besteht aus der Spannungsvergleicher-Schaltung, die Überspannungen an einem Pin mithilfe eines Komparators erkennt. Der zweite Schaltungsteil steuert die Warn-LED an. Die Leuchtiode blinkt bei zu hoher Spannung und geht in Dauerlicht über, sobald die Spannung wieder auf einen unkritischen Wert zurückgegangen ist. Auf diese Weise wird signalisiert, dass eine Störung vorgelegen hat. Der dritte Abschnitt des Designs schließlich führt eine Statistik über die Vorkommnisse. Ein Zähler erfasst, wie lange die überhöhte Spannung anlag, sodass sowohl die Häufigkeit als auch die maximale Dauer der Überspannungs-Phänomene aufgezeichnet wird. “Think it – Draw it – Build it” with PSoC Creator Elektronik Journal Page 1 of 6 January 2010 [+] Feedback Bild: Schema der Überspannungs-Überwachung in PSoC Creator Zunächst zur Spannungsvergleicher-Schaltung, für die ein analoger Eingangs-Pin, ein Spannungs-D/A-Wandler zum Erzeugen einer Referenzspannung und ein Komparator benötigt werden. Letzterer zeigt mit einem digitalen High/Low-Signal den Spannungspegel an. Zum Erstellen des Designs werden zunächst die benötigten Komponenten in ein leeres Arbeitsblatt gezogen. Diese Komponenten sind in einem Katalog aufgelistet, den das Tool auf der rechten Seite darstellt. Es gibt eine Suchfunktion, und außerdem sind die Komponenten der Übersichtlichkeit wegen in einer vertrauten Baumstruktur angeordnet, aufgeteilt in Ordner namens Analog, Digital, Communication usw. Den analogen Pin findet man schnell im Ordner ‚Ports and Pins‘, und nach dem Anklicken dieses Elements wird das entsprechende Symbol und der Link zum zugehörigen Datenblatt angezeigt. Bild: Komponentenkatalog mit angewähltem Analog-Pin Soll dieser Pin verwendet werden, muss man ihn nur noch in das Design ziehen. Auf die gleiche Weise geht man mit dem DAC und dem Komparator vor, sodass die Grundelemente der Schaltung in Sekundenschnelle zusammengestellt sind. Jetzt stellt sich die Frage, wie die Referenzspannung festgelegt wird. Hier kommen die Komponenten-Parameter ins Spiel. Nach einem einfachen Doppelklick auf die Komponente im Schaltplan öffnet sich der Parameter-Editor als Dialogfenster. Da die Komponenten parametriert sind, lassen sie sich mit den jeweils gewünschten Attributen konfigurieren. Dabei sind die Parameter mit Bedacht so gewählt, dass sich die Konfiguration auf eine für den Designer sinnvolle Weise darstellen lässt, während die zugrunde liegende Implementierung abstrahiert wird. Im Fall des DAC wird nach der Entscheidung zwischen einem hohen und einem niedrigen Spannungsbereich (0..1 V bzw. 0..4 V) die gewünschte Spannung festgelegt. Man muss nicht die chip-interne Ressource für den DAC auswählen, es müssen keine Register eingestellt, keine Bitfelder geprüft und keine Masken angewandt werden. Man schließt einfach das Dialogfenster und hat alles erledigt, was für das Einrichten einer Spannungsreferenz im Design erforderlich ist. Links neben dem Arbeitsblatt erscheint eine Palette nützlicher Designwerkzeuge, zu denen auch das Wiring-Tool gehört. Ein einfacher Klick dient zum Zeichnen einer einzelnen Leitung, und mit einem Doppelklick ruft man den Multiple-WireZeichenmodus auf. Man zeichnet jetzt nur noch die Leitungen zwischen den Komponenten und ist schon fertig. Nur etwa eine Minute hat es gedauert, eine Spannungsprüfungs-Schaltung zu entwerfen und zu implementieren. “Think it – Draw it – Build it” with PSoC Creator Elektronik Journal Page 2 of 6 January 2010 [+] Feedback Jetzt muss entschieden werden, wie auf eine Überspannungs-Situation reagiert werden soll. Das Vorliegen einer zu hohen Spannung soll durch eine blinkende Leuchtdiode angezeigt werden. Kehrt die Spannung anschließend wieder auf einen normalen Wert zurück, soll dieses Phänomen jedoch nicht in Vergessenheit geraten, sondern durch Dauerlicht gemeldet werden. Hierfür bietet sich ein D-Flipflop an, das in den Schaltplan gezogen und an seinem Takteingang mit dem Komparatorausgang verbunden wird. Die Leitungen erscheinen in verschiedenen Farben. Analoge Leitungen werden orange dargestellt, digitale dagegen automatisch in grüner Farbe. An den D-Eingang wird eine Logisch-High-Komponente (1) gelegt. Wenn also am Komparatorausgang erstmals logisch High liegt, wechselt der Flipflop-Ausgang in den High-Status und behält diesen bei. Auf diese Weise wird man an das Überspannungs-Ereignis erinnert und es besteht keine Notwendigkeit zum Zurücksetzen des Flipflops. Eine digitale MUX-Komponente dient zum Selektieren zwischen den verschiedenen Signalen, die die LED ansteuern (über einen digitalen Ausgangs-Pin). Solange die Überspannung anliegt, sorgt eine auf 10 Hz eingestellte Takt-Komponente für das Blinken der LED, während der Flipflop-Ausgang ein zurückliegendes Überspannungs-Ereignis anzeigt. Im abschließenden Teil des Designs kommt eine Zähler-Komponente mit einem Takt von 1 kHz ins Spiel. Mit dieser Kombination wird ermittelt, wie viele Millisekunden lang die Überspannung andauert. Der Komparator kommt auch hier zum Einsatz: er setzt den internen Zähler auf Null zurück, wenn die Spannung zurückgeht, und gibt ihn wieder frei, sobald wieder eine zu hohe Spannung anliegt. Ein Capture-Eingang zeichnet den Zählerwert bei der fallenden Flanke des Komparatorsignals auf und löst einen ISR aus, um die Überspannungs-Ereignisse zu zählen und die längste Dauer zu erfassen. Bild: Konfiguration eines 16-Bit-Aufwärtszählers mit 1 ms Periodendauer und Erfassung bei fallenden Flanken Jetzt ist das Design so weit ausgearbeitet, dass es gebaut werden kann. Ein Klick auf den ‚Build‘-Button in der Werkzeugleiste reicht, um die gesamte Applikation – also die Schaltung und die Software – in ein einziges flash-fähiges Image zu verwandeln. Ein Teil dieses Build-Prozesses dient dazu, die APIs für die Komponenten und die Stub-Handler für den Interrupt zu generieren. Diese sind recht nützlich, denn wie in jedem Design muss nun ein wenig Software geschrieben werden. PSoC Creator Projekte enthalten von sich aus den gesamten Boot-Code zum Hochfahren des Bausteins, sodass sich die Programmierarbeit auf die eigentliche Applikation beschränkt, die in der Datei main.c gestartet wird. Man muss nichts weiter tun, als die APIs zum Initialisieren und Starten der Komponenten DAC, Komparator und Zähler zu verwenden. Anschließend wird die ISR installiert und die Interrupts freigegeben. Der Code hierfür sieht so aus: /* Init and start the components */ RefV_Start(); Comp_Start(); OverVoltageTimer_Start(); /* Install and enable the ISR handler */ VoltageLo_isr_Start(); CYGlobalIntEnable; “Think it – Draw it – Build it” with PSoC Creator Elektronik Journal Page 3 of 6 January 2010 [+] Feedback Der Interrupthandler hat seine eigene Quelldatei (VoltageLo_isr.c), in deren vom Anwender editierbare Abschnitte der Handler-Code wie folgt zwischen die Kommentarzeilen ‚#START‘ und ‚#END‘ eingefügt wird: /* `#START VoltageLo_isr_Interrupt` */ /* Read status register to clear interrupt source */ uint32 val = OverVoltageTimer_ReadStatusRegister(); /* Get capture time and set globals as necessary */ val = OverVoltageTimer_ReadCapture(); if( val > over_max_time ) over_max_time = val; over_count++; /* `#END` */ Bild: Auswahl der Pins am PSoC 3 Baustein Vor einem erneuten Build können jetzt die Pins festgelegt werden. An einem PSoC 3 Baustein kann jede beliebige Funktion jedem beliebigen Pin zugewiesen werden und man ist an keine Vorgaben des Herstellers gebunden. Nach Öffnen der Resources-Datei lassen sich die Pins auf jeden gewünschten I/O-Pin ziehen. Wird jetzt der Build-Prozess erneut durchlaufen, so wird ein ‚Bitstream‘ des Designs erzeugt. Außerdem werden die APIs generiert, die aus der oben beschriebenen Software heraus aufgerufen werden. Als nächstes wird die Software kompiliert und in ein einziges Image (eine Hex-Datei) gelinkt. Von hier aus kann der Baustein einfach geflasht werden, und nach einem Reset beginnt das Programm zu laufen. Sollte ein Design tatsächlich einmal nicht auf Anhieb funktionieren, hilft der in PSoC Creator eingebaute Debugger, der mit C- und Assembler-Ansichten Einblicke in das Design bietet und eine reichhaltige Auswahl an Debug-Fenstern, Hardware-Breakpoints und Codeverarbeitungs-Funktionen mitbringt – alles vollständig in die IDE integriert. “Think it – Draw it – Build it” with PSoC Creator Elektronik Journal Page 4 of 6 January 2010 [+] Feedback Bild: Mehr als der preisgünstige MiniProg3 Programmer/Debugger ist nicht erforderlich, um PSoC-Bausteine per JTAG oder SWD (Serial Wire Debug) zu debuggen Damit ist der Entwicklungszyklus mit PSoC Creator abgeschlossen. Das Design wurde gezeichnet, APIs wurden generiert, ein wenig C-Code wurde geschrieben und die Pins ausgewählt, bevor das Image in den Flash-Speicher des Bausteins geladen werden konnte. Änderungen lassen sich ebenso schnell vornehmen: es muss nur das modifizierte Image geflasht werden – fertig. Vielleicht ist genau dies das wichtigste Merkmal des Tools: es ermutigt zum Experimentieren und zum Lernen. Die Ergebnisse eines Versuchs liegen umgehend vor, und mit dem Umsetzen eigener Vorstellungen sind keine Kosten verbunden. Jeder Designer kann seine Kreativität damit frei entfalten. Kastentext: Das Erstellen der Image-Datei Auf das Anklicken des Build-Buttons hin nutzt PSoC Creator eine Reihe von Tools, um das Design und den Applikations-Code in eine flash-fähige Image-Datei zu verwandeln. Elaboration (Ausarbeitung) Da alle Designs hierarchisch gegliedert sind, bedarf es als erstes einer Elaboration: das TopDesign wird dazu in die einzelnen Komponenten gegliedert, die ihrerseits wiederum in ihre Bestandteile zerlegt werden, bis schließlich eine vollständig ausgearbeitete, auf eine Hierarchieebene reduzierte Version des Designs vorliegt. HDL-Generierung Als nächster Schritt schließt sich das Generieren der HDL (Hardware Description Language) an. Auf der untersten Ebene werden sämtliche Komponenten in Verilog implementiert, und das Design wird in eine HDL-Netzliste übersetzt. Synthese Dieser Prozess gliedert sich in einen logischen und einen physischen Schritt. Der logische Schritt optimiert das Design (Entfernung aller nicht benötigten Elemente) und generiert eine einfachere RTL-Darstellung (Register Transfer Level) der Grundkomponenten (Primitives) und Booleschen Gleichungen. Der physische Schritt identifiziert die Primitives und ordnet sie der physischen Hardware des Bausteins zu, um anschließend die Signale über das ‚Switch Fabric‘ bzw. das Routing-Netzwerk zu verbinden. API-Generierung Nun folgt die Erzeugung des Boot-Codes und der API-Files, die daraufhin zum Workspace Explorer hinzugefügt werden. APIFiles werden als Teil der jeweiligen Komponente definiert, und die generierten Dateien besitzen den Namen der Komponenten-Instanz als Namens-Präfix. Damit hat jede Instanz ihre eigenen APIs (es gibt keine Zeiger auf RAM-basierte Datenstrukturen). Kompilieren und Linken PSoC 3 und PSoC 5 nutzen die industriestandardgemäßen CPU-Architekturen 8051 bzw. ARM Cortex-M3, sodass jeder Designer seinen bevorzugten Compiler wählen kann. Für PSoC 3 enthält die Distribution ein kostenloses Keil CA51 Compilerpaket mit uneingeschränktem Funktionsumfang. Um eine bestmögliche Optimierung zu erzielen, kann ein Upgrade auf die professionelle Version von Keil zugekauft werden. Für PSoC 5 ist der GNU GCC-Compiler enthalten. Zusätzlich wird der von ARM Ltd. verfügbare RealView-Compiler unterstützt. “Think it – Draw it – Build it” with PSoC Creator Elektronik Journal Page 5 of 6 January 2010 [+] Feedback Generieren der Hex-Datei Den Abschluss des gesamten Ablaufs bildet das Generieren des Flash-Images in einer Hex-Datei. Dieses File enthält die Software-Applikation und den Bitstream, den die physische Synthese des Designs generiert hat. Cypress Semiconductor 198 Champion Court San Jose, CA 95134-1709 Phone: 408-943-2600 Fax: 408-943-4730 http://www.cypress.com © Cypress Semiconductor Corporation, 2007. The information contained herein is subject to change without notice. Cypress Semiconductor Corporation assumes no responsibility for the use of any circuitry other than circuitry embodied in a Cypress product. Nor does it convey or imply any license under patent or other rights. Cypress products are not warranted nor intended to be used for medical, life support, life saving, critical control or safety applications, unless pursuant to an express written agreement with Cypress. Furthermore, Cypress does not authorize its products for use as critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress products in life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges. PSoC Designer™, Programmable System-on-Chip™, and PSoC Express™ are trademarks and PSoC® is a registered trademark of Cypress Semiconductor Corp. All other trademarks or registered trademarks referenced herein are property of the respective corporations. This Source Code (software and/or firmware) is owned by Cypress Semiconductor Corporation (Cypress) and is protected by and subject to worldwide patent protection (United States and foreign), United States copyright laws and international treaty provisions. Cypress hereby grants to licensee a personal, non-exclusive, non-transferable license to copy, use, modify, create derivative works of, and compile the Cypress Source Code and derivative works for the sole purpose of creating custom software and or firmware in support of licensee product to be used only in conjunction with a Cypress integrated circuit as specified in the applicable agreement. Any reproduction, modification, translation, compilation, or representation of this Source Code except as specified above is prohibited without the express written permission of Cypress. Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress reserves the right to make changes without further notice to the materials described herein. Cypress does not assume any liability arising out of the application or use of any product or circuit described herein. Cypress does not authorize its products for use as critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress’ product in a life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges. Use may be limited by and subject to the applicable Cypress software license agreement. “Think it – Draw it – Build it” with PSoC Creator Elektronik Journal Page 6 of 6 January 2010 [+] Feedback