Sorry aber mit so wenigen Infos und ohne Code zu posten wird dir hier wohl kaum jemand helfen können.
Guten Morgen,
vielleicht könnt ihr mir bei diesem kleinem Problem helfen! Ich muss Messdaten, welche in der Hauptschleife erstellt werden, in definierten Zeitabständen auf eine Sd Karte speichern. Dazu benutze ich einen Timer der mit 25hz läuft.
Eigentlich sollten dann nach 2 min 3000 Einträge auf der Karte gespeichert sein. Dies stimmt aber leider nicht...
Wisst ihr wo das Problem sein könnte?
Danke schonmal für eure Hilfe.
Gruß,
Patrick
Sorry aber mit so wenigen Infos und ohne Code zu posten wird dir hier wohl kaum jemand helfen können.
It is a job that is never started that takes the longest to finish - J.R.R. Tolkien
KÖNNTE: Vermutlich speicherst Du in der ISR *baaa* oder 25 x Abspeichern dauert länger als 1 sec, oder Speichertiming stört Karte, oder oder oder. Aber natürlich hat maw_hn recht: warum sollen wir viel schreiben, wenn Du zu faul bist, eine ausführliche Fehlerbeschreibung zu geben? Siehe Forumregel Nr 5 - weißt Du was in den Forumregeln steht?Zitat von helipaddi
Ciao sagt der JoeamBerg
Da meine Glaskugel in Reparatur ist, schließe ich mich maw_hn an:
Mehr Infos bitte!
- bitte Quellcode der main und der Timer-ISR posten.
- Hast Du schon mal nachgemessen, ob der Timer wirklich mit 25Hz läuft?
- Wieviele Werte werden denn auf der SD-Karte gespeichert?
- Werden vielleicht schon gespeicherte Werte durch nachfolgende wieder überschrieben?
Gruß,
askazo
Hab den Quellcode leider gerade nicht hier. Werde ihn heute Abend aber hochladen. Im Prinzip passiert aber auch nicht viel. In der Hauptschleife werden 4 16bit Integer eingelesen welche als PWM in den MC kommen. Im Interrupt werden diese dann mit Hilfe von itoa auf die Karte geschrieben. Zusätzlich wird auf dem Display noch angezeigt wie viele Zeilen schon geschrieben wurde. Daher weis ich auch, dass der Timer viel zu langsam läuft. Den Timervorlade Wert setze ich am Anfang der ISR Routine.
Werde ich heute Abend mal machen! Kann mir aber nicht vorstellen, dass er falsch läuft, da ich schon den internen RC und einen externen Quarz benutzt habe.Zitat von askazo
Zitat von helipaddi
Irgendwie widersprichst Du Dir gerade selber....
Hier jetzt mal die relevanten Codeauschnitte:
Code:ISR(TIMER1_OVF_vect) { TCNT1 = 25536; rcFunktion1 = (rcChannel1-Stick_min-Stick_diff); rcFunktion2 = (rcChannel2-Stick_min-Stick_diff); rcFunktion3 = (rcChannel3-Stick_min-Stick_diff); rcFunktion4 = (rcChannel4-Stick_min-Stick_diff); //Kanäle auf SD schreiben ffwrites(itoa(rcChannel1, buffer1, 10)); ffwrite(':'); ffwrites(itoa(rcChannel2, buffer2, 10)); ffwrite(':'); ffwrites(itoa(rcChannel3, buffer3, 10)); ffwrite(':'); ffwrites(itoa(rcChannel4, buffer4, 10)); ffwrite(0x0D); ffwrite(0x0A);Code:while (1) { rcChannel1 = pwmIn(&PIND, PD6); rcChannel2 = pwmIn(&PIND, PD5); rcChannel3 = pwmIn(&PIND, PD4); rcChannel4 = pwmIn(&PIND, PD3); }Der AVR läuft mit 16mHz.Code:TCCR1B = (1<<CS11);
Wenn ich richtig gerechnet habe, wird Deine ISR alle 20ms aufgerufen, was einer Frequenz von 50Hz entspricht. ( (65536 - 25536) * 62,5ns * 8 = 20ms)
Du machst übrigens ziemlich viele Funktionsaufrufe in der ISR. Ich weiß nicht, wieviel Takte so ein itoa oder ffwrites benötigt, aber da könnte schon einiges zusammenkommen. Du solltest auf jeden Fall mal prüfen, ob Du die ISR überhaupt schnell genug abarbeiten kannst.
Ups, hatte den Timer bewusst auf 50hz eingestellt, um zu testen wie hoch die Abweichung ist.
Habe mal ungefähr gezählt wie viele Takte ich benötige. Sollte eigentlich in der Zeit kein Problem sein... Ausserdem ist die Ungenauigkeit auch bei z.B. 10hz vorhanden.
Habe den Timer jetzt wieder auf 50hz eingestellt. Eigentlich sollte dann nach einer Minute der Counter bei 3000 sein, er kommt aber nur bis 1350. Bei 10hz oder 25hz das gleiche.
Lesezeichen