Hallo zusammen, ich habe in kleines mobiles Datenerfassungsgerät gebaut, basierend auf einem ATmega328P, ein paar Sensoren (Temperatur, luftfeuchtigkeit, CO2, VOC) und einem kleinen Display. Das Teil ist mobil und batteriebetrieben, und hat eine serielle Schnittstelle. Mobil deswegen, weil ich es an verschiedenen Orten ein paar Stunden laufen lassen will. Dort steht mir nichts zur Verfügung, was die Daten vom UART abgreifen kann. Deswegen hab ich ein 24C65 (I2C EEPROM) eingebaut, auf das ich die Daten speichern kann. Ich frag mich nun wie ich die Prozedur des "Daten abholen" implementieren soll. Das Ding hat einen (einen!) Taster am AVR. Idee: wenn bei gedrücktem Taster eingeschaltet wird, geht das Teil in den "Daten senden" Modus, und schickt die gespeicherten Daten per UART. Nur - was tu ich danach mit den Daten im EEPROM? Überschreiben? löschen? Falls ich "versehentlich" den Taster beim Einschalten gedrückt halte, würden die Daten gesendet, sollen danach aber nicht gelöscht werden. Auch wenn die Übertragung klappt, könnte es ja sein dass beim Speichern am PC was schiefgeht... Weiters wäre es schön, wenn mehrere "Pakete" gespeichert werden könnten: ich trage das Ding an ort A, schalte ein, zeichne 2 Stunden auf, ausschalten, dann an Ort B, einschalten, wieder drei Stunden aufzeichnen. Am Ende komm ich an meinen PC, und will die Daten von Ort A und Ort B haben. Meine Idee: ich speichere eine "Paketnummer" im EEPROM, bei jedem Einschalten wird diese erhöht. Die eigentlichen Messdaten im EEPROM werden zusammen mit der Paketnummer gespeichert, und beim Abrufen werden immer alle Pakete gesendet. Beim Schreiben wird das EEPROM wie ein Ringpuffer verwendet, die ältesten Daten (mit der ältesten Paketnummer) werden einfach überschrieben. Verschmerzbarer Nachteil: ich habe u.U. "uralte" Daten im EEPROM, die ich immer wieder mit auslese. Da die Daten dann in eine tabellenkalkulation gehen, kann ich mir die höchste paketnummer suchen, und alle anderen löschen. Gibts bessere Ideen? Danke, Michi
Spontan würde ich das Auslesen nicht mit dem Taster starten. Wenn das System am Rechner hängt würde ich es nur über den UART steuern. Eine weitere (einfache) Möglichkeit wäre es eine SD-Karte zu verwenden. Tutorials zur Ansteuerung gibt es wie Sand am Meer. Die Daten können direkt in (txt-) Dateien geschrieben werden. Der Controller kann dann auch bei jedem Neustart eine neue Datei anlegen. Damit könnten die Daten auch ohne Controller von der SD-Karte ausgelesen werden... Man darf jedoch die Datenschreibgeschwindigkeit vergessen. Die ist (nach meinen Erfahrungen) nicht vergleichbar mit einem Betrieb der SD-Karte in einem PC.
Hey, Warum sendest du nicht einfach dann die Daten, wenn ein bestimmtes Zeichen auf dem UART reinkommt. Dann kannst du auch ein Kommando zum Löschen der Daten festmachen. Grüsse
Danke euch für die Antworten! Steuerung per UART gefällt mir nicht so gut: Ich möchte sauber trennen zwischen "Daten abliefern" und "aufzeichnen". Entweder-oder. SD-Card hab ich überlegt, aber ich brauch bei weitem nicht die Kapazität (das 64kBit-EEPROM ist schon überdimensioniert), und ich mag mir keine FAT-Treiber antun. Abgesehen davon basiert die ganze Schaltung auf 5V (die Sensoren brauchen das), und die ganze pegelwandlung für SD-Cards ist dann etwas problematisch.
Also wenn du das Aufzeichnen und das Abliefern der Daten sauber trennen willst, dann würde ich das so machen: Das Gerät braucht doch bestimmt einen Ein-Schalter. Nimm dafür einen Wipp- oder Schiebeschalter mit zwei Stellungen. Die Versorgung zum einen das Gerät und zum Anderen entsprechen die zwei Stellungen den zwei Modi. Das Auslesen und Löschen der Daten würde ich dann vom Rechner über den UART steuern. So wie nicht"Gast" geschrieben hat reichen dann dafür einfache Kommandos die über den UART zum Controller geschickt werden. Nach dem korrekten Empfangen der Daten sendet der Rechner dann das Kommando zum Löschen der Daten. Fertig.
Hello again, eine Steuerung per uart ist doch eine schöne Möglichkeit der Trennung. Irgend wie versteh ich dich nicht. Du scheinst dir etwas absichtlich Schwerer zu machen, als es ist. Grüße,
nicht "Gast" schrieb: > Hello again, > > eine Steuerung per uart ist doch eine schöne Möglichkeit der Trennung. > > Irgend wie versteh ich dich nicht. Du scheinst dir etwas absichtlich > Schwerer zu machen, als es ist. Kann schon sein dass ich ein Brett vor dem Kopf habe. Vielleicht hab ich auch nicht verstanden wie die Steuerung per UART funktionieren soll... Im Datenerfassungs-Modus hab ich keinen UART bzw. niemanden an der anderen Seite. Heisst: Einschalten und sofort beginnen zu messen und aufzuzeichnen. Im Daten-Ablieferungsmodus hätte ich zwar den UART, aber der kriegt ja u.U. das Kommando erst etwas später nach dem Einschalten. Also würde das Ding schon mal in den Erfassungsmodus gehen, müsste aber regelmäßig den UART auf "Kommandos" prüfen, dann u.U. mit der Datenübertragung beginnen, und die aktuellen Meßdaten verwerfen? Außerdem möchte ich die Oberfläche am PC "as simple as possible" halten. Da ich Linux benutze, könnte sich das auch ein "cat /dev/ttyUSB0 > data.csv" beschränken.
Wieso nimmst Du nicht einfach den einen Taster den Du hast zum starten und stoppen der Messungen? Wenn Du die Daten auslesen willst, drückst Du einfach NICHT auf den Taster, sondern steckst Dein UART zu USB Wandler an (oder eben RS232) und sendest ein Command an den uC. Der empfängt das Command und überträgt die Daten in den gewünschten Paketen (z.B. zusätzlich mit CRC). Dann kannst Du Dir sicher sein, dass die Daten valide sind. Zusätzlich könntest Du Dir auf ein anderes Command ein "Inhaltsverzeichnis" plotten lassen. Da werden Dir dann die verschiedenen Messungen angezeigt. Dann kannst Du selektiv auswählen was übertragen werden soll bzw. was gelöscht werden soll. Ist doch ganz einfach. Grüße Horst
Michael Reinelt schrieb: > Idee: wenn bei gedrücktem Taster eingeschaltet wird, geht das Teil in > den "Daten senden" Modus, und schickt die gespeicherten Daten per UART. Eigentlich klingt das doch schon ganz gut. Wenn der Taster sonst nicht benötigt wird im Erfassungsmodus, spricht nichts dagegen, den Taster versenkt anzubringen, damit eine versehentliche Betätigung ausgeschlossen ist. > Meine Idee: ich speichere eine "Paketnummer" im EEPROM, bei jedem > Einschalten wird diese erhöht. Das hat nur den Nachteil, das eine bestimmte Zelle im EEPROM immer und immer wieder beschrieben wird. Bei den meisten EEPROMs ist die Grenze bei ca. 1 Mio. Schreibzyklen, wenn das akzeptabel ist, nimm diese Lösung. Eine weitere Möglichkeit wäre, beim Schreiben eines Paketes das darauffolgende Paket mit einem Marker zu beschreiben, das dieses das nächste Paket zum Schreiben ist. Das hat den Vorteil, das keine dedizierte Zelle immer wieder beschrieben wird, sondern der gesamte Ringpuffer gleichmässig benutzt wird. Beim Einschalten sucht der Logger nach diesem Marker und schreibt ab da weiter.
Matthias Sch. schrieb: > Michael Reinelt schrieb: >> Idee: wenn bei gedrücktem Taster eingeschaltet wird, geht das Teil in >> den "Daten senden" Modus, und schickt die gespeicherten Daten per UART. > > Eigentlich klingt das doch schon ganz gut. Wenn der Taster sonst nicht > benötigt wird im Erfassungsmodus, spricht nichts dagegen, den Taster > versenkt anzubringen, damit eine versehentliche Betätigung > ausgeschlossen ist. Der Taster wird schon verwendet, um Darstellungen am LCD umzuschalten. Ich würd das aber erkennen, wenn er während des Einschaltens gedrückt ist. >> Meine Idee: ich speichere eine "Paketnummer" im EEPROM, bei jedem >> Einschalten wird diese erhöht. > > Das hat nur den Nachteil, das eine bestimmte Zelle im EEPROM immer und > immer wieder beschrieben wird. Bei den meisten EEPROMs ist die Grenze > bei ca. 1 Mio. Schreibzyklen, wenn das akzeptabel ist, nimm diese > Lösung. Eine weitere Möglichkeit wäre, beim Schreiben eines Paketes das > darauffolgende Paket mit einem Marker zu beschreiben, das dieses das > nächste Paket zum Schreiben ist. Das hat den Vorteil, das keine > dedizierte Zelle immer wieder beschrieben wird, sondern der gesamte > Ringpuffer gleichmässig benutzt wird. Beim Einschalten sucht der Logger > nach diesem Marker und schreibt ab da weiter. 1 million ist mehr als genug. Die "Paketnummer" wird ja nur beim Einschalten ermittelt, erhöht und zurückgeschrieben, und ich glaube nicht dass ich das teil 1 Million mal einschalte (dann sind mir wahrscheinlich die Finger abgefallen :-) Abgesehen davon bietet das EEPROM einen "high endurance block", da muss ich mich aber erst einlesen...
Michael Reinelt schrieb: > Der Taster wird schon verwendet, um Darstellungen am LCD umzuschalten. > Ich würd das aber erkennen, wenn er während des Einschaltens gedrückt > ist. Dann verwende das doch. Wenn der Taster beim Einschalten nicht gedrückt ist, dann startest du deine Messung. Wenn der Taster beim Einschalten aber gedrückt ist, dann startest du deinen UART und wartest auf Kommandos. Kann ja ein ganz einfaches Protokoll sein, wie R1 -> Lese Datensatz 1; E3 -> Lösche Datensatz 3. Nur so als Beispiel. lg Christopher
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.