Forum: Mikrocontroller und Digitale Elektronik Kleines Verständnisproblem mit SPI, FAT und Double Integer


von Problemkind (Gast)


Lesenswert?

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

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Kryptische Zeichen ist logisch, schaus dir mal mit nem Hexeditor an. 
Müsste rein theorethisch der Wert sein. Byte 1 *1 + Byte 2 * 256

von Problemkind (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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.

von Problemkind (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>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.

von Problemkind (Gast)


Lesenswert?

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

von Thorsten W. (tottiw)


Lesenswert?

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
Noch kein Account? Hier anmelden.