Ich habe einen fehler, stehe aber total auf dem schlauch

Gast #1080330
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.
Angehängte Dateien:
Gast #1080398
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
Persönliche Seite #1081843
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.
Gast #1083864
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.
Angehängte Dateien:
#1083928
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren