LED

Weihnachtsbaum deluxe

Hier (Weihnachtsbaum mit Lichtern) hatte ich bereits mit meinem Weihnachtsbaum aus Holz herumgespielt.

Hier

Projekt: STM8S105 6×8 Bits Output Teil 1a

Projekt: STM8S105 6×8 Bits Output Teil 1b

Projekt: STM8S105 6×8 Bits Output Teil 2

Projekt: STM8S105 6×8 Bits Output Teil 3

habe ich längere Zeit mit einer neuen Version geliebäugelt. Dann war er lange Zeit vergessen. Weihnachten 2015 leuchtete die alte Version.

Jetzt aber ist es soweit, er ist in neuer Schönheit 😉 wieder da.

Weihnachtsbaum
Weihnachtsbaum

Das bereits kommentierte Programm werde ich noch hinzufügen, es muss für die Webseite doch noch etwas aufgehübscht werden.

Testplatine mit dem WS2811 Chip

Nachdem die WS2811 chips bereits seit längerem eingetroffen sind und herumliegen, war es heute an der Zeit, einen Test zu machen. Als Basis diente eine SOP20-Adapterplatine, auf die eine PLCC6-5050-RGB-LED gelötet wurde.

WS2811 Testboard oben
WS2811 Testboard oben

 

WS2811 Testboard seitlich
WS2811 Testboard seitlich

 

WS2811 Testboard unten
WS2811 Testboard unten

 

WS2811 Testboard seitlich unten
WS2811 Testboard seitlich unten

Der WS2811 wurde daneben platziert und gemäß Datenblatt verschaltet.

WS2811 Datenblatt
Beschaltung des WS2811 gemäß Datenblatt

Die Schaltung läuft dem Anschein nach auf Anhieb.

Im Vergleich zu den integrierten WS2812B-LEDs fällt jedoch bei Nutzung eines Adafruit-Testprogrammes auf, dass Rot und Grün vertauscht sind. Die Verkabelung ist korrekt gemäß Datenblatt. In einer Reihe mit WS2812B geschaltet, geht trotzdem Grün statt Rot an und umgekehrt. Blau ist richtig. Ist das nun ein Fehler der WS2812B oder des WS2811? Es liegt, sofern man meinen google-Ergebnissen trauen kann, an den verschiedenen Chip-Versionen des WS281x. Das heißt aber auch, dass man diese Chips nicht einfach mischen kann oder die Verkabelung anpassen muss.

EDIT: Verkabelung geändert, es läuft ohne einen Unterschied zu den WS2812B

Bausatz bicolor LED-Matrix 32×16 Pixel aus China

Bei Ebay gibt es derzeit von verschiedenen Anbietern einen Bausatz für eine Bicolor-Anzeige mit 32 x 16 Punkten. Präziser gesagt, es gibt zwei verschiedene Bausätze.

Der hier Besprochene verwendet acht 74HC595 und zwei 74HC138 als aktive Bauelemente. Der Bausatz kommt mit einer vorgefertigten Platine, es geht also nur noch um das Zusammenlöten. Das sollte eine einfache Samstagsbeschäftigung werden. Zunächst lief alles routinemäßig ab, beim Test jedoch ging nichts so, wie es sollte. Einige Pixel leuchteten immer, andere gar nicht, völlig unabhängig von der Ansteuerung.

Die optische Analyse brachte zunächst nichts, außer, dass ein IC etwas seitlich verrutscht war, weil die Leiterpads für die IC auf beiden Seiten deutlich länger als nötig waren. Anhand der zu sehenden Fehler bei der Anzeige war irgendwann klar, dass dieser IC schuld sein muss. War er auch. Das gesamte Layout ist löttechnisch nicht sehr anfängerfreundlich, siehe Bild:

Layout, markierte Problemstellen
Layout, markierte Problemstellen

Durch den seitlich (im Bild: nach unten verschoben) verschobenen IC (leider habe ich diesen im eingebauten Zustand nicht fotografiert) wurden Pads mit den benachbarten Vias kurzgeschlossen, was sogar zu einem Total-Ausfall des IC führte:

Lötproblem
Lötproblem

Ein passender Ersatz war noch in der Bastelkiste, so dass dieses Problem mit einer kritischen Nachkontrolle aller anderen IC-Lötungen zu lösen war. Jetzt funktionierte die LED-Matrix, es waren jedoch noch immer Pixelfehler (nicht leuchtende LED) zu erkennen:

