PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [BASCOM] Einfacher Datenlogger für die Speicherung im EEPROM



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

Scotch
13.04.2012, 18:41
Hallo Thomas,

es ist zwar schon ein wenig her das Du Dein Programm hier veröffentlicht hast.
Aber da ich selber einen kleinen Logger bauen will, finde ich Deine minimallösung einen gute Einstiegshilfe.
Das einzige was ich jetzt spontan an Deinem Code verändern würde ist die Auswertung der Tasteneingaben.
Du hast für jeden Tastendruck einen If Anweisung geschrieben.
Ich würde es mit einer Select Case abfrage machen. Finde es dann etwas Übersichtlicher.
Ob es beim compilieren einen Vorteil bring weiß ich nicht, könnte man aber mal überprüfen.
z. B. wie auf der Seite
http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm

Wenn ich das richtig verstehe, verwendest Du den Internen EEprom, ich werde dann per I2C
auf ein externen erweitern. Was ich auch schon immer mal testen wollte, ist das schreiben auf einer
SD Karte. Müsste mir da dann erst mal ein schreib/lese Hardware aufbauen.
Als Prozessor kommt bei mir dann ein Atmega 368 (Arduino Pro Mini) zum Einsatz.
Den hab ich hier noch rumliegen und ist schnell per ber USB<->RS232 Adapter und dem Bootloader
beschrieben.
Der Bootloader verbraucht zwar etwas Speicher, aber das sollte bei einem Logger nicht das Problem werden.
Andere speichern dort viel größere Projekte drauf (z.B. Wiicopter Steuerung)


Gruß Ingo

Thomas E.
13.04.2012, 20:57
Hallo Scotch!


Vielen Dank für deine Antwort. Es stimmt, es ist bereits eine Weile her und ich habe das Programm auch nur zu Übungszwecken geschrieben, um wieder "einzusteigen".

Inzwischen exestiert auf meinem Schreibtisch eine Uhr mit eingebautem I2C-Temperatursensor und I2C-EEPROM, die ebenfalls anständig loggen kann. Die Kommunikation mit der Uhr erfolgt über ein Terminal und die Ausgabe der Uhrzeit mit Statusdaten über ein LCD-Display.
Die Besonderheit: Die Uhr kann mit "echten" Kommandos gesteuert werden. Statt der etwas bescheuerten "Eine-Ziffer-ist-ein-Menüpunkt"-Bedienung können nun Befehle eingegeben werden welche erst nach drücken der Enter-Taste ausgelöst werden. Für mich war das eine große Hürde.
Der Logging-Intervall ist einstellbar von 1-99 Minuten, tritt ein Logging-Ereignis ein wird ein Zeitstempel und anchließend die Temperatur im externen EEPROM abgespeichert.
22121

Scotch
14.04.2012, 17:10
Hallo Thomas,

das mit den Befehl Eingabe ist eine interessante gefällt mir.

Ich will mir erst mal einen Akku Logger für ein RC Modell bauen.
Dieser soll mir dann die aktuelle Belastung in Ampere mitschreiben welche über ein Sensor in kurzen Zeiten gemessen wird.
Des weiteren sollen dann noch Max, Min und Gesamtentnahme speichern.
Bei einer Messdauer von ca. 15 Minuten und 10 Messungen pro Sec. würde ich auf 9000 Messergebnisse kommen.:rolleyes:

Gruß Ingo

Thomas E.
16.04.2012, 09:52
Hallo Ingo!


An der Eingabe der Befehle habe ich auch einige Zeit geknabbert. Ich werde in Kürze den Codeschnipsel im Forum einstellen, damit auch andere es verwenden können. Ich finde, damit lässt sich das Gerät wesentlich angenehmer bedienen.