Nur mal als Beispiel eines meiner momentanen Projekte: eine Nixie-Uhr (ATmega8 mit avr-gcc):
  • DCF77-Decoder mit Check von Parity Taktzeiten
  • RC5-Decoder
  • Menüstruktur zur Konfiguration. Menüsteuerung sowohl über RC5 als auch über 4 angeschlossene Taster
  • Taster werden abhängig vom Menupunkt und unanhängig voneinander rekonfiguriert
    -- Kurzer Druck
    -- Kurzer o. langer Druck
    -- Auto-Repeate
  • Zwei Hard-PWM-Kanäle
  • Datenausgabe über ein SPI-Bus: 32 Bit parallel mit einer Ausgaberate von 20kHz
  • Am SPI-Bus hängen
    -- Ein Lautsprecher
    -- 2 Kanäle Soft-PWM (LEDs)
    -- 6 BCD-Kanäle (je 4 Bit) Auf diesen Kanälen liegt zudem eine zeitmultiplexte(!) PWM der BCD-Kanäle
    -- weiteres Zeug (digtitale Ausgänge)
  • Ausgabe von Zuständen/Menu-Punkten durch Morse-Codes am Lautprecher
  • Anzeige von Systeminformationen:
    -- RAM-Speicherverbrauch (Stack, etc)
    -- Laufzeiten verschiedener Tasks/Funktionen
    -- Umrechnung und Anzeige eine Spannung (ADC)
    -- Anzeige von Systemregister, Status-Infos etc via UART
    -- Anzeige der empangenen RC5-Codes (falls man mal einen anderen Sender proggen will und die Codes wissen muss)
  • Abspeichern und Recall der Systemkonfiguration (Duty der Soft- und Hard-PWMs, Spannungstrigger, IRQ-Rate, Rampenzeiten für Soft-PWMs, etc) in/aus EEPROM
  • Standart Funktionalitäten
    -- Anzeige von Uhrzeit / Datum /Wochentag
    -- Automatisches Umschalten auf Quarz, wenn kein DCF-Signal verfügbar


Dabei sind nicht nur die Funktionen zu implementieren, sondern auch harte Echtzeitbedingungen einzuhalten. Die Ausgabe nach SPI-Bus muss strikt alle 50µs erfolgen. Die auszugebenden SPI-Daten müssen 20000 mal pro Sekunde neu berechner werden. Bereits kleinste Anweichungen wären als Flackern erkennbar bzw. würden Fehlfunktionen verursachen.

Quasi gleichzeitig werden also erledigt:
  • SPI-Ausgabe mit 20kHz (Rampen von zeitmultiplexten(!) Soft-PWM), Lautsprecher
  • Auswertung/Ausführung von: RC5-Empfang, UART-Empfang, DCF-Empfang, Tasterdrucken
  • ADC-Auswertung
  • Sammeln von System- und Laufzeit-Informationen


Das ganze belegt momentan knapp 4600 Bytes an Flash (0x1200 von 0x2000, also 56%) und verteilt sich auf ca 3000 Zeilen C-Code.