Hack-a-tree

Das 3D DIY Weihnachtsbaum Löt-Set verfügt mit dem vorgeflashten Mikrocontroller nur über wenige voreingestellte Muster.
In diesem Blog lernen Sie, den Mikrocontroller selbst zu programmieren, damit die einzelnen LED angesteuert werden können, um eigene Muster auf dem Baum anzeigen zu können.

 

Der Blog bezieht sich ausschließlich auf das 3D DIY Weihnachtsbaum Löt-Set.

1 Hintergrundinfo Prozessor

Bei dem verwendeten Prozessor handelt es sich um einen STC15W408 des chinesischen Herstellers STCmicro.
Dieser basiert auf einer (8bit) 8051 CISC (Complex Instruction Set Computing) Architektur. Diese wurde bereits 1980 durch Intel eingeführt. Zum Vergleich wird ein ATmega328 betrachtet. Dieser basiert auf der ARM RISC (Reduced Instruction Set Computing) Architektur. Der konkrete Unterschied ist die Anzahl an Rechenoperationen, welche in einem Takt durchgeführt werden können. Die 8051 Prozessoren benötigen normalerweise mehrere Taktzyklen für eine Rechenoperation, wobei das ARM-Pendant nur einen einzelnen Takt für eine Operation benötigt. Der STC15W408 ist aber so aufgebaut, dass kein wesentlicher Unterschied in der Leistung zwischen den beiden Prozessoren vorhanden ist.

 

Wie bereits oben erwähnt, handelt es sich beim STC15W408 um einen 8 bit Prozessor, dies bedeutet, dass eine einzelne Rechenoperation nur mit Werten von 0-255 möglich ist. Bei komplexen Projekten wäre dies ein Problem, da somit die Geschwindigkeit bei höheren Zahlen drastisch eingeschränkt werden würde. Hier sollte auf moderne 32-bit Prozessoren zurückgegriffen werden, wie zum Beispiel den ESP32.

Vielleicht fragen Sie sich, warum ein 8 bit Prozessor wie der STC15W408 in diesem Bausatz verwendet wird, dies hat den Hintergrund, dass hier nur einzelne IO-Pin angesteuert werden und hierfür keine komplexen Berechnungen nötig sind.

Somit eignet sich dieser Prozessor ideal für solch eine Anwendung, da er einfach zu programmieren ist.

 

Pinout

Abbildung 1: Pinout des Chips

 

Beim Betrachten des Pinouts des Schaltkreises fällt auf, dass die IO-Pins mit P0.X bis P5.X bezeichnet sind. Dies hat den Hintergrund, dass der Prozessor über 5 IO-Register P0 bis P5 verfügt. Die Zahl nach der Registernummer stellt die Bit-Nummer im Register dar.

Abbildung 2: Pin Register P1 (Auszug aus dem Datenblatt Kapitel 4.7)

 

2 Verbindung der LED

Auf den Platinen befinden sich 37 RGB Effekt LED, aber nicht jede LED kann einzeln eingeschaltet werden. Im folgenden Bild sind die verbundenen Gruppen mit Zahlen für die einfachere Zuordnung markiert.

Abbildung 3: Seitenansicht mit nummerierten LED

 

Da diese Nummerierung der LED auf jeder Seite des Baums gleich ist, werden die vier Seiten mit Buchstaben bezeichnet, um diese beim Pin Mapping unterscheiden zu können.

Abbildung 4: Ansicht von Oben mit beschrifteten Seiten

 

In folgender Tabelle befinden sich alle IO-Pins mit der Bezeichnung der angeschlossenen LED. Die fehlenden IO 1.0 bis 1.5 sind nicht mit den LED verbunden.

1.6

A2

3.0

B1

1.7

A1

3.1

B2

2.0

D3

3.2

B3

2.1

D4

3.3

B4

2.2

D5 + oben

3.4

B5

2.3

A5

3.5

C5

2.4

A4

3.6

C4

2.5

A3

3.7

C3

2.6

D2

5.4

C2

2.7

D1

5.5

C1

 

 

Resetschaltung

Damit der Chip geflasht werden kann, muss dieser kurzzeitig vom Strom getrennt werden und erneut verbunden werden. Deshalb muss eine kleine Transistorschaltung für den FT232 gebaut werden, welche mit dem DTR Pin die Stromversorgung des Chips steuern kann.

 

