Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

PSoC 6 – Einführendes Tutorial

Das neue PSoC 6 BLE Pioneer-Kit  (136-7817)  – das jüngste Angebot von Cypress Semiconductor für die 32-Bit-Mikrocontroller-Welt – ist eines dieser Dinge, die mich daran erinnern, wie sehr sich für Embedded-Entwickler doch alles verändert hat. In folgendem Video können Sie sich eine erste Vorstellung des PSoC 6 ansehen:

Das allererste zweckorientierte Entwicklungs-Kit, das ich als Student Ende der 80er Jahre ausprobieren durfte, war um einen Mikrocontroller 8501 von Intel herum aufgebaut, verfügte über kolossale 4 KiB ROM und 128 Bytes internes RAM (für die Jüngeren unter Ihnen: jawohl, Bytes, nicht etwa „K“).

Selbst für die damalige Zeit war das Kit ein ziemlich primitives Ding, denn es war von einem unserer Dozenten entwickelt worden, um Benutzer auf die Maschinenebene hinunter zu zwingen. Wenn man es programmieren wollte, dann mit einem Hexadezimal-Tastenfeld zur manuellen Eingabe von Hex-Werten der Opcodes für den 8051 und der Operanden, mit denen gearbeitet werden sollte.

Nach einer Weile in der Dateneingabe-Hölle konnte man den 8051 dann laufen lassen, um mit On-Board-LEDs zu blinken – stellvertretend für die E/A-Endpunkte, die auf den bidirektionalen 8-Bit-Eingabe/Ausgabe-Ports simuliert wurden. In meinem Fall simulierte ich Betätigungselemente und Motoren einer Waschmaschine im Rahmen einer Reihe einfacher Waschprogramme.  

Trotz dieses schrillen Anfangs mochte ich den 8051 irgendwie und setzte ihn im Folgenden in einer Reihe späterer, eigener Designs ein. Der Vorteil des primitiven Entwicklungskits war es, dass die nachfolgende Programmierung in Assembler sich wie eine wesentliche Verbesserung anfühlte. Und die Entdeckung von Embedded C war daraufhin wie ein Geschenk der Götter.

Auf der anderen Seite ist es nicht schwer, wenn man sich die Funktionsliste des PSoC6 von Cypress Semiconductor ansieht, sich davon beeindrucken zu lassen, wie viel Zeug in einen winzigen Siliziumchip mit so geringem Platzbedarf hineingestopft werden kann. Und wichtiger noch: um wie viel leichter es doch ist, dieses ganze Zeug auch einzurichten und zu programmieren!

Wenn Cypress und die „PSoC Creator“-Entwicklungswerkzeuge für Sie allerdings Neuland sind, können all die im IDE (Integrated Development Environment) bereitgestellten Funktionen und die API-Softwareunterstützung ganz schön überwältigend wirken. In diesem Beitrag werde ich versuchen, dem Einschüchterungsfaktor ein paar Zähne zu ziehen, indem ich Sie Schritt für Schritt durch den Tool-Flow für die integrierte Version eines „Hallo, Welt!“-Programms führe – für die Einrichtung und das Umschalten der On-board-LED.

Erste Schritte

Wenn Sie PSoC Creator zum ersten Mal in Betrieb nehmen, bekommen Sie ein Fenster ähnlich dem unten abgebildeten zu sehen. Um einen neuen Workspace zu öffnen, müssen wir zunächst auf File > New > Project… (Datei > Neu > Projekt...) klicken.

01_open_project_2733deaa4bb38f4e6c03ca0eed0f8475838cc629.jpg

Im nächsten Schritt müssen wir aus den Pull-down-Menüs ein Zielgerät auswählen, in unserem Fall den PSoC 6. Anschließend klicken wir auf „Next“ (Weiter).

02_device_type_daa19193dff9d3c53b5c2cf2d5cca23ffe61a47c.jpg

Dann wählen wir für unsere Projektvorlage einen leeren Schaltplan („Empty schematic“) aus und klicken auf „Next“ (Weiter):

