mikrocontroller.net

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


Autor: Fred (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

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

Otto

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal der etwas entwurschtete Code.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es gefunden. Am Ende des radix algorithmuses ist ein pop zu wenig.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael D. (xaero80c51)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frederik Riedel (micromorpheus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frederik Riedel (micromorpheus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich werde am Wochenende dann eine Dokumentation machen, wenn das 
erwünscht ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.