Für den Bau des Programmers benötigen Sie:

FT232 Serial Converter
Lochrasterplatine min. 8x13 (z.B. aus dem PCB Sortiment)

Buchsenleisten

Kabel (z.B. Silikonkabel Sortiment)

Widerstände 470Ω, 10kΩ, 100kΩ (z.B. aus dem Widerstand Sortiment)

LED gelb (z.B. aus dem LED Sortiment)

NPN Transistor BC547 (z.B. ->Amazon)

 

(optional: Pogopins oder F2M-Jumper für die Verbindung zu den UART Pins des Baums)

 

Abbildung 5: Programmer-Schaltung auf Lochrasterplatine

 

Bauen Sie die Schaltung wie oben gezeigt auf. Es empfiehlt sich, die rechte Buchsenleiste nicht direkt auf das PCB zu löten, wenn Sie keine Pogo Pins verwenden, da der Programmer so nicht aufgesteckt werden kann. Alternativ empfiehlt sich ein Verbinden der Buchsenleiste über Kabel mit dem PCB.

 

Ist der Programmer dem Schaltplan nach korrekt aufgebaut, können Sie den Bausatz über Pogopins oder eine Stiftleiste am Bausatz verbinden. Hierzu schließen Sie die Platine an die vier Anschlüsse unter dem Chip wie folgt an.

 

P31 (TX) = RX (FT232)

P30 (RX) = TX (FT232)

3V3          = VCC (FT232)

GND        = Emitter Transistor

 

Achten Sie darauf, dass der Jumper des FT232 auf 3V3 eingestellt ist, da ein zu hohes Logic Level den Chip beschädigen könnte.

Software

Der STC15W408 ist nicht in der Arduino IDE kompatibel. Eine gute Alternative zur gewohnten Arduino IDE stellt das PlatformIO Plugin für VS-Code dar. Hier sind über 1000 verschiedene Boards bereits enthalten und unter anderem auch die STC Chips.

 

Installieren Sie als erstes die Visual Studio Code IDE. Die Installationsdatei können Sie hier herunterladen.

Nachdem die IDE erfolgreich installiert und geöffnet ist, gehen Sie zu den Erweiterungen. Diese können Sie entweder über die linke Seitenleiste öffnen (siehe rote Markierung in der Abbildung) oder über die Tastenkombination Strg+Umstelltaste+X.

Abbildung 6: Erweiterungsmenü in der linken Seitenleiste

 

Suchen Sie hier nach dem Platform IO Plugin und installieren Sie dieses.

 

Abbildung 7: Ansicht in der Erweiterungsverwaltung

 

Als nächstes öffnen Sie die PlatformIO Startseite (Seitenleiste > Platform IO > Quick Access > PIO Home > Open) und klicken Sie auf “New Project”.

 

Abbildung 8: Projektkonfiguration

 

In diesem Fenster können Sie nun einen Namen für das Projekt und das Board auswählen. Hier müssen Sie wie oben abgebildet den STC15W408AS auswählen. Zum Schluss bestätigen Sie die Projektkonfiguration über den Finish Button.

 

Nachdem Sie das Projekt erstellt haben, muss nur noch der Code hinzugefügt werden. Um die Datei mit dem relevantem Code möglichst übersichtlich zu halten, wird eine externe Header Datei (.h) mit allen benötigten Register Deklarationen des Chips verwendet.

Eine für den Chip passende Datei können Sie hier von Vincent Defert auf GitHub herunterladen.

 

Ist die Datei heruntergeladen, können Sie diese in VSCode in das Verzeichnis src kopieren.  Erstellen Sie dort auch noch eine neue Datei mit der Bezeichnung main.c, in der sich später das auszuführende Programm befindet.

 

Testcode

Als ersten Test sollten alle Leuchtdioden ein- und nach einer Verzögerung wieder ausgeschaltet werden.
Laden Sie nun das folgende Programm auf den Mikrocontroller:

#include <stc15.h> //(1)

#define ON
0x00 //(2)
#define OFF
0xff

void delay(unsigned int mils){
//(3)
    unsigned char i, j;

    while (mils--){
//(4)
        i=
16;
        j=
40;
        do { while (--j); } while(--i);
       
    }
}