Pixelfehler rot
Pixelfehler rot

 

Pixelfehler grün
Pixelfehler grün

Nachdem ich diese Stellen mit der Lupe untersucht habe, stellte sich heraus, dass es sich vermutlich um Transportschäden handelt. Die defekten Pixel waren kaum erkennbar mechanisch beschädigt. (Einstichloch) Die jeweils andere Farbe funktionierte jedoch.

Wenn ich so etwas nochmals aufbaue, werde ich die Bauelemente vorher einzeln testen müssen. Zum Glück fallen die Fehler bei dynamischem Betrieb (Laufschriften) nicht so sehr auf.

Insgesamt gesehen ist der Bausatz für diesen Preis (10,78 € inkl. Versand aus China) jedoch in Ordnung.

Anzeigemodul mit VQE21 (alias „die grüne Pest“)

Die VQE21-Lichtschachtanzeigen aus DDR-Produktion gibt es bei Pollin seit langem als häufige Beilage in jedem LCD/LED-Sortiment. Diese Anzeigen sind allerdings nur sehr eingeschränkt zu gebrauchen. Eine Idee, den Nutzen etwas zu erhöhen, ist das Kombinieren zweier Anzeigen, indem die zweite auf den Kopf gestellt angefügt wird. So hat man immerhin 2,5 Stellen („188“) und weitere Segmente für Funktionsanzeigen als 7-Segment-Anzeige zur Verfügung, statt nur 1,5 Stellen.

Der Schaltplan ist eine eingekürzte Version und deshalb etwas unübersichtlich. Ursprünglich war eine Doppelanzeige geplant, also insgesamt vier VQE21.

 

VQE21 Schaltplan
VQE21 Schaltplan
VQE21 Layout
VQE21 Layout

 

 

 

 

 

 

 

 

 

Platine oben
Platine oben
Platine unten
Platine unten

 

 

 

 

 

 

 

 

 

 

Seitenansicht
Seitenansicht
Draufsicht
Draufsicht

 

 

 

 

 

 

Ansicht von unten
Ansicht von unten

STM32F030 eigenes breakout Board V

Nachdem ich einen ganzen Vormittag mit der Fehlersuche aufgrund eigener Dummheit verbracht habe, (der Chip sitzt auf der Unterseite, ist also bezüglich der Anschlüsse, von oben gesehen, gespiegelt – ein Nachteil meines Layouts, aber verschmerzbar, wenn man die Unterseite als Oberseite betrachtet und die DIL-Pins entsprechend einlötet) geht das Board nunmehr so wie geplant.

Board in Funktion
Board in Funktion
bestückte Oberseite
bestückte Oberseite

Beim fertigen Board fällt auf, dass noch viel Platz ist. Das soll zwar auch zum Teil so sein, denn es wird ja mit Hand bestückt. Aber hier ist noch Optimierungspotential und doch Platz für einen RESET-Taster und einen ST-Link-Stecker. Die Lötbrücken auf die Chip-Seite umlegen, der Quarz geht sowieso auf beiden Seiten einzulöten, die zusätzlichen Teile ebenfalls auf die Chipseite und dann oben und unten „tauschen“, so sollte es besser gehen.

bestückte Unterseite
bestückte Unterseite

Der fehlende Lack auf einem Leiterzug der Unterseite ist mein Fehler, bin mit dem Lötkolben abgerutscht – Weller WECP-20, siehe Foto als Größenvergleich:

Vergleich Lötkolben Chip (baugleicher STM8S103)

 

Es wird Zeit, sich eine „ernsthafte“ Anwendung zu überlegen. Hier zunächst das mit Coocox erstellte Test-Programm:

#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"

#include <stdio.h>

void init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    // LED: Configure PA0 and PA1 in output pushpull mode
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void Delay(__IO uint32_t nCount)
{
    while(nCount--)
    {
    }
}

int main (void)
{
    init();

    while (1)
    {
        GPIOA->BSRR = GPIO_Pin_1 | GPIO_Pin_0;  // Set PA! HIGH = LED off
        Delay(500000L);
        GPIOA->BRR = GPIO_Pin_0;  // Set PA0 to GND (red LED on)
        Delay(500000L);
        GPIOA->BRR = GPIO_Pin_1;  // Set PA1 to GND (green LED on)
        Delay(500000L);
    }
}

