Hi,
für den "privaten Motorsport" möchte ich einen Datenlogger entwickeln.
Nach einigen Überlegungen zum Grundkozept frage ich mich, wie sich eine
geeignete
Variante darstellen lässt. Als Speicher möchte ich eine MMC/SD Karte
verwenden. Zuerst sollen (am besten auf basis eines RTOS) 8 A/D Werte in
1 ms Intervallen gespeichert werden . Nebenbei soll die CPU noch ein
240x128 Display steuern, das schon läuft und durch ein integriertes
Modul per TWI /I2C angesteuert wird. Ist das ganze noch mit einem AVR zu
realisieren ( vorrausgesetzt mit 20 Mhz ), oder sollte ich eher zum ARM
geifen ? Kann mir jemand vielleicht ein paar Tips geben, oder
einschlägige Literatur nennen ?
mfg,
Simon
SD/MMC ist machbar, benoetigt aber Resourcen. Ein Atmel Daenflash waere
moeglicherweise einfacher und sparsamer. RTOS, Was soll das ? Zuviel
Zeit und Strom zum Verbraten ? Display geht auch. Ein 20MHz AVR ist
moeglicherweise schon zuviel. Er koennte auch langsamer laufen.
Rene
Wenn Du nicht soviel Geld und dafür erstmal etwas mehr Grips investieren
willst, kannst Du ja 3 Mega8 nehmen: 2 zum Messen / Zwischenspeichern
der Werte (dazu kannst Du den eingebauten RAM nutzen) und einen dritten,
der dann ganz in Ruhe per SPI die Werte ausliest, auf SD speichert (wenn
Du kein Dateisystem brauchst und nur Sektoren schreibst, reicht ein
Mega8) und das Display bedient.
die 16kByte / Sekunde sind für eine SD-Karte kein Problem, wenn ein
Puffer da ist (sie scheibt rasend schnell einen Sektor, aber braucht
dann einige Milliskunden, bis man weiter schreiben kann).
Ob Dein Display damit schnell genug ist, wirst Du sehen. Schöne
Bastelarbeit jedenfalls - viel Spaß dabei! :-)
Danke schon mal für die Antworten !
Das mit dem Puffer hatte ich auch vor. In etwa so:
Array / Zeiger mit n - Elementen (z.B 512 Byte). Nach dem 512. Byte muss
parallel zum 1 kHz-sample auf die MMC/SD geschrieben werden, ohne den
regulären (sample) Betrieb zu stören / verzerren. Ist das soweit machbar
?
Die Anwendung sollte auf einer Statemachine basieren, die durch einen
PIT im
1ms Takt aufgerufen wird. Dabei soll ein BUSY-Flag beim Aufruf und
Verlassen der Statemachine gesetzt/gelöscht werden, um undefiniertes
Verhalten ausschließen zu können.
Für inteligentere oder elegantere Ansätze oder Varianten bin ich sehr
offen !
mfg,
Simon
Wie gesagt, wenn es ein AVR nicht schafft - nimm nehrere für
verschiedene Aufgaben. "RTOS" und "Statemachine" hört sich gewaltig
abstrakt an für so ein relativ kleines konkretes Problem - back erstmal
kleine Brötchen und bau Dir 2 kleine Programme zum AD-lesen und zum
Lesen / Schreiben der SD-Karte. Da bist Du erstmal eine Weile
beschäftigt und weißt danach viel besser, was geht und was nicht ;-)
Also ich würde statt zu einer SD Karte eher zu den ATMEL Dataflash
Bausteinen greifen (Die gibt es auch in Kartenform).
Die ansteuerung ist erheblich einfacher als eine SD-Karte.
Die Dinger habern auch zwei RAM Buffer in die jeweils eine Flash-Page
reinpasst. Man muß also üblicherweise Nichts im AVR RAM puffern.
Als µC denke ich sollte der ATMega16 ausreichen (wegen 8 ADC Eingängen)
Die meiste Zeit verbringt der AVR eh warscheinlich damit zu warte das
eine ADC Messung fertig ist.
Während dessen hat man genug Zeit um zu schauen ob noch eine SPI
Übertragung zum DF läuft und ob überhaupt noch Daten übertragen werden
müssen.
Wenn das erledigt ist kann du dich wieder um das Display kümmern.
Man kann das ganze mit zwei Interrupts erschlagen.
1. Timerinterrupt der dir das 1ms Messintervall vorgibt.
2. ADC Conversion Complete Interrupt der dir sagt wann es wieder was zu
speichern gibt, und danach das DF ansteuert.
3. Die Hauptroutine welche dein Userinterface abarbeitet.
bis dann
Hauke
Wie willst du die Daten auslesen? bei der Samplerate werden das recht
viele sein. Ich denke per MMC Karte und FAT16 am besten. Dann kannst du
die Karte einfach in den PC stecken. Oder du nimmst einen Controller mit
USB interface, dann kannst du das ganze direkt an einen PC anschließen,
erfordert aber die Programmierung eines USB devices, was nicht wirklich
einfacher als FAT16 ist.
Also nicht aus den Augen lassen!! sonst überträgst du am Ende ewig lang
per 115 kbaud und ärgerst dich.
Marc989
Hallo Simon,
ich kenn ein bisschen das Motorsportumfeld und erlaub mir daher mal zu
antworten.
> Als Speicher möchte ich eine MMC/SD Karte> verwenden. Zuerst sollen (am besten auf basis eines RTOS) 8 A/D Werte in> 1 ms Intervallen gespeichert werden .
Ich kenn die AVR Reihe nicht. Aber der µC hat ja bei vielen hier einen
sehr guten Ruf. Somit seh ich bis hierher überhaupt kein Problem. Auch
halt ich es für sinnvoll ein RTOS vorzusehn. Gerade wenn Du die
grundsätzlich verschiedenen Aufgaben (messen, wegschreiben,
Displaysteuerung, ...) durchführen willst. Da hilft es nach meiner
Erfahrung ungemein wenn man die Aufgaben in Tasks gliedert die man dann
bzgl Priorität und Koordination untereinander leicht steuern kann. Unter
freertos.org findest Du eine Portierung die sicherlich alles mitbringt
was Du brauchst.
> Nebenbei soll die CPU noch ein> 240x128 Display steuern, das schon läuft und durch ein integriertes> Modul per TWI /I2C angesteuert wird.
hmmm, ich kenn das Display nicht. Aber wenn ich mal von einer
Bildwiederholrate von mindestens 50Hz ausgeh dann würde sich daraus
ergeben das Du die 'Chance' hast ca 1500000/Sekunde einen Pixel zu
ändern. Vermutlich reicht Dir eine Änderung von höchstens 20% aller
Pixel von Sekunde zu Sekunde. Jetzt würde ich mal schauen ob der I2C Bus
das überhaupt hergibt und wieviele Befehle nötig sind um eine Änderung
über den Bus an das Display zu schicken. Jetzt musst Du aber auch noch
bedenken das Dein µC die Änderung der Displaydarstellung aufgrund von
irgendwelchen Ereignissen erstmal feststellen muss. Vermutlich passiert
das über Interrupts. Da hast Du sicher schnell mal 40-100 Befehle. Daher
bin ich der Meinung das das selbst mit einem 'idealen' 20MHz
RISC-Mikrocontroller sehr knapp wird. Wenn Du es aktzeptieren kannst das
das Display der realen Welt gelegentlich hinterherläuft dann wird es
gehn - ich glaub nur nicht das Du einen Rennfahrer findest der das gut
heissen wird :-)
Muss es aus der AVR, ARM Schiene sein ? Wer sehr schnell A/D wandelt und
auch noch DMA hat ist die 33er Reihe der PICs von Microchip. Die
Bausteine sind bis 40MIPS skalierbar. Das sollte für Deine Anwendung
ganz gut reichen. Hab diese Controller in verschiedensten Projekten im
Einsatz und bisher nur gute Erfahrungen.
Gruss
Markus
> Für inteligentere oder elegantere Ansätze oder Varianten bin ich sehr> offen!
nimm einen lock-free fifo:
http://csourcesearch.net/package/audiality/0.1.0/audiality/engine/sfifo.c
dann kannst du ans eine ende daten reinstreamen und die 'task' am
anderen ende schreibt die daten auf die karte. ob du das ganze nun mit
einem RTOS realisierst oder mit interrupts spielt dann fast keine rolle
mehr.
Also ganz spontan würd ich ARM vorschlagen. SD/MMC Treiber inkl.
FAT16/32 Unterstützung kannst du runterladen und in etwa einer Stunde
auf deinem System zum Laufen bekommen. AT91SAM7S hat USB onboard, also
hast auch eine relativ schnelle Verbindung zu einem PC um die Daten hin
und her zu schaufeln.
Für ARM kannst das FreeRTOS verwenden. Wennst du IAR Embedded Workbench
verwendest, kannst das IAR Projekt 1:1 von FreeRTOS nehmen ohne
irgendwelchen Code anzupassen (abgesehen von Pinbelegungen etc.).
Eine Verbindung über Ethernet wäre auch sehr interessant.
Und wie wäre es mit dem Proppeller Chip von Parallax? ein Chip der quasi
8 CPU's enthält und 32 freie IO-Pins.
Multithreading für Microcontroller
Programmiert wird er über eine einfache serielle Schnittstelle, die
Software frei, es gibt hunderte Objekte ( Bibliotheken), auch für
SD-Card und diverse AD-Wandler und die eigene Programmiersprache (Spin)
einfach.
Der Haken 15€ kostet der Spaß mindestens
ein AVR schaffz 15 kS/Sek bei 200kHz ADC Takt wobei bis zu 1 MHz möglich
sind was dann bei einer geringeren Auflösung 75 kS/Sek entsprechen
würde.
Compact Flash wäre auch eine interessante Speicherlösung, man könnte am
PC eine(oder mehrere) leere Datei erstellen die den gesamten Platz
benötigt(en), dann wäre das mit der FAT erledigt und mit dem µC schreibt
man halt nur in die Dateien selber ohne deren Größe zu ändern, dann
wären keine Änderungen an der FAT nötig. Vorteil man kann 16bits
gleichzeitig schreiben und das mit sehr wenig Overhead. Und Adresszähler
kann man ja mittels mehrerer Register nachbilden.
ein Beispiel dazu http://www.pjrc.com/tech/8051/ide/wesley.html wobei
man statt des 8255 auch einfach ein paar Latches nimmt.
Und als Erweiterung könnte man noch nen 16:1 Multiplexer nehmen 744067
und dann kann man gleich 16 Analoge Spannungen messen.
Die Displayansteuerung würde ich aber auch auslagern also nur die Daten
an einen 2ten µC schicken de sich dann um das Display kümmert.