Thomas E.
29.12.2011, 23:18
Hallo!
Um nach längerer Bascom-Abstinenz wieder in Übung zu kommen habe ich mal einen kleinen Logger geschrieben. Es ist nichts weltbewegendes, aber vielleicht sucht ja der ein oder andere solche Codeschnipsel oder findet Anregungen für ähnliche Projekte.
Mir ging es hierbei rein um die Speicherung im EEPROM, da ich sowas selten gemacht hatte und dafür bietet sich so ein kleiner Logger an. Um überhaupt etwas loggen zu können nahm ich einen lichtabhängigen Widerstand. Temperatursensoren waren zwar da, aber es musste schnell und einfach sein.
Verwendet wurde ein AtMega88 ohne viel Peripherie. Aus diesem Grunde wird auch der interne EEPROM verwendet, worin ja nicht wirklich viel Platz zu finden ist. Aber dennoch - es funktioniert.
Der Controller misst jede Sekunde den Wert des ADC0 und mittelt nach 60s alle Werte. So kann man sagen, der durchschnittliche Lichteinfall jeder Minute wird gemessen. Dieser Mittelwert wird in zwei Bytes aufgespalten und ins EEPROM geschrieben. Nachdem die Adresse 250 erreicht wurde, schaltet der Logger ab. Gelesen wird, indem die zwei Bytes wieder aus dem EEPROM gelesen und der ursprüngliche Wert daraus berechnet wird. Über zwei LEDs wird der aktuelle Zustand angezeigt. LED1 visualisiert, ob das Logging aktiv ist und LED2 leuchtet wenn gerade eine Routine durchlaufen wird (ziemlich hilfreich beim Debugging).
Die Software ist bewusst so programmiert, dass noch weitere Funktionen hinzugefügt werden können. Ich habe mir das bereits früh angewöhnt um Programme problemlos erweitern zu können. Somit wird auf Warteschleifen komplett verzichtet.
Die Hauptschleife prüft lediglich ob im UART-Buffer etwas steht und fragt ständig ab, ob geloggt werden soll. In der Timer-ISR wird die Variable für die Sekunden hochgezählt und gegebenenfalls bei erreichen der 60. Sekunde in die Routine für die Mittelung und Speicherung gesprungen. Außerdem wird in dieser ISR ein Messwert erfasst und in die Messwerttabelle gespeichert. Die restlichen Routinen werden nur auf Befehl vom User angesprochen.
Der User kann mittels Terminal mit dem Kontroller kommunizieren. Die Kommunikation ist (noch) recht einfach gehalten:
(e) ... Logging einschalten
(d) ... Logging ausschalten
(r) ... Lese EEPROM
(l) ... Lösche EEPROM
(s) ... Status
Es erfolgen kurze Bestätigungsmeldungen bei Tastendruck bzw. die entsprechende Aktion wird sofort ausgeführt und am Terminal ausgegeben. Terminalsteuerung exestiert (noch?) keine.
Was ich noch verbessern möchte:
Es sind sicher noch einige Fehler im Code;)
Bei Reset wird alles vergessen und neu gestartet, die zuletzt verwendete Adresse wird zurückgesetzt und somit werden alle bisherigen Messwerte überschrieben
Terminalsteuerung, eventuell (braucht aber leider ziemlich viel Flash)
Bis jetzt ist der Flash zu 25% gefüllt, vielleicht geht da noch weniger (es sei denn ich bastel mir wirklich noch eine Terminalsteuerung).
Ich bin um Rückmeldungen immer dankbar und es würde mich sehr freuen, wenn jemand gefallen an dem kleinen "Mini-Projekt" findet und/oder Anregungen für mich hat.
Grüße
Thomas
20995
Um nach längerer Bascom-Abstinenz wieder in Übung zu kommen habe ich mal einen kleinen Logger geschrieben. Es ist nichts weltbewegendes, aber vielleicht sucht ja der ein oder andere solche Codeschnipsel oder findet Anregungen für ähnliche Projekte.
Mir ging es hierbei rein um die Speicherung im EEPROM, da ich sowas selten gemacht hatte und dafür bietet sich so ein kleiner Logger an. Um überhaupt etwas loggen zu können nahm ich einen lichtabhängigen Widerstand. Temperatursensoren waren zwar da, aber es musste schnell und einfach sein.
Verwendet wurde ein AtMega88 ohne viel Peripherie. Aus diesem Grunde wird auch der interne EEPROM verwendet, worin ja nicht wirklich viel Platz zu finden ist. Aber dennoch - es funktioniert.
Der Controller misst jede Sekunde den Wert des ADC0 und mittelt nach 60s alle Werte. So kann man sagen, der durchschnittliche Lichteinfall jeder Minute wird gemessen. Dieser Mittelwert wird in zwei Bytes aufgespalten und ins EEPROM geschrieben. Nachdem die Adresse 250 erreicht wurde, schaltet der Logger ab. Gelesen wird, indem die zwei Bytes wieder aus dem EEPROM gelesen und der ursprüngliche Wert daraus berechnet wird. Über zwei LEDs wird der aktuelle Zustand angezeigt. LED1 visualisiert, ob das Logging aktiv ist und LED2 leuchtet wenn gerade eine Routine durchlaufen wird (ziemlich hilfreich beim Debugging).
Die Software ist bewusst so programmiert, dass noch weitere Funktionen hinzugefügt werden können. Ich habe mir das bereits früh angewöhnt um Programme problemlos erweitern zu können. Somit wird auf Warteschleifen komplett verzichtet.
Die Hauptschleife prüft lediglich ob im UART-Buffer etwas steht und fragt ständig ab, ob geloggt werden soll. In der Timer-ISR wird die Variable für die Sekunden hochgezählt und gegebenenfalls bei erreichen der 60. Sekunde in die Routine für die Mittelung und Speicherung gesprungen. Außerdem wird in dieser ISR ein Messwert erfasst und in die Messwerttabelle gespeichert. Die restlichen Routinen werden nur auf Befehl vom User angesprochen.
Der User kann mittels Terminal mit dem Kontroller kommunizieren. Die Kommunikation ist (noch) recht einfach gehalten:
(e) ... Logging einschalten
(d) ... Logging ausschalten
(r) ... Lese EEPROM
(l) ... Lösche EEPROM
(s) ... Status
Es erfolgen kurze Bestätigungsmeldungen bei Tastendruck bzw. die entsprechende Aktion wird sofort ausgeführt und am Terminal ausgegeben. Terminalsteuerung exestiert (noch?) keine.
Was ich noch verbessern möchte:
Es sind sicher noch einige Fehler im Code;)
Bei Reset wird alles vergessen und neu gestartet, die zuletzt verwendete Adresse wird zurückgesetzt und somit werden alle bisherigen Messwerte überschrieben
Terminalsteuerung, eventuell (braucht aber leider ziemlich viel Flash)
Bis jetzt ist der Flash zu 25% gefüllt, vielleicht geht da noch weniger (es sei denn ich bastel mir wirklich noch eine Terminalsteuerung).
Ich bin um Rückmeldungen immer dankbar und es würde mich sehr freuen, wenn jemand gefallen an dem kleinen "Mini-Projekt" findet und/oder Anregungen für mich hat.
Grüße
Thomas
20995