Ach ja, mit Quarz läuft dasselbe blinky-Programm deutlich schneller als auf dem TSSOP28-Adapter-Board. (ca. 3..4 mal schneller?) Schaltet der Chip die Taktquellen selbstständig um (angeblich startet er immer mit HSI und man muss mittels Programm umschalten) oder ist das Umschalten im Startcode von Coocox zu suchen? Ok, hab also noch zu tun …

EDIT: Hier:

 

ist ein Video des Testprogrammes zu sehen. Die Lösung des Geschwindigkeitsproblems liegt wie vermutet im startup-Code von Coocox, der bei externem Takt die PLL einschaltet.

LC204VL LED Display aus dem Pollin-LED/LCD Sortiment

Dieses vierstellige rot leuchtende LED-Display mit zusätzlichen Symbolen und gemeinsamer Kathode ist häufiger Bestandteil des Pollin-LED-/LCD-Sortimentes.

Nominell sollen die LED rot sein, es ist aber eher ein rötlich-oranges Leuchten. Die äußeren Abmaße sind 36 mm x 11 mm (B x H). Die Ziffern sind 6,2 mm hoch. Die Pins sind als DIL angeordnet und im normalen Raster (2,54 mm).

Maße aus dem Datenblatt
Maße aus dem Datenblatt

Die LEDs (zumindest die vier Ziffernstellen) sind nur per Multiplex mit gemeinsamer Kathode betreibbar.

Pinout aus dem Datenblatt
Pinout aus dem Datenblatt

Die elektrischen und optischen Parameter sind der folgenden Tabelle zu entnehmen:

characteristics from datasheet
characteristics from datasheet

Schaltungen für das Multiplexen von LED-Anzeigen gibt es zu hauf im Internet zu finden, benutzbar ist z. B. ein MAX7219.

Ich habe interessehalber eine andere Variante ausprobiert. Gleich vorweg, diese kann ich nicht zur Nachahmung empfehlen. Da ich schon öfter gelesen hatte, dass man eine LED zwischen zwei Pins eines Mikrocontrollers ohne Vorwiderstand betreiben kann, habe ich dies mit diesem Display ausprobiert.

Aufbau
Aufbau

Die Nachteile dieses Verfahrens sind jedoch offensichtlich. Je mehr Segmente und Ziffern eingeschaltet sind, desto dunkler wird die Anzeige. Die Helligkeit hängt also sehr stark vom angezeigten Inhalt ab. Außerdem haben die Exemplarstreuungen sowohl bei der Anzeige als auch beim Controller deutlichen Einfluß auf die Helligkeit. Auf den Fotos ist das nicht so deutlich erkennbar, wenn man die Anzeige jedoch vor sich hat, ist dieser Effekt sehr deutlich ausgeprägt.

Anzeige
Anzeige

Unter ungünstigen Umständen (z. B. höhere Temperatur) kann der Controllerausgang mit dem LED-Strom überlastet werden.

STM8S103F3P6 Entwicklungsboard Pollin

Pollin verkauft derzeit ein STM8S Entwicklungsboard:

Entwicklungsboard
Entwicklungsboard

Dieses Board ist mit dem STM8S103F3P6 ausgestattet:

stm8s103f3 Pinout
stm8s103f3 Pinout

Leider ist das eine etwas anders ausgestattete Version des STM8S im Vergleich zum weit verbreiteten STM8-discovery-Board. Das heißt auch, dass die meisten im Internet verfügbaren Programme angepasst werden müssen. Hinzu kommt, dass es drei verschiedene Compiler für die Prozessorserie von ST gibt. Nächste Erschwernis ist, dass in den Beispielen eine von ST verfügbar gemachte Firmware-Bibliothek benutzt wird. Diese ist allen auf der ST-Seite downloadbaren Beispielen beigefügt. Ein mit den genannten Eigenschaften versehenes tutorial für das discovery-Board findet sich unter benryves.com.

Für IAR gibt es deutlich weniger Beispiele, dabei ist auch diese Entwicklungsumgebung bis 8kByte-Flashspeicher frei, mit einem sehr guten Debugger ausgestattet, dem Hörensagen nach unheimlich gut im Optimieren und auch für wirklich große Projekte geeignet:

IAR embedded workbench
IAR embedded workbench

