Word Clock Variante 1 - Software

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Dieser Artikel soll einen Einblick in die Software, die hinter der Word Clock Variante 1 steckt, bieten. Neben einer kurzen Einführung in die Struktur und Funktionsweise der einzelnen Module, gibt es auf der entsprechenden Diskussionsseite auch die Möglichkeit Fragen zum Quellcode zu stellen bzw. Verbesserungsvorschläge einzubringen. Dies erleichtert es den Entwicklern Änderungen am Quellcode unabhängig vom mittlerweile ziemlich umfangreichen Forumsbeitrag zu diskutieren.

Modularisierung

Der Quellcode besteht im Wesentlichen aus reinem C, insofern sind entsprechende Vorkenntnisse vorteilhaft. Das Projekt ist in verschiedene Module unterteilt, die weitestgehend unabhängig voneinander sind. Die einzelnen Module lauten:

Übersicht der verschiedenen Module
Modul Funktion Dateien
BASE Grundlegende Funktionen und Makros, die von anderen Modulen benötigt werden base.c, base.h
COLOR_EFFECTS Enthält Funktionen, die Farbanimationen ermöglichen color_effects.c, color_effects.h
DCF77 Dekodierung und Zur­ver­fü­gung­stel­lung des DCF77 Zeitsignals dcf77.c, dcf77.h
DISPLAY Verantwortlich für die Umwandlung der Zeit in ein Bitmuster, welches über die Frontplatte angezeigt werden kann display.c, display.h, display_tix.c, display_tix.h, display_tix_patterns.h, display_wc.c, display_wc_eng.c, display_wc_eng.h, display_wc_ger3.c, display_wc_ger3.h, display_wc_ger.c, display_wc_ger.h, display_wc.h
I2C-MASTER Zurverfügungstellung von Funktionen, die den Umgang mit dem I2C Bus ermöglichen i2c-master.c, i2c-master.h
I2C-RTC Ermöglicht den lesenden bzw. schreibenden Zugriff auf die RTC i2c-rtc.c, i2c-rtc.h
IRMP Ermöglicht den Umgang mit diversen IR Fernbedienungen irmp.c, irmp.h, irmpconfig.h
LDR Erfassung und Zurverfügungstellung der Helligkeit des Umgebungslichts ldr.c, ldr.h
MAIN Enthält den Einstiegspunkt des Programms sowie die Applikationslogik, welche Gebrauch von den anderen Modulen macht und diese verbindet main.c, main.h
PWM Generierung der PWM Signale zur Ansteuerung der RGB LEDs pwm.c, pwm.h
SHIFT Ausgabe von Bitmustern an die Elektronik (Shiftregister), die die LEDs ansteuert shift.c, shift.h
SIMPLE_RANDOM Einfacher Zufallsgenerator, der für den Narren-Modus im Displaymodul benötigt wird simple_random.c, simple_random.h
TIMER Anlaufpunkt für Dinge, die zeitlich regelmäßig ausgeführt werden sollen timer.c, timer.h
UART Zurverfügungstellung der UART Hardware, um Zeichen zu empfangen bzw. zu versenden uart.c, uart.h
USER Verantwortlich für die Interaktion mit dem Benutzer, z.B. dem Anlernen der IR Befehle user.c, user.h, usermodes.c
WCEEPROM Funktionen, die das persistente Ablegen und Abfragen von Informationen im bzw. aus dem EEPROM ermöglichen wceeprom.c, wceeprom.h

Im Folgenden soll nun die genaue Funktionsweise der einzelnen Module näher erläutert werden:

DCF77

Zur Programmierung siehe den Artikel DCF77-Funkwecker mit AVR. Im Abschnitt Programmierung ist das Funksignal dokumentiert, zusammen mit einem Beispiel (Bitstrom und Bedeutung).

Codebeispiel siehe Codesammlung DCF 77.

Softwareentwickler: Torsten Giese (wawibu)


Automatische Helligkeitsregelung

Die Helligkeit des Displays wird über einen LDR (z.B. LDR 07 von Reichelt) gesteuert.

Softwareentwickler: Rene H. (promeus)


Uhrzeit

Die Zeit wird von einer batteriegepufferten Maxim DS1307 Echtzeituhr (RTC), die über I2C mit dem Microcontroller verbunden ist, zur Verfügung gestellt. Die Batterie soll bis zu 10 Jahre halten und wird direkt auf die Platine gelötet.

Softwareentwickler: Frank M. (ukw)


IR

Es werden folgende Infrarot-Protokolle unterstützt:

Protokoll Hersteller
SIRCS Sony
NEC NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.
SAMSUNG Samsung
SAMSUNG32 Samsung
MATSUSHITA Matsushita
KASEIKYO Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der "Japan's Association for Electric Home Application" sind.
RECS80 Philips, Nokia, Thomson, Nordmende, Telefunken, Saba
RECS80EXT Philips, Technisat, Thomson, Nordmende, Telefunken, Saba
RC5 Philips und andere europäische Hersteller
DENON Denon
RC6 Philips und andere europäische Hersteller
APPLE Apple
NUBERT Nubert, z.B. Subwoofer System
B&O Bang & Olufsen (erst ab Version 1.0)
GRUNDIG Grundig (erst ab Version 1.0)
NOKIA Nokia, z.B. D-Box (erst ab Version 1.0)