03_empty_sch_52008f4fb5989623b0bfe90f54a7c4cfc95f8a58.jpg

Klicken Sie bei IDEs von Drittanbietern einfach auf „Next“ (Weiter).

04_third_parties_2e4c26ab000288e7582025f8affe12d8fcc50304.jpg

Zum guten Schluss können wir unserem Projekt einen Namen geben, der ein bisschen mehr Beschreibung liefert als das standardmäßige „Design01“. Anschließend klicken wir auf „Finish“ (Fertigstellen).

05_create_project_b4d30e90f4994b0635541ad30e1a50def2845213.jpg

Daraufhin bekommen wir einen wunderhübschen und aufgeräumten Workspace präsentiert:

06_Workspace_9f55bcc22cad91558c3ac8f022a9a762c95ae7f5.jpg

Hinweis: Sofern es Ihnen schwerfällt, auf irgendwelchen Screenshot-Bildern Einzelheiten zu erkennen, rechtsklicken Sie einfach auf das Bild und wählen Sie oben im Kontextmenü die Option „Grafik anzeigen“, damit das Bild in voller Größe angezeigt wird.

Wie auch immer: Auf der linken Seite im Workspace befindet sich der „Workspace Explorer“ in dem alle mit Ihrem Projekt verbundenen Dateien angezeigt werden.

Auf der rechten Seite im Workspace finden Sie den „Component Catalog“ (Komponentenkatalog). Darin enthalten ist eine große Zahl konfigurierbarer Komponenten (mehr als 100), die in die Struktur des PSoC 6 integriert sind und in Ihren Systementwürfen verwendet werden können.

Das zentrale Fenster weist standardmäßig die Bezeichnung „TopDesign.cysch“ auf und zeigt den Schaltplan-Editor. Wir können dort die Komponenten aus dem Komponentenkatalog platzieren, konfigurieren und miteinander verbinden.

Das Fenster in der Mitte unten ist der Ort, an dem PSoC Creator darüber Auskunft gibt, womit er gerade beschäftigt ist. Es handelt sich um Ausgaben des Compilers und des System Builder.

Also gut, jetzt sind wir bereit zum Loslegen. Fangen wir an und entwickeln wir ...

Unser erstes System

Wir werden mit dem wohl einfachsten System beginnen, das für eine PSoC-Platine möglich ist, denn damit haben wir die Möglichkeit, den Tool-Flow ohne jede Ablenkung durch eine Menge Komplexität zu durchlaufen.

Navigieren Sie zum Komponentenkatalog und wählen Sie dort „Ports and Pins“ aus. Daraufhin können Sie per Drag-and-Drop einen Pin für die digitale Ausgabe in das Fenster des Schaltplan-Editors ziehen:

07_digital_op_pin_bbde5f625edbcdc27fb5e8704e51db77f62c9e9b.jpg

Sie werden wahrscheinlich feststellen, dass der Pin, den wir per Drag-and-Drop bewegen, ganz schön winzig ist. Wir erreichen eine Vergrößerung, indem wir mehrmals auf die Lupe mit dem „+“ (oben links) klicken oder (wie ich es bevorzuge) die [Strg]-Taste gedrückt halten und mit gedrückter linker Maustaste einen Rahmen um den zu vergrößernden Bereich ziehen.

08_select_for_zoom_6db8c2ac151983f09706380c5eecf012078187ee.jpg

Jetzt haben wir einen Pin, den wir tatsächlich sehen können. Bei einem einfachen Klick auf die Komponente färbt die sich grün:

09_zoomed_96991b4515d787d4bc4302be55eb22da12b55b66.jpg

Doppelklicken Sie auf das Teil (oder rechtsklicken Sie und wählen Sie im Kontextmenü die Option „Configure“ (Konfigurieren) aus), damit das Konfigurationsfenster für dieses Teil eingeblendet wird.

10_configure_ae7e87f4442042ba6a67043ae776f23f1d4f857b.jpg