void main(void) {
   
//(5)

    P5M1 =
0x00;      //set port 5 settings register 2 to 0
    P5M0 =
0xff;      //set port 5 settings register 1 to 1
                     
    P3M1 =
0x00;
    P3M0 =
0xff;

    P2M1 =
0x00;
    P2M0 =
0xff;

    P1M1 =
0x00;
    P1M0 =
0xff;

    P5 = OFF; //(6)      
    P3 = OFF;
    P2 = OFF;
    P1 = OFF;

    while(
1) //(7)
    {
        P1_6 = ON; //(8)
        P1_7 = ON;
        P2 = ON;
        P3 = ON;
        P5 = ON;
        delay(
2000);
        P1_6 = OFF;
        P1_7 = OFF;
        P2 = OFF;
        P3 = OFF;
        P5 = OFF;
        delay(
2000);
    }
}

 

Alternativ steht die Datei hier zum Download zur Verfügung.

 

Erklärung:
(1) Zu Beginn wird die Header Datei mit den Register Definitionen eingebunden.

(2) Im Anschluss werden Makros für die beiden LED Zustände definiert. Dadurch ist die Übersichtlichkeit im Routine-Teil besser. Normalerweise wird durch einen IO im HIGH Zustand eine angeschlossene LED eingeschaltet, dies hat den Hintergrund, dass meist die Anode(+) der LED mit dem IO verbunden ist. Auf dem PCB der Leiterplatte ist aber die Kathode(-) der LED mit dem IO verbunden, dadurch wird diese nur bei einem LOW zustand eingeschaltet.
Da eine LED (light emitting diode) wie der Name schon sagt, eine Diode ist, wird diese bei einem HIGH Zustand des IO gesperrt und leuchtet somit nicht.

(3) Da bei dem STC15W408 keine Arduino Standardmethoden wie delay() automatisch eingebunden sind, wird hier die delay() Funktion implementiert.

(4) Die innere Zählschleife benötigt ungefähr eine Millisekunde bis sie durchlaufen ist. Diese Schleife wird dann genau mit der Anzahl an Millisekunden, die als Parameter an die Funktion übergeben wurden, durchlaufen. So kann eine einfache Verzögerung realisiert werden, diese ist aber abhängig von der Frequenz des Prozessortakts und kann auch bei längeren Verzögerungen Abweichungen aufweisen.

(5) Mit der folgenden Registerbelegung werden die IO-Pins in den Push-Pull- Modus gesetzt. Dadurch ist ein Betrieb mit hohem Strom am IO-Pin möglich. Weitere Informationen finden Sie im Datenblatt des Chips im Kapitel 4.9.2 & 4.7 .

(6) Hier werden die IO-Register auf den Wert HIGH gesetzt, damit alle LED am Anfang ausgeschaltet sind.

(7) In der Schleife werden die IO-Pins/LED mit einer Pause von zwei Sekunden ein- und ausgeschaltet.

(8) Neben dem Setzen eines ganzen IO-Registers können auch einzelne Bits im Register gesetzt werden, diese entsprechen den einzelnen IO-Pins.

 

Das Hochladen erfolgt einfach durch das Klicken auf den Pfeil in der unteren Leiste.

 

Nach dem erfolgreichen Upload sollte folgendes im Terminal angezeigt werden:

 

Abbildung 9: Ausgabe im VS Code Terminal

 

Hinweis: Beim ersten Upload wird zuerst noch das stcgal tool automatisch installiert, welches für das flashen des Chips benötigt wird.

 

Fazit

Nach diesem Blogbeitrag können Sie nun den STC15W408, welcher im 3D Christmas Tree Bausatz verwendet wird, selbst programmieren und eigene Muster darauf anzeigen.

Experimentieren Sie gerne mit den unzähligen Mustern, die nun mit dem Bausatz möglich sind.

Viel Spass beim Nachbauen :)

Für die Erstellung des Blogs wurden folgende relevante Quellen verwendet:
https://www.stcmicro.com/datasheet/STC15F2K60S2-en.pdf

https://de.wikipedia.org/wiki/Intel_MCS-51

https://de.wikipedia.org/wiki/Reduced_Instruction_Set_Computer

https://de.wikipedia.org/wiki/Complex_Instruction_Set_Computer

 

Diese können bei Interesse zum Vertiefen der Grundlagen gelesen werden. Ebenfalls interessant sind auch die GitHub Repositories der beiden Open-Source Projekte stcgal und stc-mcu-open-source.

Grundlagen elektronikGrundlagen softwareProjekte für anfängerSpecials

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery