Mittels des Motorola DSP 56000 soll aus einem Musiksignal die Sängerstimme ausgefiltert werden und mit einer Modulation in einen anderen Freuqenzbereich transportiert werden. Danach soll dies wieder dem Originalsignal beigemischt werden. Die Schaltung soll mittels PIC angesteuert werden und die Anzeige auf ein LC-Display gebracht werden.
The vocals of a music-signal should be filtered out and pitched with the Motorola DSP 56000. This is mixed to the original signal. The whole DSP should be controlled via a PIC and the output displayed on a LCD.
Nachdem wir auf den PCs die nötige Software installiert hatten, arbeiteten wir uns in die DSP-Dokumentation ein. Dazu verwendeten wir ein fertiges Programm von Motorola mit einem Echo-Effekt. Auch kleine Änderungen die wir im Programm vornahmen funktionierten.
Als erstes eigenes Programm wurde uns aufgetragen aus einem kleinen Programm-Code Stück und dem Beispielprogramm einen FIR-Filter zu programmieren. Der funktionierte eigentlich auch recht bald, aber es war immer ein metallisches Geräusch im Ausgangssignal. Nach langer Fehlersuche mußten wir entdecken, dass der Fehler nicht an uns lag, sondern an einem groben Fehler im original Motorola Code-Stück. Nachdem wir den Fehler ausgebessert hatten funktionierte das Programm endlich so wie es sollte.
Deshalb verbanden wir die beiden Programme auch gleich zu einem FIR-Filter mit Echo.
Dies war dann auch eine gute Ausgangslage um unsere ersten Versuche mit der PIC-Steuerung zu machen. Wir nahmen als Grundlage eine Schaltung von einem alten Maturaprojekt und passten es an unsere Erfordernisse an. Die Kombination von FIR-Filter mit Echo und PIC und LCD Steuerung präsentierten wir am Tag der offenen Tür.
Danach machten wir uns an den Modulationsfilter. Zuerst sahen wir uns ihn in der Theory mit Matlab an und berechneten auch die Koeffizienten für den Hilbert-Transformator. In der Praxis benötigten wir Sinus und Cosinus-Werte weshalb wir zuerst einmal die fertige Tabelle die Motorola in den DSP integriert hat zum Versuch am Lautsprecher ausgaben. Damit konnten wir dann die nötigen Berechnungen durchführen. Wir realisierten den Hilbert-Transformator am DSP hatten aber am Anfang noch einige Probleme, da wir einen Fehler in unserem Code hatten.
Nachdem wir den Modulationsfilter fertig hatten verknüpften wir ihn mit einem Bandpass um nur die Frequenzen, die für ein Sängersignal interessant sind, zu modulieren. Wir mussten nur noch die PIC-Steuerung und den Interrupt-Handler am DSP an den Hilbert-Transformator anpassen um das Projekt fertigzustellen.
Hier und da könnten noch einige Verbesserungen vorgenommen werden die sich aber leider zeitmässig nicht mehr ausgehen. Deshalb schliessen wir das Projekt in diesem Zustand ab.
After we installed the needed Software on the Projet-PCs, we began to read the DSP-Documentation. We used a ready-to-go Demo-Program from Motorola with an echo-effect. We made some changes on this code and it still worked.
For our first own Program we were told to make a complete FIR-Filter based on a small code fragment from Motorola. We finished this task fast, but the signal was muffled. After a long Bughunt we discovered, that it was not our fault. The bug was in the original Motorola-Code. After we corrected the bug the filter worked as excpected.
Based on these two codes we made a filter with echo-effect to train our skills.
With this filter we began our first steps with the PIC. We made a board based in the design from an class before us. We presented our combination of DSP, PIC and LCD on the "tag der offenen tür".
After that we began with the modulationfilter. At the beginnig we tested some modulationfilter in theory with Matlab and calculated a hilbert transformator. For the DSP we needed its internal sinus-table and so we made a program to get to know how this works. With that know-how we realized the program for the modulationfilter, but we had some problems because we made a bug in our code.
Then we took the the Bandpass and filtered the singer before the modulationfilter. We just had to adjust the PIC-control a little bit to use it with the new filter.
The project is now finished. If we had more time we could change some things to do it better.
Matlab ist eine Mischung aus Kommandozeilen-Tool (ähnlich einer Shell) und
eine Programmiersprache, wie zum Beispiel C. Dabei ist es auf die Anforderungen
für mathematische Funktionen zugeschnitten und hat auch einfach verwendbare
Grafikfunktionen.
Wir verwenden Matlab um die Koeffizienten unserer Filter zu
berechnen und eine grafische Übersicht über die Funktion
der Filter zu bekommen.
[B,A]=ellip(N,Rp,Rs,Wn,...) N - die Ordnung Rp - Welligkeit im Db [dB] Rs - Dämpfung im Sb [dB] Wn - Grenzfrequenz (bei Digi. [0;1] - 1 = Samplingfrequenz/2) analog: irgendwie in Hertz bsp: ellip(N,Rp,Rs,Wn,'s')
[H,w]=freqs(B,A,N) B,A - Polynome vom Filter N - Anzahl gerechneter Punkte
siehe freqs
plot(x,y) x,y - Punkte für die Achsen bsp: plot(w/pi,20*log10(abs(H)))
zeile y - alle spalten
[B]=remez(N,Wn,A[,filterart]); N - die Ordnung Wn - Grenzfrequenz (bei Digi. [0;1] - 1 = Samplingfrequenz/2) A - Amplitude [0;1] filterart - optional: zB 'HILBERT' für einen Hilbertfilter
fh=fopen('lw:\some\path\filename', 'w'); fh - Filehandle w - Zugriffsart schreiben
fclose(fh); fh - Filehandle
fprintf(fh, formatstring, args); fh - Filehandle formatstring - zB: 'dc %1.8f\r\n' args - Argumente für %1.8f
Dies ist ein Tool, um den PIC mit dem JDM Programmer
zu programmieren. Man lädt einfach nur das HEX File welches man vorher
mit zB dem MPASMWin vom MPLab erstellt hat.
Danach ist darauf zu achten, dass die richtige COM Schnittstelle, und
der richtige Programmer eingestellt ist (in unserem Fall der JDM Programmer).
Nun ist noch, ausser dem richtigen Prozessor, auszuwählen, ob man Watchdog
benutzen will (wir nicht) und welcher Taktgenerator verwendet wird (in unserem
Fall wäre das XT für einen Quarzschwingkreis).
Der DSP56002 von Motorola ist heutzutage noch ein viel eingesetzter Digitaler Signal Prozessor. Die verschiedenen Einsatzzwecke erstrecken sich von Audio Anwendungen (in unserem Fall Echo, Hall, Stimmenverzerrung oder Equalizer), Codec Routinen, Einsatz in der Telefonie (DTMF Routinen, diverse Filterfunktionen, ISDN, ...), Funkübertragungen, Grafik und Bildverarbeitung (Bilderkennung) usw. bis zur Datenverschlüsselung und Einsatz in der Medizin
Wir benutzen das EVM56k Entwicklungsboard, welches als Herzstück den Motorola DSP56002
verwendet. Das Board besitzt mehrere Ein- und Ausgangsports (3 Stück), welche
teilweise zur Erweiterung dienen (um das Programm in einem externen Speicher
unterzubringen - EPROM) oder um mit externer Peripherie zu kommunizieren (PortB).
Weiters gibt es eine serielle Schnittstelle, über die der DSP im Entwicklungsstadium
programmiert und debugged wird.
Es sind auch 1 Audio Eingang (wahlweise Mikrofon oder Line - softwarekonfigurierbar)
vorhanden sowie 2 Audioausgänge (Line Out und Kopfhörer).
Das Board besitzt ebenfalls einen Festspannungsregler, um die Betriebsspannung
konstant zu halten und taktet den DSP mit 40 MHz.
Zur Entwicklung dienten Vorerst 486er DX4 Rechner @100 MHz und dem Betriebssystem Win95. Die Software zum Programmieren des DSP und zum Debuggen gibt es sowohl für DOS als auch für Windows. Jetzt befindet sich die Windows Version im Einsatz. Die Übertragungsrate zum DSP beträgt 19200 Baud. Der Assembler ist ein reines DOS Kommandozeilen Programm.
Der JDM Programmer wurde von uns selbst aufgebaut. Er wird von dem Programm ICProg
angesprochen und benötigt beim Programmieren keine zusätzliche Spannungsversorgung.
Dadurch kann es zu Problemen kommen, beim Einsatz mit Notebooks (Vermutung auf Grund
der niedrigeren Spannungspegeln der seriellen Schnittstelle).
Mit dem JDM Programmer kann der PIC 16F84 programmiert werden. Selbst der Takt wird
vom PC generiert.
Diese Platine dient dazu, den DSP Rechnerunabhängig zu Steuern. Gleichzeitig wird
auf dem LCD Display der Status angezeigt (in unserem Beispiel zB der Delta Wert).
Die Platine besitzt momentan 2 Taster, wobei einer für die Menüauswahl zuständig ist
und der andere für die Auswahl des jeweiligen Wertes. Gesteuert und verarbeitet werden
die ganzen Daten von einem PIC16F84. Weiters besitzt die Platine 4 Ausgangs I/O Ports
die mit dem DSP verbunden sind plus eine zusätzliche Leitung die den Interrupt am
DSP auslöst, falls neue Daten an den 4 Portpins anliegen.
Die Ansteuerung des Displays erfolgt mit Hilfe eines Schieberegisters. Dadurch sind
nur mehr 4 Portleitungen nötig und die restlichen 4 Portleitungen können für Taster
Eingaben benutzt werden.
Die Platine hat ebenfalls einen Festspannungsregler onboard, um Spannungsschwankungen
auszugleichen und eine exakte Gleichspannung zu liefern.
Jede Funktion in Matlab ist eine eigene Datei. Deshalb ist der gesamte Scriptcode auf 4 Dateien aufgespalten.
filterpass berechnet einen Remez-Filter. Mit dieser Funktion werden in tiefpass die Koeffizienten für ein Tiefpass-Filter berechnet. Die Funktion dofilter berechnet die Koeffizienten für den Hilbert-Transformator und das Verzögerungsglied, und speichert diese in y1.inc und y2.inc. Die Funktion gesamt erledigt mit Hilfe der anderen Funktionen die nötigen Berechnungen und gibt sie grafisch aus.
1: function [VAL] = filterpass(Sig, N, Freq, Ampl)
2:
3:
4: B=remez(N,Freq,Ampl);
5: VAL=filter(B,1,Sig);
1: function [VAL] = tiefpass(Sig, N, GrenzFreq)
2:
3: VAL=filterpass(Sig, N, [0 (GrenzFreq-0.1) (GrenzFreq+0.1) 1],[1 1 0 0]);
1: function [RE] = dofilter (Sig, N, Freq, n2) 2: 3: 4: B=remez(N,[.05 .95],[1 1],'HILBERT'); 5: Y1=filter(B,1,Sig); 6: V=zeros(1,N+1); 7: V(N/2+1)=1; 8: Y2=filter(V,1,Sig); 9: %% plot(abs(fft(Y2+j*Y1))) 10: RE=cos(Freq*n2).*Y2-Y1.*sin(Freq*n2); 11: 12: 13: fh=fopen('c:\temp\y1.inc', 'w'); 14: fprintf(fh, ';Hilbert Koeffizienten\r\n'); 15: fprintf(fh, ' dc %1.8f\r\n', B); 16: fclose(fh); 17: fh=fopen('c:\temp\y2.inc', 'w'); 18: fprintf(fh, ';Verzoegerungsglied\r\n'); 19: fprintf(fh, ' dc %1.8f\r\n', V); 20: fclose(fh); 21:
1: function gesamt
2:
3: T=[0:1:255];
4: s=zeros(1,256);
5: s(1)=1;
6: S=tiefpass(s,100,0.5);
7: plot(abs(fft(S)));
8: pause;
9: f=dofilter(S,100,pi/8,T);
10: plot(abs(fft(f)));
Der FIR-Filter selber multipliziert nur das Eingangssignal mit den einzelnen Koeffizienten und nimmt die Summe aus diesen Produkten. Die Hauptarbeit ist also die Berechnung der Koeffizienten und das wird in Matlab gemacht.
Beim Hilberttransformator werden zwei FIR-Filter benötigt (HT-Glied und Verzögerungsglied). Das Ergebniss wird nach
Re{} = yz[] * cos(f * n[]) - yHT[] * sin(f * n[]) berechnet.
Das DSP Programm besteht aus drei Teilen.
Im ersten werden die Initialisierungen vorgenommen. Hier sind die Konstanten definiert, die Register werden geladen und die Sinus-Tabelle wird aus dem ROM Bereich in die zweite Speicherbank geladen.
Der zweite Teil beinhaltet das Hauptprogramm. Die Samples werden mit den Subroutinen proceed_ht (Hilbert-Transformator) und proceed_filter (Bandpass) bearbeitet und wieder ausgegeben. Leider ist der Zeitaufwand so hoch, dass beim verwendeten DSP die Samplingfrequenz nur 16kHz beträgt.
Der letzte Teil ist die Interrupt-Routine. Es wird das am Port anliegende Datennibbel als Delta-Wert für den Hilbert-Transformator gespeichert.
1: opt rc ; Assembler Directive 2: 3: START equ $40 4: 5: 6: ;;**** fir init **** 7: n equ 100 ; N of filter (now in coeff-inc file) 8: wddr equ $100 ; samples offset in x memory 9: wddr2 equ $200 ; samples offset in x memory 10: cddr equ $100 ; coeffizidings offset in y memory 11: cddr2 equ $200 ; coeffizidings offset2 in y memory 12: cddr3 equ $500 ; coeff. for BP 13: tmp equ $800 ; temp var 14: aint equ $808 ; save a for int 15: bint equ $810 ; save b for int 16: x0int equ $818 ; save x0 for in 17: ;;**** end init **** 18: sin_ram equ $400 ; sine table in x:ram 19: sinep equ $100 ; when de=1 in omr -> $100 sinetable in rom 20: mask equ 255 ; 255 values in m-register 21: ;; delta equ 2 ; delta value for sine 22: intmem equ $620 23: 24: org x:intmem 25: delta bsc 4,$0 ; Delta Value in memory 26: 27: org x:wddr ; Reserved Memory for 28: smpl bsc 512,$0 ; Samples 29: 30: org y:cddr ; Hilbert 31: include 'y1.inc' ; Coeffs. (e.g. Include File) 32: 33: org y:cddr2 ; z(k-1) 34: include 'y2.inc' ; Coeffs. 35: 36: org y:cddr3 ; HP 37: include 'hp.inc' ; coeff. 38: 39: org x:sin_ram ; Sine Values 40: sintab bsc 256,$FF ; 256 Values (0 to Pi) 41: 42: org p:0 ;RESET Vector 43: jmp START 44: 45: org p:$0008 46: jsr interrupt 47: 48: org p:$000C 49: jsr ssi_rx_isr ;SSI RX 50: jsr ssi_rx_isr ;SSI RX w/Exception 51: jsr ssi_tx_isr ;SSI TX 52: jsr ssi_tx_isr ;SSI TX w/Exception 53: 54: org p:START 55: 56: 57: include 'ada_init.asm' ; init codecs for DSP 58: 59: movep #$261009,x:PLL ; set PLL for MPY of 10x 60: movep #$0000,x:BCR ; zero wait states in all ext. memory 61: ori #3,mr ; disable interrupts 62: movec #0,sp ; clear hardware stack pointer 63: move #0,omr ; mode 0: enable int. P:RAM, rst=0000 64: move #$40,r6 ; initialize stack pointer 65: move #-1,m6 ; linear addressing 66: 67: ;;irq a aktivieren 68: bclr #$8,SR 69: bclr #$9,SR 70: move #$3003,a0 71: move a0,x:IPR 72: 73: TONE_OUTPUT EQU HEADPHONE_EN+LINEOUT_EN+(4*LEFT_ATTN)+(4*RIGHT_ATTN) 74: TONE_INPUT EQU MIC_IN_SELECT+(15*MONITOR_ATTN) 75: 76: move #TONE_OUTPUT,y0 ; headphones, line out, mute spkr, no attn. 77: move y0,x:TX_BUFF_BASE+2 78: move #TONE_INPUT,y0 ; no input gain, monitor mute 79: move y0,x:TX_BUFF_BASE+3 80: 81: ;;**** sine init *** 82: move #sin_ram,r3 ; Set r3 for Sine-Values 83: move #mask,m3 ; Loop Mode 84: movec #6,omr ;mode 0: enable int. P:RAM, rst=0000 - 85: ;changed to enable the internal ROM 86: move #sinep,r1 ; Set r1 for Sine-Values in ROM 87: movec #mask,m1 ; Loop Mode 88: move x:delta,n3 ; Use delta 89: do #256,sine2ram 90: move y:(r1)+,a ; Get ROM sine values 91: move a,x:(r3)+ ; store in RAM 92: sine2ram 93: move #sin_ram,r3 ; Set r3 for Sine-Values 94: movec #2,omr ; disable int. P:RAM, rst=0000 - 95: ;changed to enable the internal ROM 96: ;;**** end sine **** 97: ;;**** fir init **** 98: move #wddr,r1 ; Samples Offset in Memory (x:r1) 99: move #wddr2,r2 ; Samples Offset in Memory (x:r2) 100: move #cddr,r4 ; Coeff. Offset in Memory (y:r4) 101: move #n,m1 ; initialise circular buffers with 102: move m1,m4 ; the value n-1 (but only used for r4) 103: move m1,m2 ; the value n-1 (but only used for r2) 104: ;;**** end fir ***** 105: ;;**** IRQ init *** 106: move #1,a ; initialize delta with 1 107: move a,x:delta 108: ;;*** end IRQ init *** 109: 110: opt cc ; Assembler-Directive for List Files 111: 112: loop ; Main Loop 113: jset #2,x:SSISR,* ; Wait for frame sync to pass. 114: jclr #2,x:SSISR,* ; Wait for frame sync. 115: 116: 117: move x:RX_BUFF_BASE,a ; get new samples left 118: move x:RX_BUFF_BASE+1,b ; get new samples right 119: add b,a ; a=a+b 120: asr a ; a/2 (half a) 121: move a,x:tmp 122: jsr proceed_ht 123: jsr proceed_filter 124: 125: move x:tmp,b 126: asr b 127: asl a 128: add b,a 129: 130: move a,x:TX_BUFF_BASE ; Put value in left channel tx. 131: move a,x:TX_BUFF_BASE+1 ; Put value in right channel tx. 132: 133: jmp loop ; jump to Main Loop 134: 135: proceed_filter ; My FIR Filter Procedure 136: move #cddr3,r4 137: 138: move a,x:(r2) ; store samples in buffer 139: clr a x:(r2)+,x0 y:(r4)+,y0 ; get samples and coeffs. 140: rep #n ; do filter- 141: mac x0,y0,a x:(r2)+,x0 y:(r4)+,y0 ; loop and mult. 142: macr x0,y0,a (r2)- 143: 144: rts 145: 146: proceed_ht 147: ;;HT 148: move #cddr,r4 ; set r4 to start at coeff 0 149: move #cddr2,r5 ; set r4 to start at coeff 1 150: move a,x:(r1) ; store samples in buffer 151: clr a x:(r1)+,x0 y:(r4)+,y0 ; get samples and coeffs. 152: clr b y:(r5)+,y1 153: do #n,filter_loop ; do filter- 154: mac x0,y1,b y:(r5)+,y1 155: mac x0,y0,a x:(r1)+,x0 y:(r4)+,y0 ; loop and mult. 156: filter_loop 157: macr x0,y0,a ; and last mult. with last coeff. 158: macr x0,y1,b (r1)- 159: 160: move #64,n3 ; Use delta ; load cosinus value 161: 162: move a,x0 163: move b,x1 164: 165: move x:(r3),y0 ; last blub of sinus 166: move x:(r3+n3),y1 ; last blub of cosinus 167: move x:delta,n3 ; Use delta ; load sinus value 168: mpy y0,x0,a 169: mpy y1,x1,b (r3)+n3 170: 171: sub b,a ; b=b-a (b=verz-ht) 172: 173: rts 174: 175: 176: include 'txrx_isr.asm' ; ISR's for in- and output 177: 178: interrupt 179: move a,x:aint 180: move b,x:bint ;save register 181: move x0,x:x0int 182: 183: move x:$FFE4,b ;get data from port B 184: move #$F0000F,x0 185: and x0,b ;mask lower nibble 186: 187: move b,x:delta ;save delta value 188: 189: move x:x0int,x0 190: move x:bint,b ;restore register 191: move x:aint,a 192: rti 193: 194: end
Der PIC wird mit 4 MHz getaktet. Er ist für die Steuerung des LC-Displays und für die Steuerung der Funktionen des DSP zuständig. Die Eingangsgrössen sind die beiden Taster, mit denen die zu ändernde Einstellung und der dazugehörige Wert gewählt wird.
Das PIC Programm gibt beim ersten Start den (C) Text aus. Dieser
wird durch einen Tastendruck gelöscht und der Status wird angezeigt.
Danach geht das Programm in eine Endlosschleife und wartet auf
Interrupts (die durch Tastendrücke - Highpegel an RB4 oder RB5 -
ausgelöst werden). Während des Wartens wird eine kleine Animation
abgespielt. Tritt nun ein Interrupt auf, wird nun ausgewertet, welcher
Taster betätigt wurde. Taster1 wählt die zu ändernde Einstellung, und
mit Taster2 läßt sich dann der gewünschte Wert einstellen.
Bei PIC_HT.ASM gibt es insgesamt 4 Menüpunkte, wobei nur der
Deltawert und der Hilbert On/Off Punkt implementiert wurde.
Nach jedem Tastendruck wird in der Interruptroutine die entsprechende
Aktion gesetzt (der Wert auf PortA geschrieben) und danach ein Interrupt
für den DSP ausgelöst (RA4). Schliesslich am Ende des Interrupts wird
mittels Aufruf von Routine menu das Display upgedatet.
Die Ausgabe am Display benutzt die Routine dataout, welche
die einzelnen Bits eines Bytes (dem Auszugebenden (Steuer)/Zeichen)
an das Schieberegister schickt und für jede Übernahme einen Taktimpuls
erzeugt. Wenn alle 8 Bits fertig geschickt sind, wird das Freigabe-Signal
geschickt und schliesslich das LCD Enable Signal zur Übernahme in das
Display erzeugt.
1: list p=16f84 2: 3: ;;------------------------------------------------------------------------ 4: ;; pic_ht.asm 5: ;; (C) by Leo Eibler 20001111 (mailto:leo@sprossenwanne.at) 6: ;; LU: 20010417 7: ;; DSP Project Site: http://blub2k.no-ip.com/dsp/ 8: ;;------------------------------------------------------------------------ 9: ;; Programm zum Ansteuern eines LC-Displays (Hitachi MC-162-2 in meinem 10: ;; Fall ;-) mittels eines PIC 16F84 (@4Mhz) 11: ;; gleichzeitig wartet das Programm auf Tastendruecke (sprich high-Pegel 12: ;; auf den Portleitungen RB4-RB7. Tritt so ein high-Pegel auf, springt 13: ;; das Programm in eine ISR. 14: ;; 20010402: Quellcode Grundgeruest von PIC_TST4.ASM uebernommen 15: ;; 20010403: Protokoll fuer den Transfer zum DSP angefangen zu implement. 16: ;; 20010415: da war ein call DSP_Int zuviel (im menu) 17: ;; 20010416: neue Zeitroutine fuer DSP_Int (zeit_5_ms1) weil sonst da DSP 18: ;; des net checkt ! 19: ;; 20010417: neues Konzept: Wenn Hilbert=OFF dann Wert 0 schicken, sonst 20: ;; einfach den Wert schicken, den die Delta Variable haben soll 21: ;;------------------------------------------------------------------------ 22: ;; kompiliert wurde das Programm mit 02.50.02 23: ;; geflasht mit IC-Prog 1.01 24: ;; Einstellungen: JDM Programmer, Oscillator XT, nothing else 25: ;;------------------------------------------------------------------------ 26: 27: status equ 03h 28: rp0 equ 05h ;SpeicherBank Auswahlbit 29: rp1 equ 06h ;SpeicherBank Auswahlbit 30: intcon equ 0Bh 31: porta equ 05h 32: trisa equ 85h 33: portb equ 06h 34: trisb equ 86h 35: sp1 equ 0Ch ;Zeichenausgabe 36: sp2 equ 0Dh ;Zeichenausgabe 37: sp3 equ 0Eh ;Delay Schleife 38: sp4 equ 0Fh ;Delay Schleife 39: sp5 equ 10h ;Entprell-Delay-Schleife 40: sp6 equ 11h ;Entprell-Delay-Schleife 41: sp7 equ 12h 42: sp8 equ 13h 43: sp9 equ 14h ;EnableInt,Outstate 44: sp10 equ 15h ;Gerade ausgewaehlte Variable/flag 45: sp11 equ 16h ;Delta Wert (n) fuer Hilbert 46: sp12 equ 17h 47: sp13 equ 18h ;HT=Bit0, FIR=Bit1 48: 49: ;;------------------------------------------------------------------------ 50: 51: org 00h ; Reset Vector 52: goto start 53: 54: ;;------------------------------------------------------------------------ 55: ;; ISR's 56: 57: org 004h ; Startvector (Interrupt) 58: 59: btfss sp9,7 ; Bit7 auf 0: 60: goto end_isr ; Interrupt sofort beenden 61: 62: call Entprellen 63: 64: btfsc portb,4 ; Taster an RB4 betaetigt 65: goto a1 66: 67: btfsc portb,5 ; Taster an RB5 betaetigt 68: goto a2 69: 70: goto aout ; anscheinend nix von beiden ;-) 71: 72: 73: 74: a1: ; high-Pegel an RB4 75: movfw sp10 ; sp10 (Auswahl) laden 76: sublw 1 77: sublw 0 78: btfsc status,2 ; is das ergebnis 0 ? 79: goto chg_delta ; ja, also Auswahl=Delta 80: sublw 1 81: sublw 0 82: btfsc status,2 ; is das ergebnis jetzt 0 ? 83: goto chg_htflag ; ja, also Auswahl=HTFlag 84: sublw 1 85: sublw 0 86: btfsc status,2 ; is das ergebnis jetzt 0 ? 87: goto chg_bpflag ; ja, also Auswahl=FIRFlag 88: goto chg_nothing ; 4te Auswahl nicht implementiert 89: 90: chg_delta: 91: incf sp11,1 ; sp11 92: movfw sp11 ; sp11 (Auswahl) laden 93: xorlw 0Eh ; Haben wir schon 9 Werte durch ? 94: btfsc status,2 ; pruefen: is das ergebnis 0 ? 95: clrf sp11 ; ja, wieda bei 0 anfangen 96: 97: movfw sp11 ; sp11 (delta wert - n) laden 98: bsf porta,4 ; kein DSP Interrupt 99: addlw 1 ; Wir uebertragen einen Wert >0 100: iorlw b'00010000' ; das 4. bit muss unbedingt 1 sein 101: movwf porta ; n auf porta schreiben 102: call DSP_Int ; DSP Interrupt ausloesen 103: bsf sp13,0 ; Hilbert Flag einschalten 104: goto chg_nothing 105: 106: chg_htflag 107: btfss sp13,0 ; ist hilbertflag gesetzt ? 108: goto set_htflag ; is net gsetzt, jetzt setzen ! 109: bcf sp13,0 ; is scho gsetzt, jetzt loeschen 110: movlw 0 ; fuer DSP: Delta Wert 0 (Hilbert aus) 111: iorlw b'00010000' ; das 4. bit muss unbedingt 1 sein 112: movwf porta ; und auf port schreiben 113: call DSP_Int ; DSP Interrupt ausloesen 114: goto end_htflag 115: set_htflag 116: bsf sp13,0 ; Hilbert eingeschalten - also 117: movfw sp11 ; derzeitigen Delta Wert laden 118: bsf porta,4 ; kein DSP Interrupt 119: addlw 1 ; fuer DSP: Delta Wert >0 120: iorlw b'00010000' ; das 4. bit muss unbedingt 1 sein 121: movwf porta ; n auf porta schreiben 122: call DSP_Int ; DSP Interrupt ausloesen 123: end_htflag 124: goto chg_nothing 125: 126: chg_bpflag 127: btfss sp13,1 ; ist firflag gesetzt ? 128: goto set_bpflag ; is net gsetzt, jetzt setzen ! 129: ; nicht implementiert im Moment (FIR Flag loeschen) 130: bcf sp13,1 ; is scho gsetzt, jetzt loeschen 131: goto end_bpflag 132: set_bpflag 133: bsf sp13,1 134: ; nicht implementiert im Moment (FIR Flag setzen) 135: end_bpflag 136: goto chg_nothing 137: 138: 139: chg_nothing: 140: call menu ; Menu anzeigen bzw. updaten 141: goto aout 142: 143: a2: ; high-Pegel an RB5 144: incf sp10,1 ; sp10 (=Auswahl) 145: btfsc sp10,2 ; ist er scho bei 4? 146: clrf sp10 ; ja -> wieda auf 0 setzen 147: call menu ; Menu anzeigen bzw. updaten 148: goto aout 149: 150: aout: ; da ein Interrupt ausgloest wurde, 151: bsf sp9,6 ; Bit 6 setzen (debug) 152: end_isr: 153: bcf intcon,0 ; PortChangeInterruptFlag rueckset. 154: retfie 155: 156: ;;------------------------------------------------------------------------ 157: start: 158: bcf sp9,6 ; debug bit fuer Interrupt 159: bcf sp9,7 ; keine Interrupts erlauben 160: 161: movlw b'11110000' ; RB0-3 auf Ausg. RB4-7 auf Eing. 162: tris portb ; TrisRegister mit altem Befehl set 163: 164: movlw b'00000000' ; RA0-3 auf Ausgang 165: tris porta ; TrisRegister mit altem Befehl set 166: 167: bcf portb,2 ; LCD: Instruction Code 168: bcf portb,3 ; LCD: Enable Signal 169: bsf porta,4 ; RA4 (DSP-IRQ Leitung) auf High 170: 171: movlw 0h ; Debug Register auf 172: movwf sp8 ; 0 setzen 173: 174: movlw b'10001000' ; Enable Global Ints 175: movwf intcon ; Enable PortChange Ints. 176: 177: 178: ;;------------------------------------------------------------------------ 179: ;;Display Init 180: endlos: 181: bcf portb,2 ; LCD: Instruction Code 182: 183: movlw b'00000001' ; Display Clear 184: call dataout 185: 186: movlw b'00000110' ; Entry Mode Set 187: call dataout 188: 189: movlw b'00001100' ; Display On 190: call dataout 191: 192: movlw b'00111000' ; Set Function 193: call dataout 194: 195: bsf portb,2 ; LCD: Data Code 196: 197: movlw b'01000100' ;D 198: call dataout 199: movlw b'01010011' ;S 200: call dataout 201: movlw b'01010000' ;P 202: call dataout 203: movlw b'00101101' ;- 204: call dataout 205: movlw b'01010000' ;P 206: call dataout 207: movlw 72h ;r 208: call dataout 209: movlw 6fh ;o 210: call dataout 211: movlw 6Ah ;j 212: call dataout 213: movlw 65h ;e 214: call dataout 215: movlw 63h ;c 216: call dataout 217: movlw 74h ;t 218: call dataout 219: 220: bcf portb,2 221: movlw b'11000000' ; LCD: 2. Zeile, Pos. 0 222: call dataout 223: bsf portb,2 224: 225: 226: movlw 62h ;b 227: call dataout 228: movlw 79h ;y 229: call dataout 230: movlw 20h ;<space> 231: call dataout 232: movlw b'01001100' ;L 233: call dataout 234: movlw b'01100101' ;e 235: call dataout 236: movlw b'01101111' ;o 237: call dataout 238: movlw 26h ;& 239: call dataout 240: movlw 4eh ;N 241: call dataout 242: movlw 69h ;i 243: call dataout 244: movlw 63h ;c 245: call dataout 246: movlw b'01101111' ;o 247: call dataout 248: 249: ; LCD: Data Code 250: bsf portb,2 251: movlw 20h ;<space> 252: call dataout 253: bsf sp9,7 254: 255: ;;------------------------------------------------------------------------ 256: x: ; Endlosschleife 257: ; Beginn mit kleiner Animation ;-) 258: 259: bcf portb,2 260: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 261: call dataout 262: bsf portb,2 263: movlw 2eh ;. 264: call dataout 265: 266: call zeit_30_1ms 267: 268: bcf portb,2 269: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 270: call dataout 271: bsf portb,2 272: movlw 6fh ;o 273: call dataout 274: 275: call zeit_30_1ms 276: 277: bcf portb,2 278: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 279: call dataout 280: bsf portb,2 281: movlw 4fh ;O 282: call dataout 283: 284: call zeit_30_1ms 285: 286: bcf portb,2 287: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 288: call dataout 289: bsf portb,2 290: movlw 6fh ;o 291: call dataout 292: 293: call zeit_30_1ms 294: 295: goto x ; Endlos-Schleife, Animation 296: 297: ;;------------------------------------------------------------------------ 298: ;; space=20h [=5Bh ]=5Dh C=43h E=45h H=48h O=4Fh P=50h T=54h 299: menu: ; Menu (von ISR aufgerufen) 300: bcf portb,2 301: movlw b'00000110' ; Entry Mode Set 302: call dataout 303: 304: movlw b'00111000' ; Set Function 305: call dataout 306: 307: movlw b'11000000' ; LCD: 2. Zeile, Pos. 0 308: call dataout 309: bsf portb,2 310: 311: movfw sp10 ; sp10 (Auswahl) laden 312: sublw 1 313: sublw 0 314: btfsc status,2 ; is das ergebnis 0 ? 315: goto show_delta 316: sublw 1 317: sublw 0 318: btfsc status,2 ; is das ergebnis jetzt 0 ? 319: goto show_htflag 320: sublw 1 321: sublw 0 322: btfsc status,2 ; is das ergebnis jetzt 0 ? 323: goto show_firflag 324: goto show_nothing 325: 326: show_delta: 327: 328: movlw 44h ;D 329: call dataout 330: movlw 45h ;E 331: call dataout 332: movlw 4Ch ;L 333: call dataout 334: movlw 54h ;T 335: call dataout 336: movlw 41h ;A 337: call dataout 338: movlw 20h ;<space> 339: call dataout 340: 341: movfw sp11 ; Delta Value laden 342: addlw 1h ; und nomoi ans dazua 343: sublw 0Ah 344: btfsc status,2 ; is das ergebnis 0 ? 345: goto zehn_anzeigen 346: btfss status,0 ; is das carry flag gsetzt ? 347: goto zehn_anzeigen 348: movlw 20h ; <space> 349: call dataout 350: movfw sp11 ; Delta Value laden 351: addlw 30h ; ASCII Code von 0 dazuzaehlen 352: addlw 1h ; und nomoi ans dazua 353: call dataout 354: goto kleiner_10 355: zehn_anzeigen: 356: movlw 31h ; ASCII Code von 1 357: call dataout 358: movfw sp11 ; Delta Value laden 359: addlw 1h ; und nomoi ans dazua 360: sublw 0Ah 361: sublw 0 362: addlw 30h ; ASCII Code von 0 dazuzaehlen 363: call dataout 364: kleiner_10 365: 366: movlw 20h ;<space> 367: call dataout 368: movlw 20h ;<space> 369: call dataout 370: movlw 20h ;<space> 371: call dataout 372: movlw 20h ;<space> 373: call dataout 374: movlw 20h ;<space> 375: call dataout 376: 377: goto end_menu 378: 379: show_htflag 380: movlw 48h ;H 381: call dataout 382: movlw 49h ;I 383: call dataout 384: movlw 4Ch ;L 385: call dataout 386: movlw 42h ;B 387: call dataout 388: movlw 45h ;E 389: call dataout 390: movlw 52h ;R 391: call dataout 392: movlw 54h ;T 393: call dataout 394: movlw 20h ;<space> 395: call dataout 396: 397: btfss sp13,0 ; ist hilbertflag gesetzt ? 398: goto showset_htflag ; is net gsetzt, anzeigen 399: movlw 4Fh ;O 400: call dataout 401: movlw 4Eh ;N 402: call dataout 403: movlw 20h ;<space> 404: call dataout 405: goto showend_htflag 406: showset_htflag 407: movlw 4Fh ;O 408: call dataout 409: movlw 46h ;F 410: call dataout 411: movlw 46h ;F 412: call dataout 413: showend_htflag 414: goto end_menu 415: 416: show_firflag 417: movlw 46h ;F 418: call dataout 419: movlw 49h ;I 420: call dataout 421: movlw 52h ;R 422: call dataout 423: movlw 46h ;F 424: call dataout 425: movlw 49h ;I 426: call dataout 427: movlw 4Ch ;L 428: call dataout 429: movlw 54h ;T 430: call dataout 431: movlw 20h ;<space> 432: call dataout 433: 434: btfss sp13,1 ; ist firfilter flag gesetzt ? 435: goto showset_firflag ; is net gsetzt, anzeigen 436: movlw 4Fh ;O 437: call dataout 438: movlw 4Eh ;N 439: call dataout 440: movlw 20h ;<space> 441: call dataout 442: goto showend_firflag 443: showset_firflag 444: movlw 4Fh ;O 445: call dataout 446: movlw 46h ;F 447: call dataout 448: movlw 46h ;F 449: call dataout 450: showend_firflag 451: goto end_menu 452: 453: show_nothing: 454: 455: movlw 4Eh ;N 456: call dataout 457: movlw 20h ;<space> 458: call dataout 459: movlw 49h ;I 460: call dataout 461: movlw 20h ;<space> 462: call dataout 463: movlw 58h ;X 464: call dataout 465: movlw 20h ;<space> 466: call dataout 467: movlw 20h ;<space> 468: call dataout 469: 470: movlw 20h ;5bh ;[ 471: call dataout 472: movlw 20h ;5dh ;] 473: call dataout 474: 475: end_menu: 476: movlw 20h ;<space> 477: call dataout 478: movlw 20h ;<space> 479: call dataout 480: movlw 20h ;<space> 481: call dataout 482: movlw 20h ;<space> 483: call dataout 484: 485: 486: ;; call DSP_Int 487: ;; bcf sp9,6 ; Wenn nicht aus ISR aufgerufen 488: return 489: 490: ;;------------------------------------------------------------------------ 491: ;; DSP Interrupt ausloesen (low aktiv) 492: ;; 4. Pin auf Port a auf 0 - warten - wieda auf high 493: 494: DSP_Int 495: call zeit_13_1ms 496: bcf porta,4 ; RA4: Interruptleitung fuer DSP 497: call zeit_5_1ms ; mal auf GND ziehn, warten, 498: bsf porta,4 ; und wieder auf High 499: call zeit_5_1ms 500: call zeit_5_1ms 501: return 502: 503: ;;------------------------------------------------------------------------ 504: ;; Zeichen Ausgabe: 505: 506: dataout: 507: movwf sp1 508: bcf status,0 509: movlw b'00001001' 510: movwf sp2 511: 512: dataout1: 513: decfsz sp2,1 514: goto dataout2 515: goto uu 516: return 517: 518: dataout2: 519: rrf sp1,1 ; Daten seriell auf das 520: btfss status,0 ; Schieberegister ausgeben 521: goto null 522: goto eins 523: 524: null: 525: bcf portb,0 ; Serial Input von Schieberegister 526: 527: call clock 528: goto dataout1 529: 530: eins: 531: bsf portb,0 ; Serial Input von Schieberegister 532: 533: call clock 534: goto dataout1 535: 536: clock: 537: bcf portb,1 ; Clock Input von Schieberegister 538: bsf portb,1 ; einen Taktflanke erzeugen, damit 539: bcf portb,1 ; das naechste Bit uebernommen wird 540: return 541: 542: uu: 543: bcf portb,3 ; Und schliesslich 544: call zeit_13_1ms 545: bsf portb,3 ; Enable Signal fuer LCD erzeugen 546: call zeit_13_1ms 547: bcf portb,3 ; und wieder loeschen 548: return 549: 550: ;;------------------------------------------------------------------------ 551: ;; zeit_13_1ms 552: 553: zeit_13_1ms: 554: movlw b'00000011' 555: movwf sp3 556: 557: movlw b'00000001' 558: movwf sp4 559: 560: zeit_13_2ms: 561: decfsz sp3,1 562: goto zeit_13_3ms 563: return 564: 565: zeit_13_3ms: 566: decfsz sp4,1 567: goto zeit_13_3ms 568: goto zeit_13_2ms 569: 570: ;;------------------------------------------------------------------------ 571: ;; Zeit_30ms => 325,125 msec 572: 573: zeit_30ms: 574: call zeit_30_1ms 575: return 576: 577: zeit_30_1ms: 578: movlw b'11111111' 579: movwf sp3 580: 581: zeit_30_2ms: 582: movlw b'11111111' 583: movwf sp4 584: decfsz sp3,1 585: goto zeit_30_3ms ; 255 * 1,275 msec = 325,125 msec 586: return 587: 588: zeit_30_3ms: 589: decfsz sp4,1 590: goto zeit_30_4ms 591: goto zeit_30_2ms 592: 593: zeit_30_4ms: 594: nop ; 4 Mhz Takt => 595: nop 596: nop 597: nop 598: nop 599: goto zeit_30_3ms 600: 601: ;;------------------------------------------------------------------------ 602: ;; Entprellen 603: 604: Entprellen 605: nop 606: call zeit_4x_1ms 607: nop 608: call zeit_4x_1ms 609: nop 610: return 611: 612: zeit_4x_1ms: 613: movlw b'11111111' 614: movwf sp5 615: 616: zeit_4x_2ms: 617: movlw b'00000110' 618: movwf sp6 619: decfsz sp5,1 620: goto zeit_4x_3ms 621: return 622: 623: zeit_4x_3ms: 624: decfsz sp6,1 625: goto zeit_4x_4ms 626: goto zeit_4x_2ms 627: 628: zeit_4x_4ms: 629: nop 630: goto zeit_4x_3ms 631: 632: 633: ;;------------------------------------------------------------------------ 634: ;; zeit_5_1ms 635: 636: zeit_5_1ms: 637: movlw b'00000111' 638: movwf sp3 639: 640: movlw b'00001111' 641: movwf sp4 642: 643: zeit_5_2ms: 644: decfsz sp3,1 645: goto zeit_5_3ms 646: return 647: 648: zeit_5_3ms: 649: decfsz sp4,1 650: goto zeit_5_3ms 651: nop 652: nop 653: nop 654: goto zeit_5_2ms 655: 656: 657: end ; und zu Ende is unser schoenes Prog. 658: 659: ;;------------------------------------------------------------------------ 660: ;; check out the DSP Project Site: 661: ;; http://blub2k.no-ip.com/dsp/ 662: ;; http://sprossenwanne.yi.org/dsp/ or http://sprossenwanne.myip.org/dsp/ 663: ;; mailto: leo@sprossenwanne.at 664: ;;------------------------------------------------------------------------ 665: ;; einige Teile des Programmcodes wurden von der MaturaDoku der Schueler 666: ;; Eggler/Geiger 1998/99 Schellinggasse, Wien1, Oesterreich entnommen. 667: ;;------------------------------------------------------------------------
Datum | Eintrag |
---|---|
11.09.2000 | Anpassen des Entwicklungsrechners und installieren der Software. |
14.09.2000 | Kennenlernen von Matlab (Demo-Programme) |
18.09.2000 | Optimieren der Softwareeinstellungen, Kennenlernen der Assemblerspreche des DSP |
21.09.2000 | Entwerfen von Analog- und Digitalfilter in Matlab |
25.09.2000 | FIR-Filter programmiert, mit Matlab verschiedene FIR-Filter entworfen und am DSP getestet |
28.09.2000 | Protokoll-Arbeiten und entwickeln mit Matlab |
02.10.2000 | Fehlersuche im Programm, da sich der Filter nicht so anhört wie er sollte |
03.10.2000 | Arbeiten an allgemeiner Dokumentation |
04.10.2000 | Konzeption der Webdokumentation |
09.10.2000 | Genau Messung des DSP-Outputs mit Spektrumanalyzer um den Fehler einzugrenzen; debuggen des Programms |
10.10.2000 | Arbeit im Labor: Fehler im Programm gefunden (zirkuläre Adressierung); trotzdem zeigt die Analyse mit Spektrumanalyzer noch immer Fehler |
11.10.2000 | weitere theoretische Fehlersuche im Programm |
16.10.2000 | Falsche Implementierung im Motorola Originalquellcode (FIR-Filter) gefunden; Messung mit Spektrumanalyzer ergibt gleiches Ergebniss wie in Theorie (Matlab) |
17.10.2000 | Neuschreiben des Programmes zur besseren Übersicht |
18.10.2000 | Erstellen von Grafiken mit Matlab |
23.10.2000 | Echoprogramm zum Programm hinzugefügt; Einarbeitung in PIC-Programmierung |
24.10.2000 | Weitere Informationen über PIC gesucht |
25.10.2000 | Zusammenfassen und Ausdrucken der gefundenen PIC-Dokumentation |
30.10.2000 | PIC Programmer aufgebaut. Doku auf englisch verfasst und Projekt auf Englisch erklaert. Beginn mit Aufbau der PIC Ansteuer/Anzeige Unit. |
31.10.2000 | Weitere Referenzen zu PIC gesucht |
6.11.2000 | LCD Platine fuer PIC fertig geloetet. PIC Programmer getestet - keine Funktion - Fehlersuche - Fehler behoben. PIC Programm funktioniert. |
7.11.2000 | Fehler auf PIC Platine: zu hoher Stromverbrauch. Fehlersuche im Labor: Hintergrundbeleuchtung ohne Vorwiderstand (Fehler im Schaltplan). LCD Doku gesucht. Preprozessor fuer Assemblerprogramme entwickelt. |
8.11.2000 | PIC Dokumentation genau durchgenommen (Interrupt, Register-Mapping, Speicherbelegung, I/O Ports, ...) |
13.11.2000 | DSP Programm (FIR Filter+Echo) Interrupt faehig gemacht. Durch IRQA auf Masse Signal ein/ausschalten bzw. dann Echo an/aus. Interface von PIC Steuerplatine zu DSP hergestellt. PIC Programm angepasst. Tastenentprellung perfektioniert. |
14.11.2000 | im Labor: DSP Programm: je nach Bitkombination an Port B Echo ein/aus oder Filter ein/aus. PIC Programm angepasst. Fehler in Filterroutine beseitigt. DSP Programm weiterentwickelt um zwischen 2 Filter umzuschalten. |
15.11.2000 | FREI |
18.11.2000 | Labor: Tag der offenen Tuer: Praesentation des DSP und der PIC Steuerung. DSP Programm optimiert (Lautstaerkeanpassung) |
20.11.2000 | Filter mit FFT Analyzer nachgemessen - kleiner Fehler bei Anzahl der Koeffizienten korrigiert. Analyse ok. |
21.11.2000 | in Labor: Fehler bei PIC Platine gesucht - teilweise mehrmaliges Einschalten erforderlich. |
22.11.2000 | in PIC Dokumentation Hinweis auf Fehlerursache gesucht. |
27.11.2000 | Fehlerursache: Nicht beschaltener Reset Eingang. korrigiert. Weitergearbeitet an DSP Programm. neue Koeffizienten probiert. |
28.11.2000 | in Labor: Parallelgruppe mit PIC und Programm geholfen. |
29.11.2000 | Informationen zu Hilbert Filter gesucht und Funktion im Matlab angeschaut. |
4.12.2000 | Modulationsfilter Entwurf mit Matlab. Darstellung nicht korrekt. |
5.12.2000 | Analyse der genauen Funktionsweise des Modulationsfilters. |
6.12.2000 | weitere Analyse. weiterhin Probleme. |
11.12.2000 | Weiterentwicklung des Modulationsfilters. korrekte Funktion des Hilbert Filters und des Verzoegerungsgliedes. Grafische Darstellung im Matlab ok. |
12.12.2000 | M-Files im Matlab fuer die Filter und die Modulation erstellt. |
13.12.2000 | M-Files zu einer Gesamtpraesentation zusammengefasst. |
18.12.2000 | Ueberlegungen der Implementation im DSP Programm. grosse Probleme mit der Modulation selbst (e^jO, sinus/cosinus) |
19.12.2000 | Application Sheets zu Sinus fuer DSP gesucht/ausgedruckt. |
20.12.2000 | Durchschauen und versuchen, die Funktionsweise des Sinus und der Tabelle zu verstehen. |
8.1.2001 | Versuchen, im DSP Programm die Sinus Tabelle anzusprechen. Probleme mit OMR usw. |
9.1.2001 | im Labor: endlich korrektes Auslesen der Sinus Tabelle (Probleme mit Speicherbereiche beseitigt). Ausgabe eines Sinus Ton. Analyse mit Oszi - wunderschoener Sinus ;-) |
10.1.2001 | Mit Vorarbeiten an Praesentation begonnen. |
15.1.2001 | Ueberarbeiten des DSP Programms, um 2 Filter zu durchlaufen (Verzoegerungsglied und Hilbert). Modulation (nach Formel mit Sinus und Cosinus). Ergebnis entspricht nicht eines gepitchten Signals.http:// |
16.1.2001 | im Labor: weitere Analyse des Programms. Sinus und Cosinus Werte sind korrekt. Filterroutinen funktionieren korrekt. Trotzdem nicht gewuenschtes Ergebnis. |
17.1.2001 | Recoding des DSP Programms (sinus3.asm). Neuanordnung der Speicherbereiche. Dokumentation des Quellcodes. |
22.1.2001 | Fehler gefunden: Beim Cosinus wird ein 2tes Mal weitergezaehlt. Aufgrund Timing-Optimierungen Sinus und Cosinus direkt in den Main Loop und Debug Code eliminiert. |
23.1.2001 | Analyse mit FFT. Wahrscheinlich Problem mit Hilbert Filter: negative Frequenzanteile werden auch gepitcht. Delta Wert stimmt aber laut Messung. |
24.1.2001 | Aufbereiten der Projektdoku. |
29.1.2001 | PIC Platine - Fehler bei Power on Reset - korrigiert. Im PIC Programm Fehler bei Warteroutine zeit_30_1 korrigiert. PIC Programm korrigiert. DSP Programm um IRQ Steuerung erweitert, um Hilbert Filter ein/auszuschalten. Serielles Verlängerungskabel gebaut. DSP kann Stereo. |
30.1.2001 | im Labor: Geschwindigkeitsprobleme, wegen Stereo. Mit Samplingfrequenz runtergegangen. Weiterhin Fehler wegen der negativen Frequenzanteile. |
31.1.2001 | Theoretisches durchgehen des DSP Programms und Fehlersuche wegen negativen Frequenzen. |
5.2.2001 | Ferien |
6.2.2001 | Ferien |
7.2.2001 | Ferien |
12.2.2001 | Komplettes recoding des DSP Hilbert Programms. Stereo deaktiviert und Interrupts deaktiviert. Beide Kanäle zusammen addiert um 1 einzelnes Signal zu bekommen. |
13.2.2001 | im Labor: weitere Messungen durchgeführt - noch immer Fehler. durchgehen der Speicherbereiche (vielleicht zirkuläre Buffer ?). checken der Sinus Routine. |
14.2.2001 | Kommentieren des PIC Programms |
19.2.2001 | Nochmalige Messung mit Spektrumanalyser. Auf einmal nur mehr eine Spektrallinie (keine negative mehr). Doch das nur in einem sehr kleinen Frequenzbereich (hat in keiner Weise mit den Hilbertkoeffizienten zu tun). Darüber hinaus komische Ergebnisse im Spektrum. |
20.2.2001 | im Labor: Suche des Fehlers, warum ausserhalb des kleinen Frequenzbereichs solch komische Fehler auftreten. Überprüfen der Matlabkoeffizienten. |
21.2.2001 | DSP Programm kommentiert. |
26.2.2001 | Fehler gefunden, wieso bei den Messungen diese Ergebnisse rauskommen: Falsche Einstellungen beim Spektrumanalyser. Nach wiederherstellen der richtigen Einstellungen wieder dasselbe Problem wie vorher - negative Spektrallinien werden wieder moduliert. |
27.2.2001 | im Labor: Fehler nicht auffindbar. ratlosigkeit |
28.2.2001 | Übungen mit ANA |
5.3.2001 | Da noch immer Fehler, Prof. Wess um Hilfe gebeten. Gemeinsam das Programm durchgegangen, doch noch zu keinem Ergebnis. |
6.3.2001 | im Labor: Instruktionen, alle Sachen aus dem Programm zu nehmen, die nicht mehr nötig sind (sprich: temp variablen, Speicherreservierungen die nicht mehr genutzt werden, Interrupt aktivierungsroutinen, ...) |
7.3.2001 | Übungen mit PSPice und ANA |
12.3.2001 | Gemeinsam mit Prof. Wess den nun überarbeiteten Code durchgecheckt. Überprüfung der Speicherbereiche (zirkuläre Buffer) - ok ! Überprüfen wegen der Definition von n (Delta) und logisches Durchgehen der Anzahl der Repeat anweisungen und initialisieren der korrekten Wertes der m Register. 1 Fehler entdeckt und korrigiert. Doch weiterhin kein korrektes Ergebnis. |
13.3.2001 | im Labor: Nochmaliges Überprüfen der Sinus Routine: Fehler entdeckt. Da der Cosinus ebenfalls aus der 256 Werte Sinustabelle gebildet wird (sprich um 64 Verschoben) ungewollte zusätzliche Phasenverschiebung zwischen Berechnung des Cosinus und des Sinus - logischer Denkfehler - korrigiert. Programm funktioniert nun einwandfrei. |
14.3.2001 | Vorbereiten für div. andere Fächer (tests !!) |
19.3.2001 | Sinus3.asm funktioniert !! Nur mehr die positiven Anteile werden gepitcht. Nun Recoding und Geschwindigkeitsoptimierungen (Hilbert.asm). |
20.3.2001 | im Labor: die beiden Filterschleifen in eine einzelne verpackt. Alle Befehle, die sich parallelisieren lassen ausgenutzt. |
21.3.2001 | Weitere Auseinandersetzung mit Programmierung von Mikrocontrollern (EDT) |
26.3.2001 | FIR Filter Routine (Bandpass) im DSP Programm implementiert, um nur das Sprachsignalband zu erhöhen. Notwendige Änderung: Extremes herabsetzen der Samplingfrequenz (auf 16 kHz). Probieren, welche Bandbreite der Bandpass haben muss. |
27.3.2001 | im Labor: allgemeine Einführung in die Programmierung von Mikrocontrollern (EDT) für einige Schulkollegen. |
28.3.2001 | Ausarbeitung eines neuen Konzepts für die Präsentation und Dokumentation (/kurzdoku) |
2.4.2001 | Neues PIC Programm PIC_TST5.ASM (Grundgerüst von pic_tst4.asm übernommen). Ziel: Steuerung des DSP (einstellen der Deltavariable, Hilbert ein/ausschalten). Überlegungen eins genialen Übertragungsprotokolls (2&3 Byte Kommandos). Anpassen des DSP Programms HILBERT.ASM (IRQ Steuerung). Umlöten des PIC Boards, daß RB0-RB3 angesprochen wird. |
3.4.2001 | im Labor: Fehler bein Interrupt im DSP Programm. Vergessen in die Interrupt Tabelle einzutragen und Initialisierungscode vom Interrupt Fehlerhaft - korrigiert ! Implementierung des Protokolls in den PIC. Interrupt wird aufgerufen, doch Delta Wert wird nicht korrekt geändert. |
4.4.2001 | weiteres kennenlernen und arbeiten mit PSpice. Ausgabe am Display und Code vom PIC Programm PIC_TST5.ASM verschönert. |
9.4.2001 | Osterferien |
10.4.2001 | Osterferien |
11.4.2001 | Osterferien |
16.4.2001 | Osterferien: Debuggen des DSP Programms. Komisches Verhalten beim AND (wenn AND Wert kleiner FFh). Korrigiert, indem AND mit F0000Fh. Korrektur im PIC_TST5.ASM: Es wurde ein Interrupt zuviel ausgelöst. Nun korrekte Übernahme des Delta Werts. |
17.4.2001 | Osterferien: Display Ausgabe verschönert und debuggen des PIC Programms mittels "DEBUG Sockel - Ausgabe auf LED's). Implementierung von 2 Byte Kommandos. Funktioniert nicht. Idee mit 2&3Byte Protokoll verworfen und einfacheres angepasstes Protokoll verwendet. Kein Erfolg, da in der Interrupt Routine nur 1 einzelnes decrease abgearbeitet wird. dann nicht mehr. Nun ganz einfaches Protokoll implementiert - nur Änderung des Delta Wertes und Ausschalten des Hilbertfilters. PIC angepasst. Funktioniert !! |
18.4.2001 | Osterferien: Übernehmen der Alten Dokumentation in die neue (/kurzdoku) |
Unsere Programme, Dokumentationen und Präsentation sind auch online zu bekommen unter http://blub2k.yi.org/dsp/.
Bei weiteren Fragen sind wir auch per E-Mail zu erreichen:
Diese Dokumentation basiert auf Scripts von view->source[Nico Edtinger] um sie sowohl online verfügbar als auch druckbar zu machen. In nächster Zeit wird der Code unter der GPL auf http://viewsource.web.ag/ zur Verfügung stehen.
Das Copyright für den gesamten Inhalt liegt bei Leo Eibler und Nico Edtinger. Wir sind per Mail zu ereichen falls jemand größere Auszüge aus dieser Dokumentation verwenden will.