Auch wenn es (wahrscheinlich) schon tausendmal behandelt wurde:
Ich verwende ein Holger Klabunde FATSingleOPT und eine 128 MB SanDisk SD
Karte. Das Ganze steckt mit einem ATmega32 zusammen, 11,0592 MHz
Quarzgetaktet und mit Widerständen zur Pegelanpassung auf einem Olimex
AVR P40-8535-8Mhz (Quarz habe ich getauscht) Board.
Nun versuche ich die ganze Zeit, nacheinander die Werte der ADC-Kanäle
auf die SD Karte zu schreiben.
Format: Kanal (x), Wert (ADC-Wert)
Auf der Karte, in meiner Datei werte.txt steht dann:
Kanal (2 cryptische Zeichen) Wert: (cryptische Zeichen)
Parallel werden die Werte über den USART ausgegeben und da klappt es.
Muß ich für die Werte auf die Karte zuschreiben, diese auch in ASCII
Wandeln oder mache ich da einen anderen Fehler in der Wandlung, Takt,
sonstiges ???
Wenn ich 30 x in der Sekunde alle Werte, aller ADC-Kanäle auf die Karte
schreiben will, geht das überhaupt mit 11,0592 MHz Systemtakt ??
Helft mir mal kurz, ich bin nun schon so stolz auf mich, das ich die
Klabunde Methode für die FAT verstanden habe ... Aber den Durcheinander
mit den Zeichen statt Zahlenwerten, kann ich mir irgendwie nicht
erklären.
Ein verzweifeltes Problemkind
Dann werde ich wohl die Ausgabe für den USART mal in einer globalen
Variablen unterbringen und die Wandlung Double --> ASCII in main machen.
Hatte ich schon mal, aber muß mich dann wohl noch einmal richtig damit
beschäftigen.
Kannst Du mir dann evtl noch die Frage mit den 30 x 10 Bit pro Sekunde
und ob das bei 11,0592 MHz funktionieren kann beantworten ?
Danke.
Das Problemkind
Was ist Double-Integer?
(Char, Integer, Long-Integer, Single-Float, Double-Float, alles signed
oder unsigned...)
Wenn Du die Daten roh auf die Karte schreibst, dann muss sie das
PC-Programm beim Lesen umwandeln. Das geht dann natürlich nicht mehr mit
einem einfachen Texteditor.
Willst Du die Daten schon in ASCII von der Karte lesen, dann musst Du
sie auch in ASCII auf die Karte schreiben. Aber auch hier kannst Du viel
optimieren. Du hast 2 Bytes (Integer?) für den Kanal. Dafür reicht eines
(Char). Du hast mehrere Bytes für den Wert (vermutlich Double-Float?,
was das "Double" im Betreff erklären würde), da reichen zwei Bytes
(Integer). Wenn der Speicherplatz knapp wäre, könnte man Kanal und Wert
sogar in einem Integer zusammenfassen (untere 10 Bit für Wert, obere 3
Bit für Kanal, bleiben sogar 3 Bits übrig).
Wenn Du sinnvolle Datentypen einsetzt und die Umwandlung selbst machst
(ItoA oder ganz ohne Funktionen der Standard-Lib), dann solltest Du das
in der vorgegebenen Zeit schaffen.
Heute morgen auf der Arbeit habe ich in der Pause noch einmal das
Problemchen auf den Tisch genommen.
Double-Integer stimmt ja gar nicht (das wären 32 Bit nach Step 7
Konventionen) es muß float heißen ...
Die Werte sollen im Klartext z. B. so auf der Karte sein:
Kanal 1, Wert 4.589 Volt
Kanal 2, Wert 2350 1/min
Kanal 3, Wert 22,345 A
Kanal 4, Wert 23,56 Grad
Kanal 5, Wert 1,5 ms
So zum Testen ...
Später, wenn ich dann das PC Programm in Angriff nehme, dann sollen die
Werte so geschrieben werden:
Datensatz Fahrt 1
Zeit Spannung RPM Strom Temp Steuer
0.000 , 4.589 , 2350 , 22.345 , 23.56 , 1.501
0.033 , 4.589 , 2351 , 22.346 , 23.56 , 1.550
...
Ich habe mal dtostr aus der avr-libc hergenommen und damit die Daten
geschrieben, aber da scheint die Zeit nicht zu reichen, weil nur noch
Müll auf der Karte steht.
Kann das an den 11,0592 MHz liegen ?
Problemkind
>0.000 , 4.589 , 2350 , 22.345 , 23.56 , 1.501
Hast du eigentlich schon mal angedacht, dass ein AVR keine FPU hat?
Der rechnet intern alles in chars (so heissen Bytes in C)!!
>Kann das an den 11,0592 MHz liegen ?
Ja.
Du scheinst hier alles in Float oder besser noch in Double
(was zum Glück beim WinAVR dasselbe ist) zu rechnen.
Da wird der garantiert langsam, aber daran bist du selbst schuld.
Nimm Fliesskommazahlen auf dem AVR nur für spezielle Problemfälle,
wo es gar nicht anders geht.
Dann muss ich das Projekt noch einmal neu überdenken ...
Das der AVR keine FPU hat, weiß ich. Das es so viel ausmacht, hätte ich
aber nicht gedacht. Der AVR muß doch "nur" 4 x einen 3-Satz rechnen.
Steuer ist eine Impulslämge zwischen 1 und 2 ms in µsec.
Ich werde dann den Lösungsansatz mal neu machen und die Umrechnung im PC
Programm (Erst einmal eine OpenOffice Calc Tabelle) erledigen.
Dann schreibe ich die Ergebnisse der AD-Wandlung einfach durch Komma
getrennt auf die Karte und rechne in der Tabelle. Alternativ lasse ich
die USART Kommuniktation raus und verpasse dem ATmega 32 einen 20 MHz
Quarz. Das sollte dann evtl. auch das Geschwindigkeitsproblem lösen ...
hoffe ich.
Kaum das man mal ein etwas komplexeres Problem angeht, schon ist man
Hinten und Vorne angeschmiert ... Aber schön das man geholfen bekommt.
Danke an Alle bisher.
Das Problemkind