Benötigt wird weiterhin ein ST-Link/V2, den man sehr preiswert kaufen kann, allerdings nur in China und als Klon. Etwas teurer, jedoch nicht so teuer wie die Originale, ist der bei roboterbausatz.de erhältliche Klon:

Dieser ist offensichtlich 100% kompatibel, da ST die Schaltung freigegeben hat. So ist der Klon mit der Originalfirmware von ST versehen und kann auch alle updates übernehmen.

Ein Beispielprojekt, welches per timer-PWM mit einer RGB-LED durch die Farben fadet, ist hier zum download Demoprojekt verfügbar. Es basiert auf einem firmware-Beispiel für die timer von ST. Dieses wurde mit einer huetoRGB-Funktion aus einem Arduino-Buch erweitert, um Farbwechsel zu generieren.

Der Hardware-Aufbau auf einem kleinen Steckbrett ist trivial:

RGB-LED STM8S103F3P6 Steckbrett
RGB-LED STM8S103F3P6 Steckbrett

VQE21F 1,5 stelliges LED Display von Pollin zerlegt

Aus purer Langeweile und aufgrund eines interessanten Beitrages im Mikrocontroller-Forum: alte DDR-Lichtschachtanzeigen VQBxx tunen habe ich heute eins dieser Displays, die in Massen dem Pollin LED-LCD-Sortiment beiliegen, zerlegt.

VQE21 zerlegt
VQE21 zerlegt

 

VQE21 zerlegt Detail
VQE21 zerlegt Detail

Wie der Beitrag im Forum zeigt, ließe sich dieses Display mit modernen Einzel-LED nach-/aufrüsten. Das habe ich aber nicht mehr probiert.

LED Lauflicht mit dem AT90S1200

Endlich war Zeit, meine Testschaltung auch mal aufzubauen.

Diese eignet sich gut für Lötübungen. Die Bauteile sind als 0805 angelegt. Ich habe bis auf die LEDs und den µC alle übrigen Teile (Widerstände, Kondensatoren) von alten Festplattenelektroniken mit einer Heißluftstation entnommen, was eben da war. Deshalb wurde nicht durchgängig mit 0805 bestückt und als Vorwiderstand 1k (102) bzw. sogar 10k (103) benutzt. 😉 Die LED sind trotzdem noch erkennbar an. Auf die LED angepasste Widerstände wären hier natürlich deutlich besser.

Die ursprüngliche Intention war der erste Versuch, mittels eagle und professionellem Hersteller Platinen zu entwerfen. Bisher wurde immer auf Lochraster gebastelt. Es ist also ein Erstlingswerk, ich bin mir bereits vieler Fehler bewußt. (z.B. für die Handlötung zu kleine Lötpads am IC, ging trotzdem erstaunlich gut; 15 LEDs wären möglich statt 11; keine Beschriftung der Lagen; ungeduldige 😉 Entflechtung; ungünstige Platzierung der Bauteilbeschriftungen usw.) Ungeachtet dessen funktionieren die Platinen zuverlässig und sind fehlerfrei. Gelötet wurde mit einem Weller WECP-20 mit meißelförmiger 2mm-Spitze mit verbleitem 0,5mm-Lötzinn. Als µC geeignet sind ATtiny2313(A), ATTiny4313, AT90S1200(A), AT90S2313(A) und auch AT89C2051/4051 (bei geänderter RESET-Beschaltung) Der ISP-Programmieradapter ist nur für die AVR nutzbar, die 8051-er müssen vorher programmiert werden. Die LEDs stammen aus dem SMD-LED-Sortiment von Pollin bzw. die 0603-Bauform von Reichelt. (z.B. Bestellnummer: LY L29K)

Das Programm wurde recht schnell „zusammengeworfen“, da es nur zum schnellen Test dienen soll:

.include "1200def.inc"				; Das Programm ist für den AT90S1200 geschrieben, 
						; für den ATTiny2313 oder andere sind Änderungen erforderlich!!

.equ XTAL = 3187200

.def i = r21					; diverse Zwischenvariablen
.def Change = r22
.def Change_D = r23
.def Change_B = r24
.def temp = r25
.def DelCount_1 = r26				; bestimmt die Dauer der äußeren Warteschleife
.def DelCount_2 = r27				; mittlere Warteschleife
.def DelCount_3 = r28				; innere Warteschleife

 
.org 0x0000
        	        rjmp   	main            ; Programmstart
			rjmp 	EXT_INT0 	; IRQ0 Handler
			rjmp 	TIM0_OVF 	; Timer0 Overflow Handler
			rjmp 	ANA_COMP 	; Analog Comparator Handler			
 
