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
Kryptische Zeichen ist logisch, schaus dir mal mit nem Hexeditor an. Müsste rein theorethisch der Wert sein. Byte 1 *1 + Byte 2 * 256
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
Das Zauberwort heißt Festkomma-Arithmetik!!! Einfach mal im Forum suchen... Totti
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.