Jetzt können wir diesen Pin für die Steuerung der blauen LED auf der PSoC 6-Entwicklungsplatine einstellen. Als Erstes ändern wir den Namen des Pins in „LED_Blue“. Wir werden die Firmware-Struktur des PSoC anstelle einer direkten Hardwareverbindung zur Steuerung der LED verwenden und deshalb müssen wir das entsprechende Kontrollkästchen deaktivieren.

11_configured_b81debde27c7dd7533a0b008c26240bb56c3d4f3.jpg

Wenn wir auf „OK“ klicken, werden der Name des Pins (und seine Form) so angezeigt, wie wir sie geändert haben.

Wenn Sie jetzt noch einmal einen Blick zurück auf den Komponentenkatalog werfen, sehen Sie, dass es dort jetzt eine zweite Registerkarte mit der Bezeichnung „Off-Chip“ (Chipextern) gibt. Die dort verzeichneten Komponenten haben keinen physischen Effekt auf das von uns entwickelte System. Stattdessen bieten sie uns die Möglichkeit, das herauszuziehen, womit unsere externen Pins verbunden sind – so ungefähr die Hardware-Entsprechung von Kommentaren im Software-Quellcode. Natürlich ist das völlig optional, kann aber (genau wie Softwarekommentare) wirklich nützlich sein, wenn Sie einmal erst sechs Monate später zurückkehren sollten, um ihr Design zu modifizieren.

Also los: Fügen wir diese externen Komponenten in unser System ein, indem wir einen Widerstand aus dem Menü „Passives“ (passive Bauteile) per Drag-and-Drop hinüberziehen, eine LED aus dem Menü „Diodes“ (Dioden) und eine Erdung aus dem Menü „Power“ (Stromversorgung):

12_off_chip_2c23fc690c261884e8284ae6f7ab67e6fee6e883.jpg

Jetzt können wir unser Verdrahtungs-Tool verwenden (wird vom Pfeil unten angezeigt; alternativ können Sie auch die Taste [W] drücken), um die Komponenten miteinander zu verbinden.

13_OC_connected_88954e3ff6459f01472bac50fb4d39efed84b186.jpg

Wenn das erledigt ist, dürfen wir dem System mitteilen, mit welchem Pin unsere blaue LED in der Wirklichkeit tatsächlich verbunden ist. Sofern Sie über überragende Sehfähigkeiten und/oder eine Lupe verfügen, können Sie diese Information von der Siebdruckebene auf der Platine ablesen, neben der RGB-LED selbst:

LEDs_a0a2e4ca5335c643ffe3359bf00376ccc0b71411.jpg

Unter Umständen können Sie im Bild erkennen, dass B (blau) 11.1 (Port 11, Pin 1) ist. Im weiteren Verlauf dieses Tutorials können Sie nach Belieben auch einmal die rote (Port 0, Pin 3) oder die grüne LED (Port 1, Pin 1) ausprobieren. Natürlich finden Sie diese Pin-Informationen gegebenenfalls auch in der PSoC 6-Begleitdokumentation.

Navigieren Sie, um diesen Pin Ihrem Design zuzuordnen, zum Workspace Explorer und doppelklicken Sie unter „Design Wide Ressourcen“ (designübergreifende Ressourcen) auf „Pins“. Damit wird das Pin-Diagramm für das PSoC 6-Gerät eingeblendet.

14_pin_assign_a_25abd7ee326277b0e844d9e059becb68afaa539a.jpg

Wie Sie sehen, ist unser Pin (LED_Blue) bereits in der Liste enthalten und kann zugewiesen werden. Verwenden Sie das Pull-down-Menü „Port“, suchen Sie in der Liste nach „P11[1]“ und wählen Sie diesen Eintrag aus. Unser Pin ist jetzt im BGA-Diagramm hervorgehoben und wir sehen, dass er dem physischen Pin E5 des BGA zugeordnet ist.

14_5_272e7048200be68e0ba3e72797a1c739106a7e14.jpg

