Forum: Mikrocontroller und Digitale Elektronik Ich habe einen fehler, stehe aber total auf dem schlauch


von Fred (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Weil Du in "sr5" den "pop" bedingt aufrufst, läuft irgendwann Dein Stack 
über.....

Otto

von Fred (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

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

von Fred (Gast)


Lesenswert?

Hat das Problem nicht wirklich gelöst. Es könnte also noch woanders 
liegen.

von spess53 (Gast)


Lesenswert?

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

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hier nochmal der etwas entwurschtete Code.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Fred (Gast)


Lesenswert?

Habe es gefunden. Am Ende des radix algorithmuses ist ein pop zu wenig.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Michael D. (Gast)


Lesenswert?

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

von Frederik R. (micromorpheus)


Lesenswert?

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.

von Frederik R. (micromorpheus)


Angehängte Dateien:

Lesenswert?

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