SX-Doppel-Led-Blinkdecoder

Wieder einmal war Dieter Sekunde der Ideengeber, weil auf seiner Anlage eine
Warn-Blinkanlage im Stil vergangener Epochen, ganz gemütlich Lichtzeichen
geben soll. In seinen Neusilber Ätz-Winzlingen hat keine Mini-Glühlampe genügend
Wohnraum, aber LED-Zwerge.

Gefragt ist nun eine Helligkeitssteuerung Im Warnzyklus von einigen Sekunden.
Also nicht nur Ein- und Ausschalten sondern "Fade in - Fade out" auf gut Neudeutsch.
Der Warnzyklus hat 4 Abschnitte, Start bei beide LED's Aus;
    LED 1 leuchtet auf, LED 2 aus;
    LED 1 ist Ein, Led 2 leuchtet auf;
    LED 1 wird dunkel, LED 2 ist Ein;
    LED 1 ist Aus, LED 2 wird dunkel.
Zum Ende beide wieder Aus.

Für diese Aufgabe ist die Puls-Weiten-Modulation das probate Mittel und diese Funktion
ist auch im ATTiny 2313 gleich mehrfach und in diversen Betriebsarten vorhanden.

Im einfachsten Fall, und den habe ich gewählt, ist das der Fast-PWM-Mode in Timer0.
In dieser Betriebsart wird der Timer vom Prozessortakt mit einem Vorteiler (Prescale)
gesteuert und zählt zyklisch vor sich hin, von 0 bis 255 wie es sich für einen 8-Bit Timer
gehört, solange er eingeschaltet ist.

Für die PWM-Funktion dienen zwei Vergleichsregister, OCR0A und OCR0B.  Der Timer
kann nicht nur einen Interrupt bei Overflow (Zählwert 256) erzeugen, sondern auch, wenn
Gleichstand zwischen dem Zählwert und einem Vergleichsregister besteht.

Im Mikro können sogar dafür vorgesehene I/O-Pins automatisch geschaltet werden, ich habe
den "disconnected" Mode 0 gewählt und schalte die LED-Ansteuerungspins "zu Fuss" im
entsprechenden Interrupt. So kann ich die Pins meiner Wahl nehmen, und an das Servo-
Decoderplatinchen anpassen.

Bleibt noch die Aufgabe die OCR-Werte zeitlich so zu verändern, dass sich der gewünschte
Helligkeitsverlauf im Warnzyklus ergibt. Als Zeitbasis verwende ich den SX-Takt von 50uSek.
Ein 16-Bit-Zähler wird im Takt incrementiert und bei Erreichen des eingestellten Intervalls
bekommen die OCR's einen neuen Wert.

Diese Werte sind in einer Tabelle "bltab [32]" abgelegt. Die Werte steigen aber nicht linear,
sondern exponentiell, d.h. benachbarte Werte unterscheiden sich um einen konstanten Faktor,
der sich aus Endwert ^ 1 / Stufenanzahl berechnet. Für den 8-Bit-Timer mit 32 Stufen ist das:
255 ^ 1/32 = 1,18906.
Das Multiplikationsergebnis wird auf eine Ganzzahl gerundet, und fertig ist die Tabelle, mit
theoretisch passenden Werten zu der Helligkeitsempfindlichkeit unserer Augen.
Denn aus den exponentiell steigenden Lichtströmen wird die linear steigende Helligkeit im
Kopf des Betrachters.

Leider sind aber die Kennlinien der LED's auch ein wenig "krumm", was ja eigentlich beim
PWM-Dimmen bzw. "faden" keine Rolle spielen sollte, weil immer der gleiche Strom fließt, nur
unterschiedlich lange, und das Auge samt Hirn, die Integration übernimmt, wie im Kino!

Wie auch immer, dem Spieltrieb eines Modellbauers wird man nur gerecht, wenn er selbst
die Parameter bestimmen kann, und das, wenn möglich, einigermaßen übersichtlich und bequem.

Die PC-Programmiersoftware:

Natürlich ähneln sich die Programme zur Parameterübergabe, denn die Aufgabe ist prinzipiell
immer die gleiche. Die Programmierung ist im Wesentlichen anpassen und kopieren von
Codeschnippseln. Erstaunlich wie viele versteckte Fehlerteufelchen sich trotzdem einschleichen.
Meine Programme scheinen sie besonders zu mögen! Teufel auch !!

Die Bedienung ist simpel:
    Com wählen,
    Start Lesen,
    Helligkeitswerte abrufen.
Zu variieren sind:
    Adresse,  im grünen Editierfeld, Adr. Senden
    Nummer des Steuerbit in der Basisadresse, sofort wirksam,
    Blinkzeit, bzw. Ablaufzeit für einen Warnzyklus, sofort wirksam,
    Helligkeitswerte in der Tabelle, nach Doppelclick im Decoder wirksam,
    Bitstellen der Basisadresse, sofort auf dem SX-Bus
Speichern der aktuellen Werte im Decoder im EEPROM mit Bestätigung.

Zum Probieren die Dateien:

sx_blinki.asm    SX_Blinki.hex    SX_Blinki.eep

Für das XP-PC-Programm bitte um eine Anfrage per mail.

Winfried Steinhart, im Februar 2009