Über die automatische Erkennung des Protokolls werden die nötigen Tastatur-Befehl-Bits aus den Infrarot-Daten extrahiert - ohne Kenntnis, welche Tasten da eigentlich tatsächlich gedrückt wurden. So eine Tabelle würde den Speicher des µCs sprengen. Deshalb passiert die Zuordnung der Tasten zu WordClock-Befehlen in einer kleinen Anlernprozedur, die einmal nach dem ersten Bootvorgang ausgeführt werden muss.

Mittlerweile gibt es einen eigenen Artikel zum Infrarot-Fernbedienungsdecoder, siehe IRMP

Softwareentwickler: Frank M. (ukw)

Eine passende Fernbedienung gibt es bei DX .

Sku_47019_1.jpg

Passend beschriftet werden kann die Fernbedienung mit folgenden Labels. Es gibt 2 Versionen der Scheckkartenfernbedienungen. Die erste passt für die DX Fernbedienung, diese ist etwas schmaler und länger. Einfach auf eine selbstklebende Folie drucken, ausschneiden und aufkleben.

WordClock RC Layout DX.png WordClock RC Layout.png


PWM

Die PWM steuert die 3 RGB Kanäle. Damit ist freie Farbenwahl möglich.

Softwareentwickler: Frank M. (ukw)


Display

Das Display wird nicht als 10x11 Matrix sondern wortweise angesteuert. Da die LEDs RGB-LEDs sind ergibt sich daraus für die 24 Wortteile und die 4 Minutenpunkte eine 28x3-Matrix.

Die Farben sind kein Muss, in der Minimalbeschaltung können auch einfarbige LEDs zum Einsatz kommen.

Softwareentwickler: Vlad Tepesch (vlad_tepesch)

Struktur

Die display.h ist quasi die Basisklasse. Dort ist definiert, welche Schnitsstellen eine Uhr anbieten muss. Einige front-unabhängige Sachen sind hier bereits implementiert.

Von ihr abgeleitet ist die display_tix und die display_wc, wo entweder der gesamte Rest implementiert ist (TIX) oder wo weitere Ableitungen existieren (WC).

Die display_wc implementiert die Teile die alle WC-Varianten gemeinsam haben. Von ihr sind quasi die verschiedenen WC-Frontplatten abgeleitet.

Die display_wc_xxx implentieren die Eigenheiten der speziellen Version, was neben ein paar Defines nur das Mapping Zeit → Ausgabemuster (display_getTimeState) ist und das Handling der Modus-Taste ist.

Hinzufügen eigener WC-Frontplattenlayouts

Prinzipiell sind folgende Schritte notwendig:

  1. Kopieren und Umbenennen einer display_wc_xxx-Datei, die der eigenen Konfiguration am nächsten kommt (englisch, wenn nur eine Sprache, oder ger3 bei mehreren)
  2. in main.h define hinzufügen
  3. in display_wc.h oben das kopierte include unter Bedingung des gerade definiertne Defines hinzufügen
  4. anpassen des neuen headers
    1. Enumeration anpassen, Namen sind egal aber DWP_min1 - DWP_min4 müssen existieren. Auch sollten sie die Werte 24 - 28 haben.
      Bei kleineren werden sonst die übrigen Shift-Register-ausgängen mit geschalten.
      Höhere machen keinen Sinn, weil das heißen würde, das mehr Wörter als SR-Kanäle da sind.
    2. display_getMinuteMask und display_getHoursMask so anpassen, das alle Minuten, bzw Stundenkanäle gesetzt werden
    3. display_getTimeSetIndicatorMask gibt die Bitmaske zurück, die bei Zeiteingabe 0 Minuten visualisieren soll (da sonst nix blinkt)
    4. display_getNumberDispalyState muss eine übergebene Zahl in ein Bild umwandeln, dass die übergebene Zahl erahnen lassen kann.
    5. Modus-Taste - am einfachsten nur Einträge in e_WcGerModes anpassen. Die Schaltung kann behalten werden. Man beachte, dass es doppelt so viele Modi gibt, wie in der Enumeration, da jeweils das Es_ist abgeschalten werden kann. Ist das nicht gewünscht, muss das Define DISPLAY_DEACTIVATABLE_ITIS auf 0 gestellt.
  5. anpassen der mapping-funktion Zeit → Ausgabemuster (display_getTimeState)
    1. komplett im Code oder mit look-Up-Tables
    2. Es sollte natürlich der aktuell ausgewählte Modus (g_displayParams->mode) berücksichtigt werden

Benutzer-Interaktion

Mit der Fernbedienung ist folgendes möglich:

  • Einmaliges Anlernen der Fernbedienung
  • Anpassen der automatischen Helligkeitssteuerung
  • Einstellen des Farbprogramms (Übergänge etc)
  • Stellen der Uhr (wenn kein DCF77-Modul angeschlossen)

Softwareentwickler: Vlad Tepesch (vlad_tepesch)