MATURAPROJEKT - EIBLER, EDTINGER - DSP

Index

1. Projektdaten

Teilnehmer

Zeitraum

Kurzbeschreibung

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.

short description

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.

Projektverlauf (deutsch)

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.

Projektverlauf (englisch)

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.

2.1. Programme - FIR Filter

Erklärung

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.

y(n) = c(0)*(n) + c(1)*(n-1) + c(2)*(n-2) ....

Nach Korrektur des Fehlers ergab die Analyse mit dem Spetrumanalyzer (roter Verlauf) einen Verlauf wie in der Theorie mit Matlab (blauer Verlauf).

Programme

firfilt.cmd

  1: force reset
  2: change omr 0
  3: load firecho
  4: go 0
  5: 

firfilt.asm

  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

2.2. Programme - FIR Filter mit Echo

Erklärung

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.

y = f(x) + f(x-1)*0.5 + x

Programme

firecho.cmd

  1: force reset
  2: change omr 0
  3: load firfilt
  4: go 0
  5: 

firecho.asm

  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

2.3. Gemeinsame Include-Datei

Erklärung

Alle Programme haben eine gemeinsame Include-Datei, die die Initialisierung und allgemeine Variablen beinhaltet.

Programme

ada_init.asm

  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: 

2.4. Sinus Testproramm

Erklärung

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.

Programme

.asm


2.5. Modulationsfilter

Erklärung

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.

Programme

sinus3.asm

  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

2.6. Koeffizienten für FIR-Filter

Hier sind abwechselnd eine grafische Ausgabe und die FIR-Filter Koeffizienten für Tiefpass, Hochpass und Bandpass. Danach noch die Koeffizienten für den HT und das Verzögerunsglied.

Tiefpass

Matlab-Ausgabe

tp.inc

  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

Hochpass

Matlab-Ausgabe

hp.inc

  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

Bandpass

Matlab-Ausgabe

bp.inc

  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

Hilberttransformator

ht.inc

  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

Verzögerunsglied

z.inc

  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

2.7. PIC-Testprogramm

Erklärung

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.

Programme

pic_tst2.asm

  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: 

3. Kurzbeschreibung Matlab

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.

kleine Übersicht über die verwendeten Funktionen

ellip - elliptischer filter
[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')
freqs - fourier für analog
[H,w]=freqs(B,A,N)
B,A - Polynome vom Filter
N - Anzahl gerechneter Punkte
freqz - fourier für digital
siehe freqs
plot - grafische Darstellung
plot(x,y)
x,y - Punkte für die Achsen
bsp: plot(w/pi,20*log10(abs(H)))
x[y,:]
zeile y - alle spalten

4. Protokoll

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) --


Dokumentation online unter http://sprossenwanne.2y.net/school/project_dsp/