Hallo, ich habe mir eine kleine FFT gebastelt und lasse die werte auf einem LCD ausgeben, allerdings hat sich irgendwo ein fehler eingeschlichen, den ich aber nicht erblicke. Dieser äußert sich so, dass nach ein paar sekunden, die Werte auf dem Display nicht mehr aktualisiert werden. Meine Vermutung lag bezüglich dem Code für die Anzeige, allerdings funktioniert dieser einwandfrei bei anderen sachen. Jetzt muss das irgendwie mit dem code für die tranfsormation zusammenhängen, allerdings bin ich im avr Studio dem fehler nicht auf die schliche gekommen und bin immer noch dabei, vielleicht hängt das aber nur mit einem oder zwei registern zusammen, die ab einem bestimmten wert aus ADC mist bauen, oder der ADC läuft nicht korrekt. Iczh bin für jede Hilfe dankbar, zumal ich das projekt vor meinem Studium angefangen habe und es nun endlich korrekt zum laufen bringen möchte.
Weil Du in "sr5" den "pop" bedingt aufrufst, läuft irgendwann Dein Stack über..... Otto
Jo danke, werde es gleich mal ausprobieren, der push und pop ist sowieso überflüssig gewesen, ich denke, dass ich über weihnachten dann mal den code entmüllen werde.
Da Du keine Interrupts verwendest, wo man gerne mal ein Register vergisst, wird es an diesen liegen - ausmisten schadet nie und achte darauf, für jedes "push" unbedingt (im wahrsten Sinne des Wortes !) immer ein "pop" zu verwenden. Gruss Otto
Hat das Problem nicht wirklich gelöst. Es könnte also noch woanders liegen.
Hi Bei deiner sehr minimalistischen Verwendung von 'push' und 'pop' in Unterprogrammen würde es mich nicht wundern wenn du irgendwelche relevante Register überschreibst. MfG Spess
Hier nochmal der etwas entwurschtete Code.
Ist wohl ein Stackproblem (igitt) und ein Berechnungsproblem (übel) und man kann beides im AVR Studio simulieren (yammi). Der Ersatzcode für "ADC Werte" ist z.B. messen: ; START ERSATZ nop ; hier BREAKPOINT ldi r16, 0x00 ldi r17, 0x01 ; oder 0x03 oder 0x12 oder 0x00 ret ; ENDE ERSATZ sbi ADCSRA,6 ;Starte Konversation messen2: sbic ADCSRA,ADSC ;Springe wenn Konversation beendet rjmp messen2 in r16,adcl in r17,adch ret Dann die IO-View Processor aufmachen und laufend F5 (RUN). Der Stackpointer ist beim ersten Break 0x25D und sinkt dann alle 8. Mal beim drücken von F5 um eins. Irgendwann häckselt der Stackpointer dann im IO-Bereich rum. Beim 7. => 8. Mal vergeht eine längere Zeit in der Simulation, scheint eine Berechnung zu sein. Verwendet man anderen Ersatzcode (andere ADC Werte) z.B. messen: ; START ERSATZ nop ; hier BREAKPOINT ldi r16, 0x00 ldi r17, 0x02 ret ; ENDE ERSATZ vergeht beim 7. => 8. Mal sehr viel Zeit in der Simulation. Wenn man dort break macht, steckt die Simulation in der Berechnung einer Wurzel. wurzeldiv: ;a/xn sub r16,r7 sbc r17,r8 sbc r18,r9 sbc r19,r10 sbrc r19,7 rjmp wurzeldivend ; <== wird nicht ausgeführt inc r20 rjmp wurzeldiv und kommt nicht mehr raus (r10 und r19 sind 0x00). Man kann die Endlosschleife mit dem "falschen" ADC-Wert 0x02 nach r17 auslösen.
Das mit dem durch null dividieren ist selbst aufgefallen, allerdings ist mir das mit dem stackpointer etwas suspekt. Warum sollte der immer sinken, was er auch tut. Liegt das daran das ich da irgendwo mit den push und pop´s durcheinander komme??? Die aufrufe der unterprogramme sind alle korrekt, soweit ich das sehe.
Habe es gefunden. Am Ende des radix algorithmuses ist ein pop zu wenig.
Mir ist das mit dem Stackpointer auch suspekt, sehr suspekt. Deswegen hatte ich es dir beschrieben. Damit du dort nachschaust. Kannst du das Problem an sich sehen oder tritt das Problem bei dir nicht auf? ADD: Ende gut alles gut.
Hallo Fred! Hast du zufällig ein Video von der laufenden FFT? Gibts zu dieser FFT evtl auch einen Pseudo Code oder eine nähere Beschreibung? Möchte sie gerne für den 8051 umsetzen.. Danke und Lg, Mike
Bin jetzt auch mal hier angemeldet. Die FFT ist einfach ein radix2 algorithmus, bei google einfach radix2 eingeben und dann bei den bildern oder links schauen. Wie ich das jetzt umgesetzt habe, kann ich noch mal ausführlicher posten. Das einzig "tricky" an der ganzen Sache ist, die Zählregister zu Verwalten, die auch die Werte für die Sprünge bei den Ram Addressen liefern sollen, dann braucht man die Daten nur noch am ende zu sotieren, was ich aber noch nicht geschrieben habe.
Ich werde am Wochenende dann eine Dokumentation machen, wenn das erwünscht ist.
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.