EXT_INT0: 
TIM0_OVF: 
ANA_COMP: 
			reti			; fehlgeleitete Interrupts abfangen (sollte eigentlich nicht vorkommen)


main:
			ldi   	temp, 0xFF      ; Port B und D auf Ausgang
      		        out  	DDRB, temp
			out  	DDRD, temp

main2:		        ldi 	Change, 0x00		; Variablen initialisieren
			ldi 	Change_B, 0x00
			ldi 	Change_D, 0x03


// hier geht es los mit der Animation

// Effekt 1: versetztes Wechselblinken über alle LEDs

			ldi	i, 0x06			; 6-mal sollst Du es tun
main1:		        ldi temp, 0xAA				
			out PORTB, temp
			ldi	temp, 0x55
			out	PORTD, temp
			ldi	DelCount_1, 0x05		; 5 Warterunden
			rcall	wait

			ldi temp, 0x55
			out PORTB, temp
			ldi	temp, 0xAA
			out	PORTD, temp		
			ldi	DelCount_1, 0x05		; 5 Warterunden
			rcall 	wait

			dec	i
			cpse 	Change, i			; Schleife zu Ende?
			rjmp 	main1

// Effekt 2: LED-Kette geht schrittweise an

			ldi	temp, 0xFF
			out PORTB, temp
			ldi	temp, 0x30
schieben1:	        lsl	temp					; zuerst PORTD anschalten
			out	PORTD, temp
			ldi	DelCount_1, 0x05		; 5 Waitrunden
			rcall 	wait
			dec Change_D
			cpse Change, Change_D
			rjmp schieben1


			ldi	temp, 0xFF
schieben:	        lsl	temp					; jetzt ist PORTB dran
			out	PORTB, temp
			ldi	DelCount_1, 0x05		; 5 Waitrunden	
			rcall 	wait
			cpse	temp, Change_B
			rjmp	schieben

// Effekt 3: LEDs sind an, dunkler Punkt wandert durch die Kette

			ldi	Change_B, 0x78
			ldi 	i, 0x80
			mov	temp, i
wandern:		out	PORTB, temp			; erst PORTB
			lsr	temp
			dec	i
			ldi	DelCount_1, 0x05		; 5 Runden durch die Waitschleife
			rcall 	wait
			cpse	Change_B, i
			rjmp	wandern

			ldi	Change_D, 0x04
			ldi 	i, 0x40
			ldi	temp, 0x00
			out 	PORTB, temp
			mov	temp, i
wandern2:	        out	PORTD, temp				; dann PORTD
			lsr	temp
			dec	Change_D
			ldi	DelCount_1, 0x05		; 5 Runden durch die Waitschleife
			rcall 	wait
			cpse	Change, Change_D
			rjmp	wandern2




// Ein dunkler Punkt wird durchgeschoben

			ldi	i, 0x08
			ldi 	temp, 0x80
Shift:		        out 	PORTB, temp
			ror	temp
			dec i
			ldi	DelCount_1, 0x05		; 5 Runden durch die Warteschleife
			rcall	wait
			cpse	Change, i
			rjmp	Shift

			ldi	i, 0x04
			ldi	temp, 0x00
			out 	PORTB, temp
			out	PORTD, temp
			ldi 	temp, 0x40
Shift1:		        out 	PORTD, temp
			ror	temp
			dec 	i
			ldi	DelCount_1, 0x05		; 5 Runden durch die Warteschleife
			rcall	wait
			cpse	Change, i
			rjmp	Shift1

			rjmp 	main2			; Animationsprogramm beginnt von vorn



; subroutine wait, keine Ahnung, wie lang die ist, zu faul zum Rechnen, daher reines Bauchgefühl, 
; DelCount_1 muss vom Aufrufer gefüllt werden

wait:
	
delay2:		        ldi 	DelCount_2, 0xFF
delay1:		        ldi	DelCount_3, 0xFF
delay: 		        dec	DelCount_3
			cpse	Change, DelCount_3
       		        rjmp	delay     

			dec	DelCount_2
			cpse	Change, DelCount_2
			rjmp	delay1

			dec	DelCount_1
			cpse	Change, DelCount_1
			rjmp	delay2
			ret