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 LCD-Display gebracht werden. Das gesamte Modul soll im fertigem Stadium ohne PC arbeiten.
The vocals of a music-signal should be filtered out an 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. When the project is finished it should work without PC.
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 Erfodernise 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.
Derzeit ist zwar der Modulationsfilter realisiert allerdings befindet sich neben dem Summensignal auch das Differenzsignal der Modulation im Ausgangssignal.
After we installed the needed Software on the Projet-PCs, we began to read the DSP-Documentation. We used a ready-to-go Demo-Programm from Motorola with an echo-effect. We made some changes on this code and it still worked.
For our first own Programm 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 programm to get to know how this works. With that know-how we realized the programm for the modulationfilter.
Our next step is to get the modulationfilter work as expected.
Ein FIR-Filter ist ein Filter, der einfach zu programmieren ist und dabei sehr schnell arbeitet. Es müssen nur einmal Koeffizienten berchnet werden um den Filterverlauf anzugeben. Das Ausgangssignal wird dann mit jedem dieser Koeffizienten multipliziert und diese Ergebnisse zusammen addiert.
Nach Korrektur des Fehlers ergab die Analyse mit dem Spetrumanalyzer (roter Verlauf) einen Verlauf wie in der Theorie mit Matlab (blauer Verlauf).
1: force reset 2: change omr 0 3: load firecho 4: go 0 5:
1: opt rc ; Assembler Directive 2: 3: START equ $40 4: 5: 6: ;**** fir init **** 7: ;n equ 50 ; N of filter 8: wddr equ $40 ; samples offset 9: cddr equ $40 ; coeffizidings offset 10: input equ $ffe0 ; Input Memory Location 11: output equ $ffe1 ; Output Memory Location 12: ;**** end init **** 13: 14: org x:wddr ; Reserved Memory for 15: smpl bsc 128,$0 ; Samples 16: 17: org y:cddr ; Here are the 18: coeff include 'include.inc' ; Coeffs. (e.g. Include File) 19: ; dc 0.502011 20: ; dc 0.002309 21: ; dc 0.200421 22: ; dc 0.015338 23: ; dc 0.402862 24: ; dc 0.004402 25: 26: org p:0 ;RESET Vector 27: jmp START 28: 29: org p:$000C 30: jsr ssi_rx_isr ;SSI RX 31: jsr ssi_rx_isr ;SSI RX w/Exception 32: jsr ssi_tx_isr ;SSI TX 33: jsr ssi_tx_isr ;SSI TX w/Exception 34: 35: org p:START 36: 37: movep #$261009,x:PLL ; set PLL for MPY of 10x 38: movep #$0000,x:BCR ; zero wait states in all ext. memory 39: ori #3,mr ; disable interrupts 40: movec #0,sp ; clear hardware stack pointer 41: move #0,omr ; mode 0: enable int. P:RAM, rst=0000 42: move #$40,r6 ; initialize stack pointer 43: move #-1,m6 ; linear addressing 44: 45: include 'ada_init.asm' ; init codecs for DSP 46: 47: 48: TONE_OUTPUT EQU HEADPHONE_EN+LINEOUT_EN+(4*LEFT_ATTN)+(4*RIGHT_ATTN) 49: TONE_INPUT EQU MIC_IN_SELECT+(15*MONITOR_ATTN) 50: 51: move #TONE_OUTPUT,y0 ; headphones, line out, mute spkr, no attn. 52: move y0,x:TX_BUFF_BASE+2 53: move #TONE_INPUT,y0 ; no input gain, monitor mute 54: move y0,x:TX_BUFF_BASE+3 55: 56: ;**** fir init **** 57: move #wddr,r1 ; Samples Offset in Memory (x:r1) 58: move #cddr,r4 ; Coeff. Offset in Memory (y:r4) 59: move #n-1,m1 ; initialise circular buffers with 60: move m1,m4 ; the value n-1 (but only used for r4) 61: ;**** end fir ***** 62: 63: 64: 65: opt cc ; Assembler-Directive for List Files 66: 67: loop ; Main Loop 68: jset #2,x:SSISR,* ; Wait for frame sync to pass. 69: jclr #2,x:SSISR,* ; Wait for frame sync. 70: 71: ; move x:RX_BUFF_BASE+1,a ; get new samples 72: ; move a,y:input ; and store it for filterprocedure 73: ; jsr proceed_filter 74: ; move a,x:TX_BUFF_BASE+1 ; Put value in left channel tx. 75: 76: ; move x:RX_BUFF_BASE,a ; get new samples 77: ; move a,y:input ; and store it for filterprocedure 78: ; jsr proceed_filter 79: ; move a,x:TX_BUFF_BASE ; Put value in left channel tx. 80: 81: move x:RX_BUFF_BASE,a ; get new samples left 82: asr a ; a/2 (half a) 83: move x:RX_BUFF_BASE+1,b ; get new samples right 84: asr b ; b/2 (half b) 85: add b,a ; a=a+b 86: jsr proceed_filter 87: move a,x:TX_BUFF_BASE ; Put value in left channel tx. 88: move a,x:TX_BUFF_BASE+1 ; Put value in right channel tx. 89: 90: 91: jmp loop ; jump to Main Loop 92: 93: proceed_filter ; My FIR Filter Procedure 94: ; move #wddr,r1 95: move #cddr,r4 96: 97: move a,x:(r1) ; store samples in buffer 98: clr a x:(r1)+,x0 y:(r4)+,y0 ; get samples and coeffs. 99: rep #n-1 ; do filter- 100: mac x0,y0,a x:(r1)+,x0 y:(r4)+,y0 ; loop and mult. 101: macr x0,y0,a (r1)- ; and last mult. with last coeff. 102: 103: rts 104: 105: include 'txrx_isr.asm' ; ISR's for in- and output 106: 107: end
Der FIR-Filter mit Echo ist die Verbindung des Beispielprogramms mit dem FIR-Filter. Dabei wird nur über einen bestimmten Frequenzbereich (FIR-Filter) der Echo-Effekt angewandt und das restliche Signal unverändert ausgegeben.
1: force reset 2: change omr 0 3: load firfilt 4: go 0 5:
1: opt rc ; Assembler Directive 2: 3: START equ $40 4: 5: 6: ;**** fir init **** 7: ;n equ 50 ; N of filter (now in coeff-inc file) 8: wddr equ $40 ; samples offset 9: cddr equ $40 ; coeffizidings offset 10: tmp equ 192 11: input equ $ffe0 ; Input Memory Location 12: output equ $ffe1 ; Output Memory Location 13: ;**** end init **** 14: 15: org x:wddr ; Reserved Memory for 16: smpl bsc 128,$0 ; Samples 17: 18: org x:tmp ; Reserved Memory for 19: smtmp bsc 4,$0 ; Original Samples (Echo) 20: 21: org y:cddr ; Here are the 22: coeff include 'include.inc' ; Coeffs. (e.g. Include File) 23: ; dc 0.502011 24: ; dc 0.002309 25: ; dc 0.200421 26: ; dc 0.015338 27: ; dc 0.402862 28: ; dc 0.004402 29: 30: org p:0 ;RESET Vector 31: jmp START 32: 33: org p:$000C 34: jsr ssi_rx_isr ;SSI RX 35: jsr ssi_rx_isr ;SSI RX w/Exception 36: jsr ssi_tx_isr ;SSI TX 37: jsr ssi_tx_isr ;SSI TX w/Exception 38: 39: org p:START 40: 41: movep #$261009,x:PLL ; set PLL for MPY of 10x 42: movep #$0000,x:BCR ; zero wait states in all ext. memory 43: ori #3,mr ; disable interrupts 44: movec #0,sp ; clear hardware stack pointer 45: move #0,omr ; mode 0: enable int. P:RAM, rst=0000 46: move #$40,r6 ; initialize stack pointer 47: move #-1,m6 ; linear addressing 48: 49: include 'ada_init.asm' ; init codecs for DSP 50: 51: 52: TONE_OUTPUT EQU HEADPHONE_EN+LINEOUT_EN+(4*LEFT_ATTN)+(4*RIGHT_ATTN) 53: TONE_INPUT EQU MIC_IN_SELECT+(15*MONITOR_ATTN) 54: 55: move #TONE_OUTPUT,y0 ; headphones, line out, mute spkr, no attn. 56: move y0,x:TX_BUFF_BASE+2 57: move #TONE_INPUT,y0 ; no input gain, monitor mute 58: move y0,x:TX_BUFF_BASE+3 59: 60: ;**** fir init **** 61: move #wddr,r1 ; Samples Offset in Memory (x:r1) 62: move #cddr,r4 ; Coeff. Offset in Memory (y:r4) 63: move #n-1,m1 ; initialise circular buffers with 64: move m1,m4 ; the value n-1 (but only used for r4) 65: ;**** end fir ***** 66: 67: ;**** echo init *** 68: move #$4000,r5 ; initialise linear addressing 69: move #$3FFF,m5 ; for echo function 70: ;**** end echo **** 71: 72: 73: opt cc ; Assembler-Directive for List Files 74: 75: loop ; Main Loop 76: jset #2,x:SSISR,* ; Wait for frame sync to pass. 77: jclr #2,x:SSISR,* ; Wait for frame sync. 78: 79: ; move x:RX_BUFF_BASE+1,a ; get new samples 80: ; move a,y:input ; and store it for filterprocedure 81: ; jsr proceed_filter 82: ; move a,x:TX_BUFF_BASE+1 ; Put value in left channel tx. 83: 84: ; move x:RX_BUFF_BASE,a ; get new samples 85: ; move a,y:input ; and store it for filterprocedure 86: ; jsr proceed_filter 87: ; move a,x:TX_BUFF_BASE ; Put value in left channel tx. 88: 89: move x:RX_BUFF_BASE,a ; get new samples left 90: asr a ; a/2 (half a) 91: move x:RX_BUFF_BASE+1,b ; get new samples right 92: asr b ; b/2 (half b) 93: add b,a ; a=a+b 94: asr a ; half a (input signal from both channels) 95: move a,x:tmp ; store original sample in buffer (for echo) 96: jsr proceed_filter 97: move a,b ; proceed_echo uses reg. b for input 98: jsr proceed_echo 99: move x:tmp,a ; restore original sample to reg. a 100: asl b ; amplify echo output 101: asr a ; half a second time 102: add b,a ; add echo output to original sound 103: 104: move a,x:TX_BUFF_BASE ; Put value in left channel tx. 105: move a,x:TX_BUFF_BASE+1 ; Put value in right channel tx. 106: 107: 108: jmp loop ; jump to Main Loop 109: 110: proceed_filter ; My FIR Filter Procedure 111: ; move #wddr,r1 112: move #cddr,r4 ; set r4 to start at coeff 0 113: 114: move a,x:(r1) ; store samples in buffer 115: clr a x:(r1)+,x0 y:(r4)+,y0 ; get samples and coeffs. 116: rep #n-1 ; do filter- 117: mac x0,y0,a x:(r1)+,x0 y:(r4)+,y0 ; loop and mult. 118: macr x0,y0,a (r1)- ; and last mult. with last coeff. 119: 120: rts 121: 122: proceed_echo 123: asr b y:(r5),y0 ; samples from buffer (delay chain) 124: add y0,b ; add to input sample 125: asr b ; half value 126: move b,y:(r5)+ ; and bump the pointer 127: 128: rts 129: 130: include 'txrx_isr.asm' ; ISR's for in- and output 131: 132: end
Alle Programme haben eine gemeinsame Include-Datei, die die Initialisierung und allgemeine Variablen beinhaltet.
1: page 132,60 2: ;**************************************************************************** 3: ; ADA_INIT.ASM ver.1.1 4: ; Initialization program for the Crystal Semi. CS4215 A/D & 5: ; D/A Converters 6: ; 7: ; NOTES: 8: ; 1- The DSP5002EVM analog inputs are connected to "MIC" 9: ; input pins only. The "LINE" input pins are connected 10: ; to analog GROUND. Line level inputs are supported 11: ; by disabling the 20 dB Microphone Pre-Amplifier. 12: ; 2- As shipped, the DSP56002EVM has a 24.576 MHz crystal 13: ; connected to the XTAL2 inputs of the CD4215. Do 14: ; not select any other clock source unless the board 15: ; has been modified to support the alternate clock 16: ; source(s). 17: ; 18: ; 19: ; Copyright (c) MOTOROLA 1995 20: ; Semiconductor Products Sector 21: ; Digital Signal Processing Division 22: ; 23: ;**************************************************************************** 24: ; 25: ; portc usage: 26: ; bit8: SSI TX (from DSP to Codec) 27: ; bit7: SSI RX (from Codec to DSP) 28: ; bit6: SSI Clock 29: ; bit5: SSI Frame Sync 30: ; bit4: codec reset (from DSP to Codec) 31: ; bit3: 32: ; bit2: data/control bar 33: ; 0=control 34: ; 1=data 35: ; 36: ;**************************************************************************** 37: 38: ;**************************************************************************** 39: ; Defined Constants used to construct data for the CONTROL TIME SLOTS 40: ;**************************************************************************** 41: NO_PREAMP equ $100000 ;0 == enable 20 dB pre-amp 42: LO_OUT_DRV equ $080000 ;0 == 2.8 Vp-p line (1V rms) 43: ;0 == 4.0 Vp-p headphones 44: ;1 == Line and Headphone 2.0Vp-p 45: HI_PASS_FILT equ $008000 ;0 == HPF disabled 46: SAMP_RATE_9 equ $003800 ; 9.6 kHz sample rate 47: SAMP_RATE_48 equ $003000 ;48 kHz sample rate 48: SAMP_RATE_32 equ $001800 ;32 kHz sample rate 49: SAMP_RATE_27 equ $001000 ;27.4 kHz sample rate 50: SAMP_RATE_16 equ $000800 ;16 kHz sample rate 51: SAMP_RATE_8 equ $000000 ; 8 kHz sample rate 52: STEREO equ $000400 ;1 == stereo, 0 == mono 53: DATA_8LIN equ $200300 ; 8-bit unsigned linear 54: DATA_8A equ $200200 ; 8-bit A-law 55: DATA_8U equ $200100 ; 8-bit u-law 56: DATA_16 equ $200000 ;16-bit 2s complement linear 57: IMMED_3STATE equ $800000 ;1=SCLK & FS 3-state immediately 58: XTAL2_SELECT equ $200000 ;REQUIRED as this is the only clock 59: ; source on the board 60: BITS_64 equ $000000 ; 64 bits per frame 61: BITS_128 equ $040000 ;128 bits per frame 62: BITS_256 equ $080000 ;256 bits per frame 63: CODEC_MASTER equ $020000 ;1 == codec generates SCLK & FS 64: ;0 == codec receives SCLK & FS 65: CODEC_TX_OFF equ $010000 ;0 == enable codec TX to DSP 66: ;1 == disable (Hi-Z) codec output 67: 68: ;**************************************************************************** 69: ; Defined Constants used to construct data for the DATA TIME SLOTS (5-8) 70: ;**************************************************************************** 71: HEADPHONE_EN equ $800000 ;1 == headphone output enabled, 0 == muted 72: LINEOUT_EN equ $400000 ;1 == line output enabled, 0 == muted 73: LEFT_ATTN equ $010000 ;63 steps * 1.5 dB = -94.5 dB 74: SPEAKER_EN equ $004000 ;1 == speaker output enabled, 0 == muted 75: RIGHT_ATTN equ $000100 ;63 steps * 1.5 dB = -94.5 dB 76: MIC_IN_SELECT equ $100000 ;1 == A/D inputs from MIC pins NOTE: the 77: ; DSP56002EVM uses these pins. The line 78: ; input pins are not used. 79: LEFT_GAIN equ $010000 ;15 steps * 1.5 dB = 22.5 dB 80: MONITOR_ATTN equ $001000 ;15 steps * 6.0 dB = 90.0 dB (mute) 81: RIGHT_GAIN equ $000100 ;15 steps * 1.5 dB = 22.5 dB 82: 83: ;---------------------------------------------------------------------------- 84: ; constructed constants for codec set up/initialize 85: ;---------------------------------------------------------------------------- 86: CTRL_WD_12 equ NO_PREAMP+HI_PASS_FILT+SAMP_RATE_48+STEREO+DATA_16 ;CLB=0 87: CTRL_WD_34 equ IMMED_3STATE+XTAL2_SELECT+BITS_64+CODEC_MASTER 88: CTRL_WD_56 equ $000000 89: CTRL_WD_78 equ $000000 90: 91: ;---------------------------------------------------------------------------- 92: ; constructed constants for codec data mode 93: ;---------------------------------------------------------------------------- 94: OUTPUT_SET equ HEADPHONE_EN+LINEOUT_EN+(LEFT_ATTN*4) 95: INPUT_SET equ MIC_IN_SELECT+(15*MONITOR_ATTN)+(RIGHT_ATTN*4) 96: 97: ;---DSP56002 on-chip peripheral addresses 98: IPR equ $FFFF ;Interrupt Priority Register 99: BCR equ $FFFE ;Bus Control Register 100: PLL equ $FFFD ;PLL Control Register 101: SSIDR equ $FFEF ;SSI Data Register 102: SSISR equ $FFEE ;SSI Status Register 103: CRB equ $FFED ;SSI Control Register B 104: CRA equ $FFEC ;SSI Control Register A 105: PCD equ $FFE5 ;Port C Data Register 106: PBD equ $FFE4 ;Port B Data Register 107: PCDDR equ $FFE3 ;Port C Data Direction Register 108: PBDDR equ $FFE2 ;Port B Data Direction Register 109: PCC equ $FFE1 ;Port C Control Register 110: PBC equ $FFE0 ;Port B Control Register 111: 112: 113: ;---------------------------------------------------------------------------- 114: ; The two buffers which are defined below are the source and 115: ; destination storage for the codec Input/Output ISRs 116: ;---------------------------------------------------------------------------- 117: org x:0 118: RX_BUFF_BASE equ * 119: RX_data_1_2 ds 1 ;data time slot 1/2 for RX ISR 120: RX_data_3_4 ds 1 ;data time slot 3/4 for RX ISR 121: RX_data_5_6 ds 1 ;data time slot 5/6 for RX ISR 122: RX_data_7_8 ds 1 ;data time slot 7/8 for RX ISR 123: 124: TX_BUFF_BASE equ * 125: TX_data_1_2 ds 1 ;data time slot 1/2 for TX ISR 126: TX_data_3_4 ds 1 ;data time slot 3/4 for TX ISR 127: TX_data_5_6 ds 1 ;data time slot 5/6 for TX ISR 128: TX_data_7_8 ds 1 ;data time slot 7/8 for TX ISR 129: 130: RX_PTR ds 1 ; Pointer for rx buffer 131: TX_PTR ds 1 ; Pointer for tx buffer 132: 133: 134: 135: ;*************************************************************************** 136: ;***** initialize the CS4215 codec ***** 137: ;*************************************************************************** 138: ; 1. Configure the SSI port and the GPIO lines used (D/C~ & Reset) 139: ; 2. Select Control Mode and reset the codec (50ms @ 40MHz) 140: ; 3. Initialize the Transmit Data Buffer with Control Words (CLB=0) 141: ; 4. Enable SSI 142: ; 5. Wait until CLB in receive buffer = 0 143: ; 6. Set CLB = 1 in TX buffer 144: ; 7. Send 4 frames of data 145: ; 8. Disable SSI port 146: ; 9. Program SSI to receive Frame Sync and Clock 147: ; 10. Select Data Mode (D/C~ = 1) 148: ; 11. Enable SSI port 149: ;*************************************************************************** 150: ; 151: ; 152: org p: 153: codec_init 154: move #RX_BUFF_BASE,x0 155: move x0,x:RX_PTR ; Initialize the rx pointer 156: move #TX_BUFF_BASE,x0 157: move x0,x:TX_PTR ; Initialize the tx pointer 158: 159: 160: ;----- initialize SSI ----- 161: ; Assuming the DSP56002 is running at 40 MHz, this section selects a 162: ; 2.5 MHz SSI clock to be sent from the 56002's SSI clock circuit 163: ; to the codec. It also sets up 64-bit frame length (4 words per 164: ; frame x 16-bits per word), enables SSI TX & RX, enables TX & RX 165: ; interrupts and synchronous operation with bit-length frame sync. 166: ;---------------------------------------------------------------------------- 167: movep #$0000,x:PCC ; turn off ssi port 168: movep #$4303,x:CRA ; 40MHz/16 = 2.5MHz SCLK, WL=16 bits, 4W/F 169: movep #$FB30,x:CRB ; RIE,TIE,RE,TE, NTWK, SYN, FSR/RSR->bit 170: movep #$14,x:PCDDR ; setup pc2 and pc4 as outputs 171: movep #$0,x:PCD ; D/C~ and RESET~ = 0 ==> control mode 172: ;----reset delay for codec ---- 173: do #500,_delay_loop 174: rep #2000 ; 100 us delay 175: nop 176: _delay_loop 177: bset #4,x:PCD ; RESET~ = 1 178: movep #$3000,x:IPR ; set interrupt priority level 179: movep #$01E8,x:PCC ; Turn on ssi port 180: 181: 182: ;--- set up the TX buffer with control mode data 183: move #CTRL_WD_12,x0 184: move x0,x:TX_BUFF_BASE 185: move #CTRL_WD_34,x0 186: move x0,x:TX_BUFF_BASE+1 187: move #CTRL_WD_56,x0 188: move x0,x:TX_BUFF_BASE+2 189: move #CTRL_WD_78,x0 190: move x0,x:TX_BUFF_BASE+3 191: 192: andi #$FC,mr ; enable interrupts 193: 194: ; 195: ; CLB == 0 in TX Buffer, wait for CLB == 1 in RX Buffer 196: ; 197: jclr #3,x:SSISR,* ; wait until rx frame bit==1 198: jset #3,x:SSISR,* ; wait until rx frame bit==0 199: jclr #3,x:SSISR,* ; wait until rx frame bit==1 200: jset #18,x:RX_BUFF_BASE,* ; loop until CLB set 201: 202: ; 203: ; CLB == 1 in RX Buffer, send 4 frames and then disable SSI 204: ; 205: bset #18,x:TX_BUFF_BASE ;set CLB 206: do #4,_init_loopB ; Delay as 4 full frames to pass 207: jclr #2,x:SSISR,* ; wait until tx frame bit==1 208: jset #2,x:SSISR,* ; wait until tx frame bit==0 209: _init_loopB 210: movep #0,x:PCC ;reset SSI port (disable SSI...) 211: 212: ; 213: ; now CLB should be 1 -- re-program fsync and sclk direction to input 214: ; 215: ; movep #$4303,x:CRA ; 16bits,4 word/frame, /2/4/2=2.5 MHz 216: movep #$FB00,x:CRB ; rcv,xmt & int ena,netwk,syn,sclk==inp,msb 1st 217: movep #$14,x:PCD ; D/C~ pin = 1 ==> data mode 218: movep #$01E8,x:PCC ; turn on ssi port (enable SSI now...) 219: ;-------------------------------------------------------------------------- 220: ; this is the end of the ada_init.asm routine...the main program continues 221: ;-------------------------------------------------------------------------- 222:
Der DSP hat in seinem ROM-Bereich bereits eine Sinustabelle von 0 bis 360 Grad mit 256 Werten. Allerdings wird die ROM-Speicher in den Bereich der y-Bank gemappt und es kann während der Zeit nur auf die x-Speicherbank zugegriffen werden.
Zum hinauf setzen der Frequenz von einem Audiosignal wird eine spezielle Filterkette verwendet. Zuerst wird das Audio-Signal aufgeteilt und auf der einen Seite in mit einer Hilbert-Transformation bearbeitet. Da auch das Original-Signal noch einmal benötigt wird ist auf der anderen Seite ein Verzögrungs-Glied.
Die Ausgänge werden dann nach Re{} = yz[] * cos(f * n[]) - yHT[] * sin(f * n[]) wieder zusammen gerechnet. Das Ausgangssignal ist dann die Summer aus dem Originalsignal und der Modulationsfrequenz.
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: cddr equ $100 ; coeffizidings offset in y memory 10: cddr2 equ $200 ; coeffizidings offset2 in y memory 11: ;**** end init **** 12: sin_ram equ $400 ; sine table in x:ram 13: sinep equ $100 ; when de=1 in omr -> $100 sinetable in rom 14: mask equ 255 ; 255 values in m-register 15: delta equ 1 ; delta value for sine (187) 16: 17: org x:wddr ; Reserved Memory for 18: smpl bsc 512,$0 ; Samples 19: 20: org y:cddr ; Hilbert 21: include 'y1.inc' ; Coeffs. (e.g. Include File) 22: 23: org y:cddr2 ; z(k-1) 24: include 'y2.inc' ; Coeffs. 25: 26: org x:sin_ram ; Sine Values 27: sintab bsc 256,$FF ; 256 Values (0 to Pi) 28: 29: org p:0 ;RESET Vector 30: jmp START 31: 32: org p:$000C 33: jsr ssi_rx_isr ;SSI RX 34: jsr ssi_rx_isr ;SSI RX w/Exception 35: jsr ssi_tx_isr ;SSI TX 36: jsr ssi_tx_isr ;SSI TX w/Exception 37: 38: org p:START 39: 40: 41: movep #$261009,x:PLL ; set PLL for MPY of 10x 42: movep #$0000,x:BCR ; zero wait states in all ext. memory 43: ori #3,mr ; disable interrupts 44: movec #0,sp ; clear hardware stack pointer 45: move #0,omr ; mode 0: enable int. P:RAM, rst=0000 46: move #$40,r6 ; initialize stack pointer 47: move #-1,m6 ; linear addressing 48: 49: include 'ada_init.asm' ; init codecs for DSP 50: 51: 52: TONE_OUTPUT EQU HEADPHONE_EN+LINEOUT_EN+(4*LEFT_ATTN)+(4*RIGHT_ATTN) 53: TONE_INPUT EQU MIC_IN_SELECT+(15*MONITOR_ATTN) 54: 55: move #TONE_OUTPUT,y0 ; headphones, line out, mute spkr, no attn. 56: move y0,x:TX_BUFF_BASE+2 57: move #TONE_INPUT,y0 ; no input gain, monitor mute 58: move y0,x:TX_BUFF_BASE+3 59: 60: ;**** sine init *** 61: move #sin_ram,r3 ; Set r3 for Sine-Values 62: move #mask,m3 ; Loop Mode 63: movec #6,omr ;mode 0: enable int. P:RAM, rst=0000 - changed to enable the internal ROM 64: move #sinep,r1 ; Set r1 for Sine-Values in ROM 65: movec #mask,m1 ; Loop Mode 66: move #delta,n3 ; Use delta 67: do #256,sine2ram 68: move y:(r1)+,a ; Get ROM sine values 69: move a,x:(r3)+ ; store in RAM 70: sine2ram 71: move #sin_ram,r3 ; Set r3 for Sine-Values 72: movec #2,omr ; disable int. P:RAM, rst=0000 - changed to enable the internal ROM 73: ;**** end sine **** 74: ;**** fir init **** 75: move #wddr,r1 ; Samples Offset in Memory (x:r1) 76: move #cddr,r4 ; Coeff. Offset in Memory (y:r4) 77: move #n,m1 ; initialise circular buffers with 78: move m1,m4 ; the value n-1 (but only used for r4) 79: ;**** end fir ***** 80: 81: 82: opt cc ; Assembler-Directive for List Files 83: 84: loop ; Main Loop 85: jset #2,x:SSISR,* ; Wait for frame sync to pass. 86: jclr #2,x:SSISR,* ; Wait for frame sync. 87: 88: 89: move x:RX_BUFF_BASE,a ; get new samples left 90: move x:RX_BUFF_BASE+1,b ; get new samples right 91: add b,a ; a=a+b 92: asr a ; a/2 (half a) 93: jsr proceed_ht 94: 95: move a,x:TX_BUFF_BASE ; Put value in left channel tx. 96: move a,x:TX_BUFF_BASE+1 ; Put value in right channel tx. 97: 98: jmp loop ; jump to Main Loop 99: 100: proceed_ht 101: ;HT 102: move #cddr,r4 ; set r4 to start at coeff 0 103: move a,x:(r1) ; store samples in buffer 104: clr a x:(r1)+,x0 y:(r4)+,y0 ; get samples and coeffs. 105: rep #n ; do filter- 106: mac x0,y0,a x:(r1)+,x0 y:(r4)+,y0 ; loop and mult. 107: macr x0,y0,a ; and last mult. with last coeff. 108: move a,x0 109: move x:(r3),a ; last blub of sinus 110: move a,y0 111: mpy y0,x0,a 112: 113: ;z(k-1) 114: move #cddr2,r4 ; set r4 to start at coeff 0 115: nop ; need some time to load r4 116: clr b x:(r1)+,x0 y:(r4)+,y0 ; get samples and coeffs. 117: rep #n ; do filter- 118: mac x0,y0,b x:(r1)+,x0 y:(r4)+,y0 ; loop and mult. 119: macr x0,y0,b (r1)- ; and last mult. with last coeff. 120: 121: move b,x0 122: move #64,n3 ; Use delta ; load cosinus value 123: nop ; cosinus 124: move x:(r3+n3),b ; last blub of cosinus 125: move b,y0 126: move #delta,n3 ; Use delta ; load sinus value 127: nop ; sinus 128: mpy y0,x0,b (r3)+n3 129: 130: 131: sub b,a ; b=b-a (b=verz-ht) 132: 133: rts 134: 135: 136: include 'txrx_isr.asm' ; ISR's for in- and output 137: 138: end
1: dc -0.000760 2: dc -0.003495 3: dc -0.002572 4: dc -0.002953 5: dc -0.001894 6: dc 0.000083 7: dc 0.002928 8: dc 0.006047 9: dc 0.008604 10: dc 0.009629 11: dc 0.008279 12: dc 0.004124 13: dc -0.002620 14: dc -0.010941 15: dc -0.019087 16: dc -0.024795 17: dc -0.025699 18: dc -0.019836 19: dc -0.006146 20: dc 0.015167 21: dc 0.042466 22: dc 0.072839 23: dc 0.102498 24: dc 0.127409 25: dc 0.144004 26: dc 0.149824 27: dc 0.144004 28: dc 0.127409 29: dc 0.102498 30: dc 0.072839 31: dc 0.042466 32: dc 0.015167 33: dc -0.006146 34: dc -0.019836 35: dc -0.025699 36: dc -0.024795 37: dc -0.019087 38: dc -0.010941 39: dc -0.002620 40: dc 0.004124 41: dc 0.008279 42: dc 0.009629 43: dc 0.008604 44: dc 0.006047 45: dc 0.002928 46: dc 0.000083 47: dc -0.001894 48: dc -0.002953 49: dc -0.002572 50: dc -0.003495 51: dc -0.000760
1: dc -0.000933 2: dc -0.003432 3: dc -0.000055 4: dc 0.002735 5: dc 0.003817 6: dc -0.000032 7: dc -0.005481 8: dc -0.005875 9: dc 0.001369 10: dc 0.009558 11: dc 0.008258 12: dc -0.004237 13: dc -0.015607 14: dc -0.010735 15: dc 0.009677 16: dc 0.024696 17: dc 0.013052 18: dc -0.019949 19: dc -0.039726 20: dc -0.014946 21: dc 0.042337 22: dc 0.072728 23: dc 0.016189 24: dc -0.127521 25: dc -0.282896 26: dc 0.650046 27: dc -0.282896 28: dc -0.127521 29: dc 0.016189 30: dc 0.072728 31: dc 0.042337 32: dc -0.014946 33: dc -0.039726 34: dc -0.019949 35: dc 0.013052 36: dc 0.024696 37: dc 0.009677 38: dc -0.010735 39: dc -0.015607 40: dc -0.004237 41: dc 0.008258 42: dc 0.009558 43: dc 0.001369 44: dc -0.005875 45: dc -0.005481 46: dc -0.000032 47: dc 0.003817 48: dc 0.002735 49: dc -0.000055 50: dc -0.003432 51: dc -0.000933
1: dc 0.002019 2: dc 0.005486 3: dc 0.002743 4: dc 0.000092 5: dc -0.002572 6: dc -0.000848 7: dc 0.001910 8: dc -0.000233 9: dc -0.009619 10: dc -0.018818 11: dc -0.016346 12: dc 0.000445 13: dc 0.019122 14: dc 0.023040 15: dc 0.010471 16: dc 0.000045 17: dc 0.011415 18: dc 0.038169 19: dc 0.044766 20: dc -0.000644 21: dc -0.085082 22: dc -0.146145 23: dc -0.119237 24: dc 0.000408 25: dc 0.140411 26: dc 0.202226 27: dc 0.140411 28: dc 0.000408 29: dc -0.119237 30: dc -0.146145 31: dc -0.085082 32: dc -0.000644 33: dc 0.044766 34: dc 0.038169 35: dc 0.011415 36: dc 0.000045 37: dc 0.010471 38: dc 0.023040 39: dc 0.019122 40: dc 0.000445 41: dc -0.016346 42: dc -0.018818 43: dc -0.009619 44: dc -0.000233 45: dc 0.001910 46: dc -0.000848 47: dc -0.002572 48: dc 0.000092 49: dc 0.002743 50: dc 0.005486 51: dc 0.002019
1: ;Hilbert Koeffizienten
2: dc 0.00000000
3: dc -0.00013048
4: dc 0.00000000
5: dc -0.00020297
6: dc 0.00000000
7: dc -0.00035472
8: dc 0.00000000
9: dc -0.00057525
10: dc 0.00000000
11: dc -0.00088386
12: dc 0.00000000
13: dc -0.00130330
14: dc 0.00000000
15: dc -0.00185940
16: dc 0.00000000
17: dc -0.00258167
18: dc 0.00000000
19: dc -0.00350380
20: dc 0.00000000
21: dc -0.00466413
22: dc 0.00000000
23: dc -0.00610684
24: dc 0.00000000
25: dc -0.00788379
26: dc 0.00000000
27: dc -0.01005748
28: dc 0.00000000
29: dc -0.01270578
30: dc 0.00000000
31: dc -0.01592974
32: dc 0.00000000
33: dc -0.01986676
34: dc 0.00000000
35: dc -0.02471351
36: dc 0.00000000
37: dc -0.03076748
38: dc 0.00000000
39: dc -0.03850710
40: dc 0.00000000
41: dc -0.04875987
42: dc 0.00000000
43: dc -0.06309452
44: dc 0.00000000
45: dc -0.08488545
46: dc 0.00000000
47: dc -0.12293115
48: dc 0.00000000
49: dc -0.20954492
50: dc 0.00000000
51: dc -0.63572818
52: dc 0.00000000
53: dc 0.63572818
54: dc -0.00000000
55: dc 0.20954492
56: dc -0.00000000
57: dc 0.12293115
58: dc -0.00000000
59: dc 0.08488545
60: dc -0.00000000
61: dc 0.06309452
62: dc -0.00000000
63: dc 0.04875987
64: dc -0.00000000
65: dc 0.03850710
66: dc -0.00000000
67: dc 0.03076748
68: dc -0.00000000
69: dc 0.02471351
70: dc -0.00000000
71: dc 0.01986676
72: dc -0.00000000
73: dc 0.01592974
74: dc -0.00000000
75: dc 0.01270578
76: dc -0.00000000
77: dc 0.01005748
78: dc -0.00000000
79: dc 0.00788379
80: dc -0.00000000
81: dc 0.00610684
82: dc -0.00000000
83: dc 0.00466413
84: dc -0.00000000
85: dc 0.00350380
86: dc -0.00000000
87: dc 0.00258167
88: dc -0.00000000
89: dc 0.00185940
90: dc -0.00000000
91: dc 0.00130330
92: dc -0.00000000
93: dc 0.00088386
94: dc -0.00000000
95: dc 0.00057525
96: dc -0.00000000
97: dc 0.00035472
98: dc -0.00000000
99: dc 0.00020297
100: dc -0.00000000
101: dc 0.00013048
102: dc -0.00000000
1: ;Verzoegerungsglied
2: dc 0.00000000
3: dc 0.00000000
4: dc 0.00000000
5: dc 0.00000000
6: dc 0.00000000
7: dc 0.00000000
8: dc 0.00000000
9: dc 0.00000000
10: dc 0.00000000
11: dc 0.00000000
12: dc 0.00000000
13: dc 0.00000000
14: dc 0.00000000
15: dc 0.00000000
16: dc 0.00000000
17: dc 0.00000000
18: dc 0.00000000
19: dc 0.00000000
20: dc 0.00000000
21: dc 0.00000000
22: dc 0.00000000
23: dc 0.00000000
24: dc 0.00000000
25: dc 0.00000000
26: dc 0.00000000
27: dc 0.00000000
28: dc 0.00000000
29: dc 0.00000000
30: dc 0.00000000
31: dc 0.00000000
32: dc 0.00000000
33: dc 0.00000000
34: dc 0.00000000
35: dc 0.00000000
36: dc 0.00000000
37: dc 0.00000000
38: dc 0.00000000
39: dc 0.00000000
40: dc 0.00000000
41: dc 0.00000000
42: dc 0.00000000
43: dc 0.00000000
44: dc 0.00000000
45: dc 0.00000000
46: dc 0.00000000
47: dc 0.00000000
48: dc 0.00000000
49: dc 0.00000000
50: dc 0.00000000
51: dc 0.00000000
52: dc 1.00000000
53: dc 0.00000000
54: dc 0.00000000
55: dc 0.00000000
56: dc 0.00000000
57: dc 0.00000000
58: dc 0.00000000
59: dc 0.00000000
60: dc 0.00000000
61: dc 0.00000000
62: dc 0.00000000
63: dc 0.00000000
64: dc 0.00000000
65: dc 0.00000000
66: dc 0.00000000
67: dc 0.00000000
68: dc 0.00000000
69: dc 0.00000000
70: dc 0.00000000
71: dc 0.00000000
72: dc 0.00000000
73: dc 0.00000000
74: dc 0.00000000
75: dc 0.00000000
76: dc 0.00000000
77: dc 0.00000000
78: dc 0.00000000
79: dc 0.00000000
80: dc 0.00000000
81: dc 0.00000000
82: dc 0.00000000
83: dc 0.00000000
84: dc 0.00000000
85: dc 0.00000000
86: dc 0.00000000
87: dc 0.00000000
88: dc 0.00000000
89: dc 0.00000000
90: dc 0.00000000
91: dc 0.00000000
92: dc 0.00000000
93: dc 0.00000000
94: dc 0.00000000
95: dc 0.00000000
96: dc 0.00000000
97: dc 0.00000000
98: dc 0.00000000
99: dc 0.00000000
100: dc 0.00000000
101: dc 0.00000000
102: dc 0.00000000
Der PIC ist zuständig für die Eingaben vom und die Ausgaben zum Benutzer.
Der Benutzer wählt über die Tasten das gewünschte Programm und der PIC teilt dies dem DSP mit. Zusätzlich gibt der PIC ein Menü am LC-Display aus. Die Verbindung vom PIC zum DSP umfasst Datenleitung und eine IRQ-Leitung die dem DSP mitteilt das neue Daten anliegen.
1: list p=16f84 2: 3: ;------------------------------------------------------------------------ 4: ; pic_tst2.asm 5: ; (C) by Leo Eibler 20001111 (mailto:leo@sprossenwanne.at) 6: ; LU: 20001112 7: ; DSP Project Site: http://sprossenwanne.yi.org/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: ;------------------------------------------------------------------------ 15: ; kompiliert wurde das Programm mit 02.50.02 16: ; geflasht mit IC-Prog 1.01 17: ; Einstellungen: JDM Programmer, Oscillator XT, nothing else 18: ;------------------------------------------------------------------------ 19: 20: status equ 03h 21: rp0 equ 05h ;SpeicherBank Auswahlbit 22: rp1 equ 06h ;SpeicherBank Auswahlbit 23: intcon equ 0Bh 24: porta equ 05h 25: trisa equ 85h 26: portb equ 06h 27: trisb equ 86h 28: sp1 equ 0Ch ;Zeichenausgabe 29: sp2 equ 0Dh ;Zeichenausgabe 30: sp3 equ 0Eh ;Delay Schleife 31: sp4 equ 0Fh ;Delay Schleife 32: sp5 equ 10h ;Entprell-Delay-Schleife 33: sp6 equ 11h ;Entprell-Delay-Schleife 34: sp7 equ 12h 35: sp8 equ 13h 36: sp9 equ 14h ;EnableInt,Outstate 37: sp10 equ 15h 38: sp11 equ 16h 39: sp12 equ 17h 40: sp13 equ 18h 41: 42: ; sp9: 43: ; bit0: auf 0: ECHO DISABLE 1: ECHO ENABLE 44: ; bit1: auf 0: HOCHPASS 1: TIEFPASS 45: ; bit6: auf 0: wenn kein Int. 1: nach Interrupt 46: ; bit7: auf 0: disable ISR 1: enable ISR 47: ; bit0 und bit1 werden an RA0 und RA1 gespiegelt. 48: 49: org 00h ; Reset Vector 50: goto start 51: 52: ;------------------------------------------------------------------------ 53: ; ISR's 54: 55: org 004h ; Startvector (Interrupt) 56: 57: btfss sp9,7 ; Bit7 auf 0: 58: goto end_isr ; Interrupt sofort beenden 59: 60: call Entprellen 61: 62: 63: btfsc portb,4 ; Taster an RB4 betaetigt 64: goto a1 65: 66: btfsc portb,5 ; Taster an RB5 betaetigt 67: goto a2 68: 69: goto aout ; anscheinend nix von beiden ;-) 70: 71: a1: ; high-Pegel an RB4 72: incf sp8,1 ; debug variable hochzaehlen und 73: bsf porta,2 ; debug port (RA2) auf 1 setzen 74: btfss sp9,0 75: goto set_sp90 76: bcf sp9,0 ; ausschalten, wenn eingschalten 77: bcf porta,0 ; von ECHO Bit 78: goto aout 79: set_sp90 80: bsf sp9,0 ; einschalten, wenn ausgschalten 81: bsf porta,0 ; von ECHO Bit 82: goto aout 83: 84: a2: ; high-Pegel an RB4 85: decf sp8,1 ; debug variable hochzaehlen und 86: bcf porta,2 ; debug port (RA2) auf 0 setzen 87: btfss sp9,1 88: goto set_sp91 89: bcf sp9,1 ; wenn TIEFPASS auf 90: bcf porta,1 ; HOCHPASS schalten 91: goto aout 92: set_sp91 93: bsf sp9,1 ; wenn HOCHPASS auf 94: bsf porta,1 ; TIEFPASS schalten 95: 96: aout: ; da ein Interrupt ausgloest wurde, 97: call menu ; Menu anzeigen bzw. updaten 98: bsf sp9,6 ; Bit 6 setzen (debug) 99: end_isr: 100: bcf intcon,0 ; PortChangeInterruptFlag rueckset. 101: retfie 102: 103: ;------------------------------------------------------------------------ 104: start: 105: bcf sp9,6 ; debug bit fuer Interrupt 106: bcf sp9,7 ; keine Interrupts erlauben 107: ; clrf portb 108: ; bcf status,rp1 ; aus irgendeinem Grund kennt der 109: ; bsf status,rp0 ; Assembler das net, dass ich auf 110: ; Bank1 schalten will. *grrrrr* 111: movlw b'11110000' ; RB0-3 auf Ausg. RB4-7 auf Eing. 112: ; movwf trisb 113: tris portb ; TrisRegister mit altem Befehl set 114: 115: ; clrf porta 116: ; bcf status,rp1 ; aus irgendeinem Grund kennt der 117: ; bsf status,rp0 ; Assembler das net, dass ich auf 118: ; Bank1 schalten will. *grrrrr* 119: movlw b'00000000' ; RA0-3 auf Ausgang 120: ; movwf trisa 121: tris porta ; TrisRegister mit altem Befehl set 122: 123: bcf portb,2 ; LCD: Instruction Code 124: bcf portb,3 ; LCD: Enable Signal 125: 126: movlw 0h ; Debug Register auf 127: movwf sp8 ; 0 setzen 128: 129: 130: movlw b'10001000' ; Enable Global Ints 131: movwf intcon ; Enable PortChange Ints. 132: 133: 134: ;------------------------------------------------------------------------ 135: ;Display Init 136: endlos: 137: bcf portb,2 ; LCD: Instruction Code 138: 139: movlw b'00000001' ; Display Clear 140: call dataout 141: 142: movlw b'00000110' ; Entry Mode Set 143: call dataout 144: 145: movlw b'00001100' ; Display On 146: call dataout 147: 148: movlw b'00111000' ; Set Function 149: call dataout 150: 151: bsf portb,2 ; LCD: Data Code 152: 153: ; bcf portb,2 ; enable lcd control 154: ; movlw 2h ; position 2 155: ; call dataout 156: ; bsf portb,2 ; enable lcd data 157: 158: movlw b'01000100' ;D 159: call dataout 160: movlw b'01010011' ;S 161: call dataout 162: movlw b'01010000' ;P 163: call dataout 164: movlw b'00101101' ;- 165: call dataout 166: movlw b'01010000' ;P 167: call dataout 168: movlw 72h ;r 169: call dataout 170: movlw 6fh ;o 171: call dataout 172: movlw 6Ah ;j 173: call dataout 174: movlw 65h ;e 175: call dataout 176: movlw 63h ;c 177: call dataout 178: movlw 74h ;t 179: call dataout 180: 181: bcf portb,2 182: movlw b'11000000' ; LCD: 2. Zeile, Pos. 0 183: call dataout 184: bsf portb,2 185: 186: 187: movlw 62h ;b 188: call dataout 189: movlw 79h ;y 190: call dataout 191: movlw 20h ;192: call dataout 193: movlw b'01001100' ;L 194: call dataout 195: movlw b'01100101' ;e 196: call dataout 197: movlw b'01101111' ;o 198: call dataout 199: movlw 26h ;& 200: call dataout 201: movlw 4eh ;N 202: call dataout 203: movlw 69h ;i 204: call dataout 205: movlw 63h ;c 206: call dataout 207: movlw b'01101111' ;o 208: call dataout 209: 210: ; bcf portb,2 211: ; movlw 0eh 212: ; call dataout 213: bsf portb,2 ; LCD: Data Code 214: 215: ; movf sp8,0 216: ; addwf 30h,0 ;ascii wert von 0 dazuaddieren und ausgeben 217: ; call dataout 218: 219: call zeit_30_1ms 220: call zeit_30_1ms 221: ; LCD: Data Code 222: bsf portb,2 223: call dataout 224: movlw 20h ; 225: call dataout 226: movlw 6fh ;o 227: call dataout 228: movlw 6bh ;k 229: bsf sp9,7 230: 231: ;------------------------------------------------------------------------ 232: x: ; Endlosschleife 233: ; Beginn mit kleiner Animation ;-) 234: 235: bcf portb,2 236: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 237: call dataout 238: bsf portb,2 239: movlw 2eh ;. 240: call dataout 241: 242: call zeit_30_1ms 243: 244: bcf portb,2 245: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 246: call dataout 247: bsf portb,2 248: movlw 6fh ;o 249: call dataout 250: 251: call zeit_30_1ms 252: 253: bcf portb,2 254: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 255: call dataout 256: bsf portb,2 257: movlw 4fh ;O 258: call dataout 259: 260: call zeit_30_1ms 261: 262: bcf portb,2 263: movlw b'11001111' ; LCD: 2. Zeile, Pos. 15 264: call dataout 265: bsf portb,2 266: movlw 6fh ;o 267: call dataout 268: 269: call zeit_30_1ms 270: 271: goto x ; Endlos-Schleife, Animation 272: 273: ;------------------------------------------------------------------------ 274: menu: ; Menu (von ISR aufgerufen) 275: bcf portb,2 276: movlw b'00000110' ; Entry Mode Set 277: call dataout 278: 279: movlw b'00111000' ; Set Function 280: call dataout 281: 282: movlw b'11000000' ; LCD: 2. Zeile, Pos. 0 283: call dataout 284: bsf portb,2 285: 286: movlw 5bh ;[ 287: call dataout 288: 289: btfss sp9,0 ; Wenn Bit 0 Clear 290: goto no_echo ; -> ECHO DISABLED 291: 292: movlw 45h ;E 293: call dataout 294: movlw 43h ;C 295: call dataout 296: movlw 48h ;H 297: call dataout 298: movlw 4Fh ;O 299: call dataout 300: 301: goto filter 302: 303: no_echo: 304: movlw 20h ; 305: call dataout 306: movlw 20h ; 307: call dataout 308: movlw 20h ; 309: call dataout 310: movlw 20h ; 311: call dataout 312: 313: filter: 314: 315: movlw 5dh ;] 316: call dataout 317: movlw 20h ; 318: call dataout 319: movlw 5bh ;[ 320: call dataout 321: 322: btfss sp9,1 ; Wenn Bit 1 Clear -> HOCHPASS 323: goto filter_hochpass 324: 325: filter_tiefpass: 326: movlw 54h ;T 327: call dataout 328: goto filter_end 329: 330: filter_hochpass: 331: movlw 48h ;H 332: call dataout 333: 334: filter_end: 335: movlw 50h ;P 336: call dataout 337: movlw 5dh ;] 338: call dataout 339: 340: movlw 20h ; 341: call dataout 342: movlw 20h ; 343: call dataout 344: movlw 20h ; 345: call dataout 346: movlw 20h ; 347: call dataout 348: 349: ; bcf sp9,6 ; Wenn nicht aus ISR aufgerufen 350: return 351: 352: ;------------------------------------------------------------------------ 353: ; Zeichen Ausgabe: 354: 355: dataout: 356: movwf sp1 357: bcf status,0 358: movlw b'00001001' 359: movwf sp2 360: 361: dataout1: 362: decfsz sp2,1 363: goto dataout2 364: goto uu 365: return 366: 367: dataout2: 368: rrf sp1,1 ; Daten seriell auf das 369: btfss status,0 ; Schieberegister ausgeben 370: goto null 371: goto eins 372: 373: null: 374: bcf portb,0 ; Serial Input von Schieberegister 375: 376: call clock 377: goto dataout1 378: 379: eins: 380: bsf portb,0 ; Serial Input von Schieberegister 381: 382: call clock 383: goto dataout1 384: 385: clock: 386: bcf portb,1 ; Clock Input von Schieberegister 387: bsf portb,1 ; einen Taktflanke erzeugen, damit 388: bcf portb,1 ; das naechste Bit uebernommen wird 389: return 390: 391: uu: 392: bcf portb,3 ; Und schliesslich 393: call zeit_13_1ms ; 394: bsf portb,3 ; Enable Signal fuer LCD erzeugen 395: call zeit_13_1ms ; 396: bcf portb,3 ; und wieder loeschen 397: return 398: 399: ;------------------------------------------------------------------------ 400: ; zeit_13_1ms 401: 402: zeit_13_1ms: 403: movlw b'00000111' 404: movwf sp3 405: 406: movlw b'00000001' 407: movwf sp4 408: 409: zeit_13_2ms: 410: decfsz sp3,1 411: goto zeit_13_3ms 412: return 413: 414: zeit_13_3ms: 415: decfsz sp4,1 416: goto zeit_13_3ms 417: goto zeit_13_2ms 418: 419: ;------------------------------------------------------------------------ 420: ; Zeit_30ms => 325,125 msec 421: 422: zeit_30ms: 423: call zeit_30_1ms 424: return 425: 426: zeit_30_1ms: 427: movlw b'11111111' 428: movwf sp3 429: 430: zeit_30_2ms: 431: movlw b'11111111' 432: movwf sp4 433: decfsz sp3,1 434: goto zeit_30_3ms ; 255 * 1,275 msec = 325,125 msec 435: return 436: 437: zeit_30_3ms: 438: decfsz sp4,1 439: goto zeit_30_4ms ; 255 * 5µsec = 1,275 msec 440: goto zeit_30_2ms 441: 442: zeit_30_4ms: 443: nop ; 4 Mhz Takt => 444: nop ; 1 µsec pro befehl 445: nop ; 446: nop ; 5*nop=5 µsec 447: nop ; 448: goto zeit_30_3ms 449: 450: ;------------------------------------------------------------------------ 451: ; Entprellen 452: 453: Entprellen 454: nop 455: call zeit_4x_1ms 456: nop 457: call zeit_4x_1ms 458: nop 459: return 460: 461: zeit_4x_1ms: 462: movlw b'11111111' 463: movwf sp5 464: 465: zeit_4x_2ms: 466: movlw b'00000110' 467: movwf sp6 468: decfsz sp5,1 469: goto zeit_4x_3ms 470: return 471: 472: zeit_4x_3ms: 473: decfsz sp6,1 474: goto zeit_4x_4ms 475: goto zeit_4x_2ms 476: 477: zeit_4x_4ms: 478: nop 479: goto zeit_4x_3ms 480: 481: end ; und zu Ende is unser schoenes Prog. 482: 483: ;------------------------------------------------------------------------ 484: ; check out the DSP Project Site: 485: ; http://blub2k.no-ip.com/dsp/ 486: ; http://sprossenwanne.yi.org/dsp/ or http://sprossenwanne.myip.org/dsp/ 487: ; mailto: leo@sprossenwanne.at 488: ;------------------------------------------------------------------------ 489: ; einige Teile des Programmcodes wurden von der MaturaDoku der Schueler 490: ; Eggler/Geiger 1998/99 Schellinggasse, Wien1, Oesterreich entnommen. 491: ;------------------------------------------------------------------------ 492: 493:
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
Datum | Eintrag | Link |
---|---|---|
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 | http://www.microchip.com/ |
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. | -- |
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.201 | 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) | -- |