Hauptprogramm
Start
Watchdog auf 120 Millisekunden einstellen
I2C Hardware Initialisieren
Systemtimer initialisieren
Real-time-clock (RV3029) initialisieren
[Sensor] - Initialisieren
[Regler] - Initialisieren
UART initialisieren
Interrupts aktivieren
Endlosschleife
Watchdogtimer ruecksetzen
UART-Kommunikationsaufgaben abarbeiten
[RTC] - RTC-Routine
[Regler] - Reglerroutine
Ende
wdt_reset()
Interrupt-Service-Routine - Systemtimer
Start
Softwarezeitzaehler inkrementieren.
Ende
Der Softwarezeitzaehler ist die Basis aller kurzen Zeitmessungen.
[Logbuch] - Aeltesten Eintrag entnehmen
Start
Mindestens ein Eintrag im Ringpuffer vorhanden?
Aeltesten Eintrag aus dem Ringpuffer entnehmen und zurueckgeben.
Ende
Fehler signalisieren.
[Logbuch] - Lognachricht speichern
Start
[RTC] - Aktuelle Zeit holen
Lognachricht mit Zeitstempel (von RTC) versehen.
Lognachricht in Ringpuffer ablegen.
Ende
[Regler] - ADC-Wert skalieren
Start
ADC-Messwert ist groesser als der Maximalwert?
ADC-Messwert ist kleiner als der Minimalwert?
ADC-Messwert nach folgender Formel skalieren:

ADC_VALUE = ADC_VALUE - ADC_MIN

RESULT = (255 / (ADC_MAX - ADC_MIN)) * ADC_VALUE)
Ende
ADC-Wert auf Maximalwert setzen.
ADC-Wert auf Minimalwert setzen.
ADC_VALUE: Messwert. ADC_MIN: Minimalwert. ADC_MAX: Maximalwert. 255: Maximalwert eines 8-Bit Integer. RESULT: Skaliertes Ergebnis.