Jetzt sind wir so weit, einen Build unseres Systems zu starten. Klicken Sie auf Build > Build Hello World.

Es schnurrt daraufhin ein bisschen und im Ausgabefenster werden einige Ausgaben angezeigt. Folgendes wollen wir am Ende dieser Ausgaben zu sehen bekommen: „---- Build Succeeded: Datum Uhrzeit -----“ – die Meldung, dass der Build erfolgreich verlaufen ist. Für „Datum“ und „Uhrzeit“ stehen jeweils das aktuelle Datum und die aktuelle Uhrzeit.

Den PSoC 6 programmieren

Nachdem wir jetzt unser System definiert haben, wird es Zeit, ihm etwas zu tun zu geben.

Dafür ist ein wenig Programmierung in C notwendig. Und wenn ich „ein wenig“ sage, meine ich einen wirklich kleinen Code-Umfang. Das ist der ausgedehnten Unterstützung zu verdanken, die als Basis der PSoC 6-API zur Verfügung steht.

Für unsere Zwecke verwenden wir den Low-Power-Kern ARM® Cortex® M0+. Genauso gut könnten wir den M4-Kern verwenden, aber unabhängig davon, für welchen wir uns entscheiden: Wir müssen uns keine Sorgen um den anderen Kern machen, den wir nicht verwenden – wir lassen ihn einfach links liegen, ohne jeglichen Code.

Navigieren Sie, um loszulegen, zum Workspace Explorer und doppelklicken Sie auf main_cm0p.c.Das wird in unserem zentralen Fenster geöffnet und zwar komplett mit dem Grundgerüst für unser Programm:

15_empty_code_c8dc607de4de139c033275ddb39715dd896c68f7.jpg

Wir können daraufhin unser Programm in dieses Grundgerüst einfügen:

16_code_e56acfecb8021f81579d88fcd4a9ec438e1dc4b5.jpg

Auf die API-Funktionen gehe ich ein bisschen später noch näher ein, aber beachten Sie vorerst, dass unser Programm einfach eine GPIO-Schreibfunktion verwendet, um ON/OFF-Werte (EIN/AUS) für unseren LED-Pin zu schreiben. Wir fügen eine Verzögerung von 500 (Millisekunden) zwischen den einzelnen Schaltvorgängen hinzu, damit das Umschalten der LED langsam genug erfolgt und wir es sehen können.

Gut! Jetzt wollen wir auch etwas sehen. Sofern Sie Ihren PSoC 6 noch nicht mithilfe des im Kit enthaltenen USB-Kabels mit Ihrem PC verbunden haben, stellen Sie die Verbindung jetzt her.

Jetzt fehlt nur noch eines: Debug > Program (Debuggen > Programm). Zu diesem Zweck können Sie auch [Strg]+[F5] drücken oder das Programm-Symbol verwenden, ganz wie Sie es am liebsten mögen. Warten Sie anschließend, bis das Programm kompiliert und heruntergeladen ist. Beim ersten Mal kann das eine Weile dauern, weil es eine ganze Menge grundlegenden „generierten Code“ gibt, der zu verarbeiten ist. Sobald die Sache erledigt ist, sind wir endgültig bereit, es krachen zu lassen:

Wir sind die Größten!

Die Dinge weiter entwickeln

Nun ja, vielleicht denken Sie ja, dass es unter der Würde einer MCU von der ARM Cortex-Statur ist, einfach nur eine LED blinken zu lassen. Also gut, wählen wir einen anderen Weg, auf dem wir hoffentlich noch ein paar Dinge lernen.

Navigieren Sie zurück zur Registerkarte „TopDesign.cysch“ im zentralen Fenster. Wir werden einen PWM verwenden, um unsere LED blinken zu lassen, nicht mehr den Prozessorkern. Um einen aufzutreiben, tragen wir ins Suchfeld (dort, wo es „Search for...“ (Suchen nach...) heißt) oben im Fenster des Komponentenkatalogs „pwm“ ein. Wir landen daraufhin bei „Digital > Functions > PWM (TCPWM)[v1.0]“.

