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.
Lesezeichen