Division durch 0 beachten!
[Regler] - Globale Konfiguration auslesen
Start
Aktuelle globale Konfigurationsdatenstruktur (EEPROM) zurueckgeben.
Ende
[Regler] - Globale Konfiguration schreiben
Start
Neue globale Konfigurationsdatenstruktur in RAM schreiben.
Neue globale Konfigurationsdatenstruktur in EEPROM schreiben.
Ende
[Regler] - Handbetriebskonfiguration schreiben
Start
Handbetriebskonfigurationsdaten im RAM ablegen.
Handbetrieb steuert Ventile an?
Die entsprechenden Ventile oeffnen/schliessen.
Ende
[Regler] - Initialisieren
Start
Datenstrukturen ruecksetzen
Aktuelle Konfiguration aus EEPROM auslesen
Ende
[Regler] - Reglerroutine
Start
Stehen EEPROM-Daten zum Speichern bereit und ist die EEPROM-Wartezeit abgelaufen?
Ist der Regler global aktiviert?
[Reglerroutine] - Aktueller Topf
Zaehler des aktuellen Topfes inkrementieren. Wenn Zaehlerueberlauf, dann wieder bei 0 beginnen.
Ende
Zwischengespeicherte EEPROM-Daten in den EEPROM schreiben
[Regler] - Topfkonfiguration auslesen
Start
Aktuelle Topfkonfigurationsdatenstruktur (EEPROM) zurueckgeben.
Ende
[Regler] - Topfkonfiguration schreiben
Start
Neue Topfkonfigurationsdatenstruktur in RAM schreiben.
Neue Topfkonfigurationsdatenstruktur in EEPROM schreiben.
Ende
[Regler] - Topfstatus auslesen
Start
Reglerstatus fuer den angegebenen Topf auslesen und an den Aufrufer zurueckgeben.
Ende
[Reglerroutine] - Aktueller Topf
Start
Reglerstatus ist POT_IDLE?
Reglerstatus ist POT_START_MEASUREMENT?
Reglerstatus ist POT_MEASURING?
Reglerstatus ist POT_WAITING_FOR_VALVE?
Ende
[Reglerroutine] - POT_IDLE
[Reglerroutine] - POT_START_MEASUREMENT
[Reglerroutine] - POT_MEASURING
[Reglerroutine] - POT_WAITING_FOR_VALVE
[Reglerroutine] - POT_IDLE
Start
Topf ist aktiv?
[RTC] - Aktuelle Zeit holen
Topf ist am aktuellen RTC-Wochentag aktiv?
Ist die RTC-Zeit innerhalb der "aktiv-Zeit" des Topfes?
Wartezeit fuer Verzoegerung zwischen Messungen ist abgelaufen?
Reglerstatus auf POT_START_MEASUREMENT setzen.
Ende
[Reglerroutine] - POT_START_MEASUREMENT
Start
Ist eine Sensormessung (an einem anderen Topf) aktiv?
[Sensor] - Messung starten
Reglerstatus auf POT_MEASURING setzen.
Ende
[Reglerroutine] - POT_MEASURING
Start
[Sensor] - Status abfragen
Messung ist fertig?
Logging an diesem Topf aktiv?
[Regler] - ADC-Wert skalieren
Messwerte plausibel?
Bewaesserung dieses Topfes ist bereits aktiv?
Skalierter Sensorwert ist kleiner als der untere Grenzwert?
Reglerstatus auf POT_IDLE setzen.
Ende
Logbucheintrag mit Sensorwerten erstellen.
[Logbuch] - Lognachricht speichern
Bewaesserung des Topfes starten.
Ventil des Topfes oeffnen.
Reglerstatus auf POT_WAITING_FOR_VALVE setzen.
Skalierter Sensorwert ist groesser oder gleich dem oberen Grenzwert?
Ventil des Topfes oeffnen.
Reglerstatus auf POT_WAITING_FOR_VALVE setzen.
Bewaesserung des Topfes stoppen. (Ventil schliessen)
Reglerstatus auf POT_IDLE setzen.
Logbucheintrag mit Fehlernachricht erstellen.
[Logbuch] - Lognachricht speichern
Ventil dieses Topfes schliessen.
Reglerstatus auf POT_IDLE setzen.
[Reglerroutine] - POT_WAITING_FOR_VALVE
Start
Ventilzeit (offen-Zeit / geschlossen-Zeit) ist abgelaufen?
Ventil ist geoeffnet?
Reglerstatus auf POT_START_MEASUREMENT setzen.
Ende
Ventil schliessen.
Wartezeit legt die Ventilzeiten und damit die Wassermenge fest.
[RTC] - RTC-Routine
Start
Letzte RTC-Abfrage laenger als eine Sekunde in der Vergangenheit?
RTC-Zeit vom RTC-Modul einlesen und zwischenspeichern.
Ende
[RTC] - Uhrzeit stellen
Start
Uhrzeit in RTC-Modul-Hardware schreiben.
Ende
[RTC] - Aktuelle Zeit holen
Start
Zwischengespeicherte Zeit zurueckgeben.
Ende
Siehe "RTC-Routine"
[Sensor] - Initialisieren
Start
Sensorhardware deaktivieren.
Erste ADC-Messung starten.
ADC-Messung aktiv?
ADC-Ergebnis verwerfen.
Ende
Laut AtMega8-Datenblatt sollte die erste Messung verworfen werden, da diese ungenau ist.
[Sensor] - Messung handhaben
Start
In Warmup-Phase?
In Messphase?
Ende
3 ADC-Messungen fertig?
Den Median der 3 Messungen als Ergebnis speichern.
ADC-Hardware deaktivieren.
Spannung an den Sensorplatten abschalten. (Platten auf floating-Potential legen)
Warmup-Zeit abgelaufen?
Messphase starten.
ADC-Hardwaremessung starten.
"floating" = Pins auf INPUT konfigurieren.
[Sensor] - Messung starten
Start
Datenstrukturen der ADC-Messung zuruecksetzen.
Warmup-Phase starten (Spannung an die Sensorplatten anlegen).
Ende
[Sensor] - Status abfragen
Start
[Sensor] - Messung handhaben
Messung beendet und Ergebnis vorhanden?
"True"-Status und Ergebnis zurueckgeben.
Ende
"False"-Status zurueckgeben.
[UART] - Nachricht empfangen
Start
Nachricht zum Auslesen der Logginginformationen empfangen?
Nachricht zum Stellen der RTC-Zeit empfangen?
Nachricht zum Auslesen der RTC-Zeit empfangen?
Nachricht zum Setzen der globalen Konfiguration empfangen?
Nachricht zum Auslesen der globalen Konfiguration empfangen?
Nachricht zum Setzen der Topfkonfiguration empfangen?
Nachricht zum Auslesen der Topfkonfiguration empfangen?
Nachricht zum Auslesen des Topfstatus empfangen?
Nachricht zum Setzen der Handbetriebskonfiguration empfangen?
Fehler signalisieren.
Ende
Der Aufruf dieses Handlers wird durch den UART-RX-Interrupt ausgeloest.
[UART] - Logbucheintrag abfragen
[UART] - RTC-Zeit einstellen
[UART] - RTC-Zeit auslesen
[UART] - Globale Konfiguration setzen
[UART] - Globale Konfiguration auslesen
[UART] - Topfkonfiguration setzen
[UART] - Topfkonfiguration auslesen
[UART] - Topfstatus auslesen
[UART] - Handbetrieb
[UART] - Logbucheintrag abfragen
Start
[Logbuch] - Aeltesten Eintrag entnehmen
Lognachricht in UART-Paket verpacken.
UART-Paket an PC senden.
Ende
[UART] - RTC-Zeit einstellen
Start
[RTC] - Uhrzeit stellen
Ende
[UART] - RTC-Zeit auslesen
Start
[RTC] - Aktuelle Zeit holen
RTC-Zeit in UART-Paket verpacken.
UART-Paket an PC senden.
Ende
[UART] - Globale Konfiguration setzen
Start
[Regler] - Globale Konfiguration schreiben
Ende
[UART] - Globale Konfiguration auslesen
Start
[Regler] - Globale Konfiguration auslesen
Konfiguration in UART-Paket verpacken.
UART-Paket an PC senden.
Ende
[UART] - Topfkonfiguration setzen
Start
[Regler] - Topfkonfiguration schreiben
Ende
[UART] - Topfkonfiguration auslesen
Start
[Regler] - Topfkonfiguration auslesen
Konfiguration in UART-Paket verpacken.
UART-Paket an PC senden.
Ende
[UART] - Topfstatus auslesen
Start
[Regler] - Topfstatus auslesen
Status in UART-Paket verpacken.
UART-Paket an PC senden.
Ende
[UART] - Handbetrieb
Start
[Regler] - Handbetriebskonfiguration schreiben
Ende