Ziehen Sie den PWM in das Design. Außerdem brauchen wir einen Zeitnehmer, also ziehen Sie auch einen davon hinüber.

30_pwm_clk_1a68cae3280aaf886bea552fc6227e68c4c8b2bf.jpg

Zwischeninfo:

Jetzt ist ein guter Zeitpunkt für ein kurzes Intermezzo. Möglicherweise haben Sie sich gefragt, wie Sie herausfinden können, welche API-Funktionen für die Komponenten aus dem Komponentenkatalog zur Verfügung stehen. Die einfachste Methode, das herauszufinden, wartet direkt vor unserer Nase.

Bei ausgewähltem PWM sehen Sie ein Beschreibungsfeld unten rechts, unterhalb des Komponentenkatalog-Fensters. Dieses Feld enthält auch einen Link zum PDF-Datenblatt für die Komponente, und zwar mit der Bezeichnung Open datasheet (Datenblatt öffnen). Dieses Datenblatt enthält alle üblichen Dinge wie Beschreibungen der E/A-Verbindungen, Funktionsparameter und Komponenteneigenschaften. Außerdem gibt es einen API-Abschnitt, der die für das Teil verfügbaren Komponenten-Wrapper-Funktionen beschreibt. Wir können diese Informationen verwenden, damit sie uns bei der Steuerung der Funktionalität unserer Teile in der Software helfen.

Unsere Komponenten einrichten

Bevor wir die neuen Teile verwenden können, die wir gerade in den Design-Schaltplan eingebracht haben, müssen wir noch Einstellungen vornehmen. Die erste Komponente, die wir ändern müssen, ist unser altvertrauter digitaler Ausgabe-Pin. Doppelklicken Sie auf den Pin, damit er im Konfigurationsfenster auftaucht.

31_pin_26cbd3822b3b9b65d8d1cbb7f70188147f947909.jpg

Wir müssen das Kontrollkästchen „HW connection“ (Hardwareverbindung) reaktivieren, damit wir die Möglichkeiten haben, unsere anderen internen Komponenten mit dem Pin zu verbinden. Wenn Sie das erledigt haben und auf „OK“ klicken, sehen Sie, dass sich unser Pin verändert hat und jetzt über ein Eingabefeld verfügt, mit dem wir Dinge verbinden können.

Als Nächstes wollen wir unseren PWM einstellen. Führen Sie einen Doppelklick auf ihn aus, damit das entsprechende Konfigurationsfeld eingeblendet wird. Weil wir nur einen PWM haben, können wir ihn auch einfach in „PWM“ umbenennen. Bewegen Sie auf der Registerkarte „Basic“ (Grundlagen) die Bildlaufleiste nach ganz unten und geben Sie als Zeitraum 1000 (ms) an. Um die Sache ein bisschen interessanter zu gestalten, habe ich einen sehr kurzen Betriebszyklus von 50 (ms) für unser Blinken vorgegeben, was eher für so eine Art Stroboskopeffekt sorgt. Auf diese Weise ist es auch am Rande des Blickfelds ein bisschen besser sichtbar.

32_pwm_set_a93f4d3d439f49dea75df29f41a78fa699dd7cf5.jpg

Anschließend konfigurieren wir unseren Zeitnehmer auf 1 kHz:

33_clk_set_fadc7720f8cefc567136995139a62441b9f1b326.jpg

Zum Schluss müssen wir unseren kleinen Schaltplan noch mithilfe des Verdrahtungs-Tools verdrahten. Unser Zeitnehmer ist mit dem Takteingang verbunden und pwm_n mit unserem Ausgabe-Pin. Beachten Sie, dass unsere Drähte in diesem Fall grün sind. Sollten Sie in Ihren Designs analoge Signale verbinden, sind sie orange.

34_connect_a8af258f4a319eefb632cc2a27ea66550ebed5b0.jpg

