Hallo,
ich hab da ein Problemchen.
Und zwar möchte ich die FFT-Routine von Elm-Chan verwenden und zwar
unter CodeVisionAVR
Fixed-point FFT routines for megaAVRs, (C)ChaN, 2005
Das funktioniert unter Eclipse/WinAVR auch super soweit ...
Frequenz messen und auf Display wiedergeben, alles wunderbar.
Habe mein restliches Programm so weit wie ich konnte an Codevision
angepasst,
doch stoße ich bei dem Assembler-Teil an meine Grenzen.
Hier mal ein Code-Schnippsel aus der ffft.S wie ich sie unter Eclipse
einfach nutze.
Im Header ffft.h
1 | void fft_output (complex_t *, uint16_t *);
|
Im Assembler-File ffft.S
1 | .global fft_output
|
2 | .func fft_output
|
3 | fft_output:
|
4 | pushw T2H,T2L
|
5 | pushw T4H,T4L
|
6 | pushw T6H,T6L
|
7 |
|
8 | ;...
|
9 | ;BLABLABLABLABLABLABLA
|
10 | ;...
|
11 |
|
12 | popw T4H,T4L
|
13 | popw T2H,T2L
|
14 | clr r1
|
15 | ret
|
16 | .endfunc
|
Das der CodeVision-Compiler nicht einfach so das Assembler-File frisst
ist mir auch klar,
aber wie hab denn die ffft.S anzupassen, so dass es funktioniert?
Die CodeVision-Hilfe brachte ein Beispiel, welches so auch ganz
plausibel erscheint.
1 | // function in assembler declaration
|
2 | // this function will return a+b+c
|
3 | #pragma warn- // this will prevent warnings
|
4 | int sum_abc(int a, int b, unsigned char c) {
|
5 | #asm
|
6 | ldd r30,y+3 ;R30=LSB a
|
7 | ldd r31,y+4 ;R31=MSB a
|
8 | ldd r26,y+1 ;R26=LSB b
|
9 | ldd r27,y+2 ;R27=MSB b
|
10 | add r30,r26 ;(R31,R30)=a+b
|
11 | adc r31,r27
|
12 | ld r26,y ;R26=c
|
13 | clr r27 ;promote unsigned char c to int
|
14 | add r30,r26 ;(R31,R30)=(R31,R30)+c
|
15 | adc r31,r27
|
16 | #endasm
|
17 | }
|
18 | #pragma warn+ // enable warnings
|
19 |
|
20 |
|
21 | void main(void)
|
22 | {
|
23 | int r;
|
24 | // now we call the function and store the result in r
|
25 | r=sum_abc(2,4,6);
|
26 | }
|
Kann ich aus dem ffft.S-File einfach eine ffft.c-Datei machen und die
Funktionen,
wie in der Hilfe beschrieben umschreiben?
Wenn ich ehrlich bin hab ich das auch schon versucht, aber da hat er
rumgemeckert wegen
fehlender Namen der Funktionsparameter ... ich kann doch da nicht
irgendwas X-beliebiges reinschreiben oder?
Bin über jeden Denkanstoß dankbar
Grüße