Jetzt sind wir bereit, einen Build unseres Projekts anzulegen. Sie können das mit „Build > Build Hello World“ erreichen oder, indem Sie einfach [Umschalten]+[F6] drücken (bzw. auf das „Build“-Symbol klicken) – in aller Regel gibt es eine ganze Menge Möglichkeiten, um einzelne Arbeitsschritte durchzuführen. Während der Konstruktion des Builds sehen Sie, wie sich die APIs für die einzelnen unserer Komponenten unterhalb des Ordners „Generated Source“ (Generierte Quelle) im Workspace Explorer selbst zusammenfügen.

Jetzt bleibt nur noch das Programmieren unseres Geräts. Aufgrund all der zugrunde liegenden Softwarearbeit, die Cypress für uns bereits erledigt hat, besteht unser Programm aus einer einzigen Zeile C-Code – einem Aufruf der Funktion PWM_start():

35_built_aeb67b602f3c90c48e04eeccfb4571b932ebe3d0.jpg

Verwenden Sie „Debug > Program“ (Debuggen > Programm) oder drücken Sie [Strg]+[F5] (oder klicken Sie auf das „Programm“-Symbol), damit das Programm kompiliert und auf den PSoC 6 geladen wird.

Fantastisch! Wir haben eine blaue LED, die auf andere Weise blinkt.

Nachdem die IDE des PSoC Creator jetzt ein bisschen weniger furchterregend ist, können Sie damit anfangen, die Beispielsoftware genau in Augenschein zu nehmen, die Cypress für die Platine geschaffen hat. Zum Zeitpunkt der Niederschrift dieses Beitrags gibt es drei ziemlich ausführlich ausgeführte Beispiele:

  1. CE218133 – EINK Display mit CapSense®: Gezeigt wird, wie eine Benutzeroberfläche mithilfe der EINK-Anzeige, den Schaltflächen für die kapazitativen Sensoren und dem Schieber auf der Platine angelegt wird.
  2. CE218134 – BLE mit CapSense®: Gezeigt wird, wie CapSense- und Steuerdaten mithilfe von Bluetooth Low Energy übertragen werden, wobei der PSoC 6 als BLE-Peripherie- und GATT-Server fungiert.
  3. CE218135 – BLE mit Proximity: Der PSoC 6 fungiert als BLE-Peripherie- und GATT-Server für einen benutzerdefinierten Dienst, der CapSense-Näherungssensordaten überträgt.

Ein großer Teil der Funktionalität in diesen Softwarebeispielen kann bequem als Basis für viele andere Projekte benutzt werden.

Abschließende Worte

Es ist durchaus sinnvoll, das richtige Werkzeug für den Job zu verwenden, wenn der Job gut gemacht werden soll. Mikrocontroller sind das richtige Werkzeug für integrierte digitale Steueranwendungen. Natürlich kann es viel Spaß machen, die Dinge mit einem Raspberry Pi oder irgendeinem der vielen anderen kleinen Entwicklungsplatinen auf dem Markt zurechtzuschustern, aber für kommerziell realisierbare Designs, bei denen Größe, Kosten, Stromverbrauch und vorhersehbare (geringe) Interrupt-Latenzen eine wichtige Rolle spielen, sind Mikrocontroller immer noch die beste Wahl.

Hersteller wie Cypress machen es einfacher denn je, auf die Schnelle Systementwürfe mit einer minimalen Menge externer Komponenten zu entwickeln, indem sie voll ausgestattete (aber preisgünstige) Entwicklungskits und Software-Umgebungen zur Beschleunigung des Entwicklungszyklus bereitstellen. Die Hürden für den Einstieg in den Markt integrierter Systeme waren noch nie niedriger.

Worauf warten Sie also noch? Bauen Sie überall integrierende Mikrocontroller ein.

Mark completed his Electronic Engineering degree in 1991 and worked in real-time digital signal processing applications engineering for a number of years, before moving into technical marketing.
DesignSpark Electrical Logolinkedin