MATURAPROJEKT - EIBLER, EDTINGER - DSP

Index

 

1. Projektdaten

 

1.1. Teilnehmer

 

1.2. Zeitraum

 

1.3. 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 LC-Display gebracht werden.

 

1.4. short description

The vocals of a music-signal should be filtered out and pitched with the Motorola DSP 56000. This is mixed to the original signal. The whole DSP should be controlled via a PIC and the output displayed on a LCD.

 

1.5. Projektverlauf

Nachdem wir auf den PCs die nötige Software installiert hatten, arbeiteten wir uns in die DSP-Dokumentation ein. Dazu verwendeten wir ein fertiges Programm von Motorola mit einem Echo-Effekt. Auch kleine Änderungen die wir im Programm vornahmen funktionierten.

Als erstes eigenes Programm wurde uns aufgetragen aus einem kleinen Programm-Code Stück und dem Beispielprogramm einen FIR-Filter zu programmieren. Der funktionierte eigentlich auch recht bald, aber es war immer ein metallisches Geräusch im Ausgangssignal. Nach langer Fehlersuche mußten wir entdecken, dass der Fehler nicht an uns lag, sondern an einem groben Fehler im original Motorola Code-Stück. Nachdem wir den Fehler ausgebessert hatten funktionierte das Programm endlich so wie es sollte.

Deshalb verbanden wir die beiden Programme auch gleich zu einem FIR-Filter mit Echo.

Dies war dann auch eine gute Ausgangslage um unsere ersten Versuche mit der PIC-Steuerung zu machen. Wir nahmen als Grundlage eine Schaltung von einem alten Maturaprojekt und passten es an unsere Erfordernisse an. Die Kombination von FIR-Filter mit Echo und PIC und LCD Steuerung präsentierten wir am Tag der offenen Tür.

Danach machten wir uns an den Modulationsfilter. Zuerst sahen wir uns ihn in der Theory mit Matlab an und berechneten auch die Koeffizienten für den Hilbert-Transformator. In der Praxis benötigten wir Sinus und Cosinus-Werte weshalb wir zuerst einmal die fertige Tabelle die Motorola in den DSP integriert hat zum Versuch am Lautsprecher ausgaben. Damit konnten wir dann die nötigen Berechnungen durchführen. Wir realisierten den Hilbert-Transformator am DSP hatten aber am Anfang noch einige Probleme, da wir einen Fehler in unserem Code hatten.

Nachdem wir den Modulationsfilter fertig hatten verknüpften wir ihn mit einem Bandpass um nur die Frequenzen, die für ein Sängersignal interessant sind, zu modulieren. Wir mussten nur noch die PIC-Steuerung und den Interrupt-Handler am DSP an den Hilbert-Transformator anpassen um das Projekt fertigzustellen.

Hier und da könnten noch einige Verbesserungen vorgenommen werden die sich aber leider zeitmässig nicht mehr ausgehen. Deshalb schliessen wir das Projekt in diesem Zustand ab.

 

1.6. course of the project

After we installed the needed Software on the Projet-PCs, we began to read the DSP-Documentation. We used a ready-to-go Demo-Program from Motorola with an echo-effect. We made some changes on this code and it still worked.

For our first own Program we were told to make a complete FIR-Filter based on a small code fragment from Motorola. We finished this task fast, but the signal was muffled. After a long Bughunt we discovered, that it was not our fault. The bug was in the original Motorola-Code. After we corrected the bug the filter worked as excpected.

Based on these two codes we made a filter with echo-effect to train our skills.

With this filter we began our first steps with the PIC. We made a board based in the design from an class before us. We presented our combination of DSP, PIC and LCD on the "tag der offenen tür".

After that we began with the modulationfilter. At the beginnig we tested some modulationfilter in theory with Matlab and calculated a hilbert transformator. For the DSP we needed its internal sinus-table and so we made a program to get to know how this works. With that know-how we realized the program for the modulationfilter, but we had some problems because we made a bug in our code.

Then we took the the Bandpass and filtered the singer before the modulationfilter. We just had to adjust the PIC-control a little bit to use it with the new filter.

The project is now finished. If we had more time we could change some things to do it better.

 

2. Verwendete Hard- und Software

 

2.1. Matlab

Matlab Kommandofenster, Debugger, grafische Ausgabe 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.

 

2.1.1. 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
remez - Remez Filter
[B]=remez(N,Wn,A[,filterart]);
N - die Ordnung
Wn - Grenzfrequenz (bei Digi. [0;1] - 1 = Samplingfrequenz/2)
A - Amplitude [0;1]
filterart - optional: zB 'HILBERT' für einen Hilbertfilter
fopen - file öffnen
fh=fopen('lw:\some\path\filename', 'w');
fh - Filehandle
w - Zugriffsart schreiben
fclose - file schliessen
fclose(fh);
fh - Filehandle
fprintf - in file schreiben
fprintf(fh, formatstring, args);
fh - Filehandle
formatstring - zB: 'dc %1.8f\r\n'
args - Argumente für %1.8f
 

2.2. ICProg

ICProg Programmfenster

Dies ist ein Tool, um den PIC mit dem JDM Programmer zu programmieren. Man lädt einfach nur das HEX File welches man vorher mit zB dem MPASMWin vom MPLab erstellt hat.
Danach ist darauf zu achten, dass die richtige COM Schnittstelle, und der richtige Programmer eingestellt ist (in unserem Fall der JDM Programmer).
Nun ist noch, ausser dem richtigen Prozessor, auszuwählen, ob man Watchdog benutzen will (wir nicht) und welcher Taktgenerator verwendet wird (in unserem Fall wäre das XT für einen Quarzschwingkreis).

 

2.3. Motorola DSP 56002

EVM56k Entwicklungsboard mit Motorola DSP56002 im Einsatz mit Stimmenverzerrer

Der DSP56002 von Motorola ist heutzutage noch ein viel eingesetzter Digitaler Signal Prozessor. Die verschiedenen Einsatzzwecke erstrecken sich von Audio Anwendungen (in unserem Fall Echo, Hall, Stimmenverzerrung oder Equalizer), Codec Routinen, Einsatz in der Telefonie (DTMF Routinen, diverse Filterfunktionen, ISDN, ...), Funkübertragungen, Grafik und Bildverarbeitung (Bilderkennung) usw. bis zur Datenverschlüsselung und Einsatz in der Medizin

 

2.3.1. EVM56k Board

Wir benutzen das EVM56k Entwicklungsboard, welches als Herzstück den Motorola DSP56002 verwendet. Das Board besitzt mehrere Ein- und Ausgangsports (3 Stück), welche teilweise zur Erweiterung dienen (um das Programm in einem externen Speicher unterzubringen - EPROM) oder um mit externer Peripherie zu kommunizieren (PortB).
Weiters gibt es eine serielle Schnittstelle, über die der DSP im Entwicklungsstadium programmiert und debugged wird.
Es sind auch 1 Audio Eingang (wahlweise Mikrofon oder Line - softwarekonfigurierbar) vorhanden sowie 2 Audioausgänge (Line Out und Kopfhörer).
Das Board besitzt ebenfalls einen Festspannungsregler, um die Betriebsspannung konstant zu halten und taktet den DSP mit 40 MHz.

 

2.3.2. Daten des DSP56002

 

2.3.3. Entwicklung

Zur Entwicklung dienten Vorerst 486er DX4 Rechner @100 MHz und dem Betriebssystem Win95. Die Software zum Programmieren des DSP und zum Debuggen gibt es sowohl für DOS als auch für Windows. Jetzt befindet sich die Windows Version im Einsatz. Die Übertragungsrate zum DSP beträgt 19200 Baud. Der Assembler ist ein reines DOS Kommandozeilen Programm.

 

2.4. JDM Programmer

der JDM Programmer
Der JDM Programmer wurde von uns selbst aufgebaut. Er wird von dem Programm ICProg angesprochen und benötigt beim Programmieren keine zusätzliche Spannungsversorgung. Dadurch kann es zu Problemen kommen, beim Einsatz mit Notebooks (Vermutung auf Grund der niedrigeren Spannungspegeln der seriellen Schnittstelle).
Mit dem JDM Programmer kann der PIC 16F84 programmiert werden. Selbst der Takt wird vom PC generiert.

 

2.5. PIC Steuer Platine

Diese Platine dient dazu, den DSP Rechnerunabhängig zu Steuern. Gleichzeitig wird auf dem LCD Display der Status angezeigt (in unserem Beispiel zB der Delta Wert). Die Platine besitzt momentan 2 Taster, wobei einer für die Menüauswahl zuständig ist und der andere für die Auswahl des jeweiligen Wertes. Gesteuert und verarbeitet werden die ganzen Daten von einem PIC16F84. Weiters besitzt die Platine 4 Ausgangs I/O Ports die mit dem DSP verbunden sind plus eine zusätzliche Leitung die den Interrupt am DSP auslöst, falls neue Daten an den 4 Portpins anliegen.
Die Ansteuerung des Displays erfolgt mit Hilfe eines Schieberegisters. Dadurch sind nur mehr 4 Portleitungen nötig und die restlichen 4 Portleitungen können für Taster Eingaben benutzt werden.
Die Platine hat ebenfalls einen Festspannungsregler onboard, um Spannungsschwankungen auszugleichen und eine exakte Gleichspannung zu liefern.

Die PIC Steuer Platine im Einsatz 

2.5.1. Daten des PIC16F84

 

3. Programme

 

3.1. Matlab Scripts

Jede Funktion in Matlab ist eine eigene Datei. Deshalb ist der gesamte Scriptcode auf 4 Dateien aufgespalten.
filterpass berechnet einen Remez-Filter. Mit dieser Funktion werden in tiefpass die Koeffizienten für ein Tiefpass-Filter berechnet. Die Funktion dofilter berechnet die Koeffizienten für den Hilbert-Transformator und das Verzögerungsglied, und speichert diese in y1.inc und y2.inc. Die Funktion gesamt erledigt mit Hilfe der anderen Funktionen die nötigen Berechnungen und gibt sie grafisch aus.

 

3.1.1. filterpass.m

  1: function [VAL] = filterpass(Sig, N, Freq, Ampl)
  2: 
  3: 
  4: B=remez(N,Freq,Ampl);
  5: VAL=filter(B,1,Sig);
 

3.1.2. tiefpass.m

  1: function [VAL] = tiefpass(Sig, N, GrenzFreq)
  2: 
  3: VAL=filterpass(Sig, N, [0 (GrenzFreq-0.1) (GrenzFreq+0.1) 1],[1 1 0 0]);
 

3.1.3. dofilter.m

  1: function [RE] = dofilter (Sig, N, Freq, n2)
  2: 
  3: 
  4: B=remez(N,[.05 .95],[1 1],'HILBERT');
  5: Y1=filter(B,1,Sig);
  6: V=zeros(1,N+1);
  7: V(N/2+1)=1;
  8: Y2=filter(V,1,Sig);
  9: %% plot(abs(fft(Y2+j*Y1)))
 10: RE=cos(Freq*n2).*Y2-Y1.*sin(Freq*n2);
 11: 
 12: 
 13: fh=fopen('c:\temp\y1.inc', 'w');
 14: fprintf(fh, ';Hilbert Koeffizienten\r\n');
 15: fprintf(fh, '   dc %1.8f\r\n', B);
 16: fclose(fh);
 17: fh=fopen('c:\temp\y2.inc', 'w');
 18: fprintf(fh, ';Verzoegerungsglied\r\n');
 19: fprintf(fh, '   dc %1.8f\r\n', V);
 20: fclose(fh);
 21: 
 

3.1.4. gesamt.m

  1: function gesamt
  2: 
  3: T=[0:1:255];
  4: s=zeros(1,256);
  5: s(1)=1;
  6: S=tiefpass(s,100,0.5);
  7: plot(abs(fft(S)));
  8: pause;
  9: f=dofilter(S,100,pi/8,T);
 10: plot(abs(fft(f)));
 

3.2. DSP Programm

 

3.2.1. Grundlagen

Der FIR-Filter selber multipliziert nur das Eingangssignal mit den einzelnen Koeffizienten und nimmt die Summe aus diesen Produkten. Die Hauptarbeit ist also die Berechnung der Koeffizienten und das wird in Matlab gemacht.

Beim Hilberttransformator werden zwei FIR-Filter benötigt (HT-Glied und Verzögerungsglied). Das Ergebniss wird nach
Re{} = yz[] * cos(f * n[]) - yHT[] * sin(f * n[]) berechnet.

 

3.2.2. Erklärung zum Programm

Das DSP Programm besteht aus drei Teilen.
Im ersten werden die Initialisierungen vorgenommen. Hier sind die Konstanten definiert, die Register werden geladen und die Sinus-Tabelle wird aus dem ROM Bereich in die zweite Speicherbank geladen.
Der zweite Teil beinhaltet das Hauptprogramm. Die Samples werden mit den Subroutinen proceed_ht (Hilbert-Transformator) und proceed_filter (Bandpass) bearbeitet und wieder ausgegeben. Leider ist der Zeitaufwand so hoch, dass beim verwendeten DSP die Samplingfrequenz nur 16kHz beträgt.
Der letzte Teil ist die Interrupt-Routine. Es wird das am Port anliegende Datennibbel als Delta-Wert für den Hilbert-Transformator gespeichert.

 

3.2.3. hilbert.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: wddr2    equ    $200    ; samples offset in x memory
 10: cddr    equ     $100    ; coeffizidings offset in y memory
 11: cddr2   equ     $200    ; coeffizidings offset2 in y memory
 12: cddr3   equ     $500    ; coeff. for BP
 13: tmp     equ     $800    ; temp var
 14: aint    equ     $808    ; save a for int
 15: bint    equ     $810    ; save b for int
 16: x0int   equ     $818    ; save x0 for in
 17: ;;**** end init ****
 18: sin_ram   equ     $400  ; sine table in x:ram
 19: sinep     equ     $100  ; when de=1 in omr -> $100 sinetable in rom
 20: mask      equ     255   ; 255 values in m-register
 21: ;; delta     equ     2     ; delta value for sine
 22: intmem    equ     $620    
 23: 
 24:         org     x:intmem  
 25: delta   bsc     4,$0      ; Delta Value in memory
 26: 
 27:         org     x:wddr    ; Reserved Memory for
 28: smpl    bsc     512,$0    ; Samples
 29: 
 30:         org     y:cddr    ; Hilbert
 31:         include 'y1.inc'  ; Coeffs. (e.g. Include File)
 32: 
 33:         org     y:cddr2   ; z(k-1)
 34:         include 'y2.inc'  ; Coeffs.
 35: 
 36:         org     y:cddr3   ; HP
 37:         include 'hp.inc'  ; coeff.
 38: 
 39:         org     x:sin_ram        ; Sine Values
 40: sintab  bsc     256,$FF          ; 256 Values (0 to Pi)
 41: 
 42:         org     p:0                     ;RESET Vector
 43:         jmp     START
 44: 
 45:         org     p:$0008
 46:         jsr     interrupt
 47: 
 48:         org     p:$000C
 49:         jsr     ssi_rx_isr              ;SSI RX
 50:         jsr     ssi_rx_isr              ;SSI RX w/Exception
 51:         jsr     ssi_tx_isr              ;SSI TX
 52:         jsr     ssi_tx_isr              ;SSI TX w/Exception
 53: 
 54:         org     p:START
 55: 
 56: 
 57:         include 'ada_init.asm'          ; init codecs for DSP
 58: 
 59:         movep   #$261009,x:PLL          ; set PLL for MPY of 10x
 60:         movep   #$0000,x:BCR            ; zero wait states in all ext. memory
 61:         ori     #3,mr                   ; disable interrupts
 62:         movec   #0,sp                   ; clear hardware stack pointer
 63:         move    #0,omr                  ; mode 0: enable int. P:RAM, rst=0000
 64:         move    #$40,r6                 ; initialize stack pointer
 65:         move    #-1,m6                  ; linear addressing
 66: 
 67: ;;irq a aktivieren
 68:         bclr        #$8,SR
 69:         bclr        #$9,SR
 70:         move        #$3003,a0
 71:         move        a0,x:IPR
 72: 
 73: TONE_OUTPUT     EQU     HEADPHONE_EN+LINEOUT_EN+(4*LEFT_ATTN)+(4*RIGHT_ATTN)
 74: TONE_INPUT      EQU     MIC_IN_SELECT+(15*MONITOR_ATTN)
 75: 
 76:         move    #TONE_OUTPUT,y0         ; headphones, line out, mute spkr, no attn.
 77:         move            y0,x:TX_BUFF_BASE+2
 78:         move    #TONE_INPUT,y0          ; no input gain, monitor mute
 79:         move            y0,x:TX_BUFF_BASE+3
 80: 
 81: ;;**** sine init ***
 82:         move    #sin_ram,r3       ; Set r3 for Sine-Values
 83:         move    #mask,m3          ; Loop Mode
 84:         movec   #6,omr            ;mode 0: enable int. P:RAM, rst=0000 -
 85:                                   ;changed to enable the internal ROM
 86:         move    #sinep,r1         ; Set r1 for Sine-Values in ROM
 87:         movec   #mask,m1          ; Loop Mode
 88:         move    x:delta,n3        ; Use delta
 89:         do      #256,sine2ram
 90:         move    y:(r1)+,a         ; Get ROM sine values
 91:         move    a,x:(r3)+         ; store in RAM
 92: sine2ram
 93:         move    #sin_ram,r3       ; Set r3 for Sine-Values
 94:         movec   #2,omr            ; disable int. P:RAM, rst=0000 -
 95:                                   ;changed to enable the internal ROM
 96: ;;**** end sine ****
 97: ;;**** fir init ****
 98:         move    #wddr,r1   ; Samples Offset in Memory (x:r1)
 99:         move    #wddr2,r2  ; Samples Offset in Memory (x:r2)
100:         move    #cddr,r4   ; Coeff. Offset in Memory (y:r4)
101:         move    #n,m1      ; initialise circular buffers with
102:         move    m1,m4      ; the value n-1 (but only used for r4)
103:         move    m1,m2      ; the value n-1 (but only used for r2)
104: ;;**** end fir *****
105: ;;**** IRQ init ***
106:         move   #1,a        ; initialize delta with 1
107:         move   a,x:delta   
108: ;;*** end IRQ init ***
109: 
110:         opt     cc         ; Assembler-Directive for List Files
111: 
112: loop                                    ; Main Loop
113:         jset    #2,x:SSISR,*            ; Wait for frame sync to pass.
114:         jclr    #2,x:SSISR,*            ; Wait for frame sync.
115: 
116: 
117:         move    x:RX_BUFF_BASE,a        ; get new samples left
118:         move    x:RX_BUFF_BASE+1,b      ; get new samples right
119:         add     b,a                     ; a=a+b
120:         asr     a                       ; a/2 (half a)
121:         move    a,x:tmp
122:         jsr     proceed_ht
123:         jsr     proceed_filter
124: 
125:         move    x:tmp,b
126:         asr     b
127:         asl     a
128:         add     b,a
129: 
130:         move    a,x:TX_BUFF_BASE        ; Put value in left channel tx.
131:         move    a,x:TX_BUFF_BASE+1      ; Put value in right channel tx.
132: 
133:         jmp     loop                    ; jump to Main Loop
134: 
135: proceed_filter                                  ; My FIR Filter Procedure
136:         move   #cddr3,r4
137: 
138:         move   a,x:(r2)                         ; store samples in buffer
139:         clr    a        x:(r2)+,x0  y:(r4)+,y0  ; get samples and coeffs.
140:         rep    #n                               ; do filter-
141:         mac    x0,y0,a  x:(r2)+,x0  y:(r4)+,y0  ; loop and mult.
142:         macr   x0,y0,a (r2)-
143: 
144:         rts
145: 
146: proceed_ht
147: ;;HT
148:         move   #cddr,r4                     ; set r4 to start at coeff 0
149:         move   #cddr2,r5                    ; set r4 to start at coeff 1
150:         move   a,x:(r1)                     ; store samples in buffer
151:         clr    a        x:(r1)+,x0  y:(r4)+,y0   ; get samples and coeffs.
152:         clr    b        y:(r5)+,y1
153:         do     #n,filter_loop                    ; do filter-
154:         mac    x0,y1,b  y:(r5)+,y1
155:         mac    x0,y0,a  x:(r1)+,x0  y:(r4)+,y0   ; loop and mult.
156: filter_loop
157:         macr   x0,y0,a                      ; and last mult. with last coeff.
158:         macr   x0,y1,b  (r1)-
159: 
160:         move   #64,n3          ; Use delta  ; load cosinus value
161: 
162:         move   a,x0
163:         move   b,x1
164: 
165:         move   x:(r3),y0                    ; last blub of sinus
166:         move   x:(r3+n3),y1                 ; last blub of cosinus
167:         move   x:delta,n3      ; Use delta  ; load sinus value
168:         mpy    y0,x0,a
169:         mpy    y1,x1,b  (r3)+n3
170: 
171:         sub    b,a             ; b=b-a (b=verz-ht)
172: 
173:         rts
174: 
175: 
176:         include 'txrx_isr.asm' ; ISR's for in- and output
177: 
178: interrupt
179:         move   a,x:aint
180:         move   b,x:bint       ;save register
181:         move   x0,x:x0int
182: 
183:         move   x:$FFE4,b      ;get data from port B
184:         move   #$F0000F,x0
185:         and    x0,b           ;mask lower nibble
186: 
187:         move   b,x:delta      ;save delta value
188: 
189:         move   x:x0int,x0
190:         move   x:bint,b       ;restore register
191:         move   x:aint,a
192:         rti
193: 
194:     end
 

3.3. PIC Programm

 

3.3.1. Schaltung zwischen PIC und DSP

Der PIC wird mit 4 MHz getaktet. Er ist für die Steuerung des LC-Displays und für die Steuerung der Funktionen des DSP zuständig. Die Eingangsgrössen sind die beiden Taster, mit denen die zu ändernde Einstellung und der dazugehörige Wert gewählt wird.

 

3.3.2. Erklärung zum Programm

Das PIC Programm gibt beim ersten Start den (C) Text aus. Dieser wird durch einen Tastendruck gelöscht und der Status wird angezeigt. Danach geht das Programm in eine Endlosschleife und wartet auf Interrupts (die durch Tastendrücke - Highpegel an RB4 oder RB5 - ausgelöst werden). Während des Wartens wird eine kleine Animation abgespielt. Tritt nun ein Interrupt auf, wird nun ausgewertet, welcher Taster betätigt wurde. Taster1 wählt die zu ändernde Einstellung, und mit Taster2 läßt sich dann der gewünschte Wert einstellen.
Bei PIC_HT.ASM gibt es insgesamt 4 Menüpunkte, wobei nur der Deltawert und der Hilbert On/Off Punkt implementiert wurde.
Nach jedem Tastendruck wird in der Interruptroutine die entsprechende Aktion gesetzt (der Wert auf PortA geschrieben) und danach ein Interrupt für den DSP ausgelöst (RA4). Schliesslich am Ende des Interrupts wird mittels Aufruf von Routine menu das Display upgedatet.
Die Ausgabe am Display benutzt die Routine dataout, welche die einzelnen Bits eines Bytes (dem Auszugebenden (Steuer)/Zeichen) an das Schieberegister schickt und für jede Übernahme einen Taktimpuls erzeugt. Wenn alle 8 Bits fertig geschickt sind, wird das Freigabe-Signal geschickt und schliesslich das LCD Enable Signal zur Übernahme in das Display erzeugt.

 

3.3.3. pic_ht.asm

  1:          list p=16f84
  2: 
  3: ;;------------------------------------------------------------------------
  4: ;; pic_ht.asm
  5: ;; (C) by Leo Eibler 20001111  (mailto:leo@sprossenwanne.at)
  6: ;; LU: 20010417
  7: ;; DSP Project Site: http://blub2k.no-ip.com/dsp/
  8: ;;------------------------------------------------------------------------
  9: ;; Programm zum Ansteuern eines LC-Displays (Hitachi MC-162-2 in meinem
 10: ;; Fall ;-) mittels eines PIC 16F84 (@4Mhz)
 11: ;; gleichzeitig wartet das Programm auf Tastendruecke (sprich high-Pegel
 12: ;; auf den Portleitungen RB4-RB7. Tritt so ein high-Pegel auf, springt
 13: ;; das Programm in eine ISR.
 14: ;; 20010402: Quellcode Grundgeruest von PIC_TST4.ASM uebernommen
 15: ;; 20010403: Protokoll fuer den Transfer zum DSP angefangen zu implement.
 16: ;; 20010415: da war ein call DSP_Int zuviel (im menu)
 17: ;; 20010416: neue Zeitroutine fuer DSP_Int (zeit_5_ms1) weil sonst da DSP
 18: ;;           des net checkt !
 19: ;; 20010417: neues Konzept: Wenn Hilbert=OFF dann Wert 0 schicken, sonst
 20: ;;           einfach den Wert schicken, den die Delta Variable haben soll
 21: ;;------------------------------------------------------------------------
 22: ;; kompiliert wurde das Programm mit 02.50.02
 23: ;; geflasht mit IC-Prog 1.01
 24: ;;  Einstellungen: JDM Programmer, Oscillator XT, nothing else
 25: ;;------------------------------------------------------------------------
 26: 
 27:          status      equ         03h
 28:          rp0         equ         05h ;SpeicherBank Auswahlbit
 29:          rp1         equ         06h ;SpeicherBank Auswahlbit
 30:          intcon      equ         0Bh
 31:          porta       equ         05h
 32:          trisa       equ         85h
 33:          portb       equ         06h
 34:          trisb       equ         86h
 35:          sp1         equ         0Ch ;Zeichenausgabe
 36:          sp2         equ         0Dh ;Zeichenausgabe
 37:          sp3         equ         0Eh ;Delay Schleife
 38:          sp4         equ         0Fh ;Delay Schleife
 39:          sp5         equ         10h ;Entprell-Delay-Schleife
 40:          sp6         equ         11h ;Entprell-Delay-Schleife
 41:          sp7         equ         12h
 42:          sp8         equ         13h
 43:          sp9         equ         14h ;EnableInt,Outstate
 44:          sp10        equ         15h ;Gerade ausgewaehlte Variable/flag
 45:          sp11        equ         16h ;Delta Wert (n) fuer Hilbert
 46:          sp12        equ         17h
 47:          sp13        equ         18h ;HT=Bit0, FIR=Bit1
 48: 
 49: ;;------------------------------------------------------------------------
 50: 
 51:          org         00h             ; Reset Vector
 52:          goto        start
 53: 
 54: ;;------------------------------------------------------------------------
 55: ;; ISR's
 56: 
 57:          org         004h            ; Startvector (Interrupt)
 58: 
 59:          btfss       sp9,7           ; Bit7 auf 0:
 60:          goto        end_isr         ; Interrupt sofort beenden
 61: 
 62:          call        Entprellen
 63: 
 64:          btfsc       portb,4         ; Taster an RB4 betaetigt
 65:          goto        a1
 66: 
 67:          btfsc       portb,5         ; Taster an RB5 betaetigt
 68:          goto        a2
 69: 
 70:          goto        aout            ; anscheinend nix von beiden ;-)
 71: 
 72: 
 73: 
 74: a1:                               ; high-Pegel an RB4
 75:       movfw       sp10            ; sp10 (Auswahl) laden
 76:       sublw       1
 77:       sublw       0
 78:       btfsc       status,2        ; is das ergebnis 0 ?
 79:       goto        chg_delta       ; ja, also Auswahl=Delta
 80:       sublw       1
 81:       sublw       0
 82:       btfsc       status,2        ; is das ergebnis jetzt 0 ?
 83:       goto        chg_htflag      ; ja, also Auswahl=HTFlag
 84:       sublw       1
 85:       sublw       0
 86:       btfsc       status,2        ; is das ergebnis jetzt 0 ?
 87:       goto        chg_bpflag      ; ja, also Auswahl=FIRFlag
 88:       goto        chg_nothing     ; 4te Auswahl nicht implementiert
 89: 
 90: chg_delta:
 91:       incf        sp11,1          ; sp11
 92:       movfw       sp11            ; sp11 (Auswahl) laden
 93:       xorlw       0Eh             ; Haben wir schon 9 Werte durch ?
 94:       btfsc       status,2        ; pruefen: is das ergebnis 0 ?
 95:       clrf        sp11            ; ja, wieda bei 0 anfangen
 96: 
 97:          movfw       sp11            ; sp11 (delta wert - n) laden
 98:          bsf         porta,4         ;   kein DSP Interrupt
 99:          addlw       1               ; Wir uebertragen einen Wert >0
100:          iorlw       b'00010000'     ;   das 4. bit muss unbedingt 1 sein
101:          movwf       porta           ; n auf porta schreiben
102:          call         DSP_Int        ; DSP Interrupt ausloesen
103:          bsf         sp13,0          ; Hilbert Flag einschalten
104:          goto        chg_nothing
105: 
106: chg_htflag
107:          btfss       sp13,0          ; ist hilbertflag gesetzt ?
108:          goto        set_htflag      ;   is net gsetzt, jetzt setzen !
109:          bcf         sp13,0          ; is scho gsetzt, jetzt loeschen
110:          movlw       0        ; fuer DSP: Delta Wert 0 (Hilbert aus)
111:          iorlw       b'00010000'     ;   das 4. bit muss unbedingt 1 sein
112:          movwf       porta           ; und auf port schreiben
113:          call         DSP_Int        ; DSP Interrupt ausloesen
114:          goto        end_htflag
115: set_htflag
116:          bsf         sp13,0          ; Hilbert eingeschalten - also
117:          movfw       sp11            ; derzeitigen Delta Wert laden
118:          bsf         porta,4         ;   kein DSP Interrupt
119:          addlw       1        ; fuer DSP: Delta Wert >0
120:          iorlw       b'00010000'     ;   das 4. bit muss unbedingt 1 sein
121:          movwf       porta           ; n auf porta schreiben
122:          call         DSP_Int        ; DSP Interrupt ausloesen
123: end_htflag
124:          goto        chg_nothing
125: 
126: chg_bpflag
127:          btfss       sp13,1          ; ist firflag gesetzt ?
128:          goto        set_bpflag      ;   is net gsetzt, jetzt setzen !
129:          ; nicht implementiert im Moment (FIR Flag loeschen)
130:          bcf         sp13,1          ; is scho gsetzt, jetzt loeschen
131:          goto        end_bpflag
132: set_bpflag
133:          bsf         sp13,1
134:          ; nicht implementiert im Moment (FIR Flag setzen)
135: end_bpflag
136:          goto        chg_nothing
137: 
138: 
139: chg_nothing:
140:          call        menu            ; Menu anzeigen bzw. updaten
141:          goto        aout
142: 
143: a2:                                  ; high-Pegel an RB5
144:          incf        sp10,1          ; sp10 (=Auswahl)
145:          btfsc       sp10,2          ; ist er scho bei 4?
146:          clrf        sp10            ; ja -> wieda auf 0 setzen
147:          call        menu            ; Menu anzeigen bzw. updaten
148:          goto        aout
149: 
150: aout:                                ; da ein Interrupt ausgloest wurde,
151:          bsf         sp9,6           ; Bit 6 setzen (debug)
152: end_isr:
153:          bcf         intcon,0        ; PortChangeInterruptFlag rueckset.
154:          retfie
155: 
156: ;;------------------------------------------------------------------------
157: start:
158:           bcf         sp9,6          ; debug bit fuer Interrupt
159:           bcf         sp9,7          ; keine Interrupts erlauben
160: 
161:           movlw       b'11110000'    ; RB0-3 auf Ausg. RB4-7 auf Eing.
162:           tris        portb          ; TrisRegister mit altem Befehl set
163: 
164:           movlw       b'00000000'    ; RA0-3 auf Ausgang
165:           tris        porta          ; TrisRegister mit altem Befehl set
166: 
167:           bcf         portb,2        ; LCD: Instruction Code
168:           bcf         portb,3        ; LCD: Enable Signal
169:           bsf         porta,4        ; RA4 (DSP-IRQ Leitung) auf High
170: 
171:           movlw       0h             ; Debug Register auf
172:           movwf       sp8            ; 0 setzen
173: 
174:           movlw       b'10001000'    ; Enable Global Ints
175:           movwf       intcon         ; Enable PortChange Ints.
176: 
177: 
178: ;;------------------------------------------------------------------------
179: ;;Display Init
180: endlos:
181:          bcf          portb,2        ; LCD: Instruction Code
182: 
183:          movlw        b'00000001'    ; Display Clear
184:          call         dataout
185: 
186:          movlw        b'00000110'    ; Entry Mode Set
187:          call         dataout
188: 
189:          movlw        b'00001100'    ; Display On
190:          call         dataout
191: 
192:          movlw        b'00111000'    ; Set Function
193:          call         dataout
194: 
195:          bsf          portb,2        ; LCD: Data Code
196: 
197:          movlw        b'01000100'  ;D
198:          call         dataout
199:          movlw        b'01010011'  ;S
200:          call         dataout
201:          movlw        b'01010000'  ;P
202:          call         dataout
203:          movlw        b'00101101'  ;-
204:          call         dataout
205:          movlw        b'01010000'  ;P
206:          call         dataout
207:          movlw        72h          ;r
208:          call         dataout
209:          movlw        6fh          ;o
210:          call         dataout
211:          movlw        6Ah          ;j
212:          call         dataout
213:          movlw        65h          ;e
214:          call         dataout
215:          movlw        63h          ;c
216:          call         dataout
217:          movlw        74h          ;t
218:          call         dataout
219: 
220:          bcf          portb,2
221:          movlw        b'11000000'  ; LCD: 2. Zeile, Pos. 0
222:          call         dataout
223:          bsf          portb,2
224: 
225: 
226:          movlw        62h          ;b
227:          call         dataout
228:          movlw        79h          ;y
229:          call         dataout
230:          movlw        20h          ;<space>
231:          call         dataout
232:          movlw        b'01001100'  ;L
233:          call         dataout
234:          movlw        b'01100101'  ;e
235:          call         dataout
236:          movlw        b'01101111'  ;o
237:          call         dataout
238:          movlw        26h          ;&
239:          call         dataout
240:          movlw        4eh          ;N
241:          call         dataout
242:          movlw        69h          ;i
243:          call         dataout
244:          movlw        63h          ;c
245:          call         dataout
246:          movlw        b'01101111'  ;o
247:          call         dataout
248: 
249:                                    ; LCD: Data Code
250:          bsf          portb,2
251:          movlw        20h          ;<space>
252:          call         dataout
253:          bsf          sp9,7
254: 
255: ;;------------------------------------------------------------------------
256: x:                                 ; Endlosschleife
257:                                    ; Beginn mit kleiner Animation ;-)
258: 
259:          bcf          portb,2
260:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
261:          call         dataout
262:          bsf          portb,2
263:          movlw        2eh          ;.
264:          call         dataout
265: 
266:          call         zeit_30_1ms
267: 
268:          bcf          portb,2
269:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
270:          call         dataout
271:          bsf          portb,2
272:          movlw        6fh          ;o
273:          call         dataout
274: 
275:          call         zeit_30_1ms
276: 
277:          bcf          portb,2
278:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
279:          call         dataout
280:          bsf          portb,2
281:          movlw        4fh          ;O
282:          call         dataout
283: 
284:          call         zeit_30_1ms
285: 
286:          bcf          portb,2
287:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
288:          call         dataout
289:          bsf          portb,2
290:          movlw        6fh          ;o
291:          call         dataout
292: 
293:          call         zeit_30_1ms
294: 
295:          goto         x            ; Endlos-Schleife, Animation
296: 
297: ;;------------------------------------------------------------------------
298: ;;  space=20h [=5Bh ]=5Dh C=43h E=45h H=48h O=4Fh P=50h T=54h
299: menu:                              ; Menu (von ISR aufgerufen)
300:          bcf         portb,2
301:          movlw        b'00000110'  ; Entry Mode Set
302:          call         dataout
303: 
304:          movlw        b'00111000'  ; Set Function
305:          call         dataout
306: 
307:          movlw        b'11000000'  ; LCD: 2. Zeile, Pos. 0
308:          call         dataout
309:          bsf          portb,2
310: 
311:       movfw       sp10            ; sp10 (Auswahl) laden
312:       sublw       1
313:       sublw       0
314:       btfsc       status,2        ; is das ergebnis 0 ?
315:       goto        show_delta
316:       sublw       1
317:       sublw       0
318:       btfsc       status,2        ; is das ergebnis jetzt 0 ?
319:       goto        show_htflag
320:       sublw       1
321:       sublw       0
322:       btfsc       status,2        ; is das ergebnis jetzt 0 ?
323:       goto        show_firflag
324:       goto        show_nothing
325: 
326: show_delta:
327: 
328:          movlw        44h          ;D
329:          call         dataout
330:          movlw        45h          ;E
331:          call         dataout
332:          movlw        4Ch          ;L
333:          call         dataout
334:          movlw        54h          ;T
335:          call         dataout
336:          movlw        41h          ;A
337:          call         dataout
338:          movlw        20h          ;<space>
339:          call         dataout
340: 
341:          movfw        sp11         ; Delta Value laden
342:          addlw        1h       ; und nomoi ans dazua
343:          sublw        0Ah
344:          btfsc        status,2     ; is das ergebnis 0 ?
345:          goto         zehn_anzeigen
346:          btfss        status,0     ; is das carry flag gsetzt ?
347:          goto         zehn_anzeigen
348:          movlw        20h      ; <space>
349:          call         dataout
350:          movfw        sp11     ; Delta Value laden
351:          addlw        30h      ; ASCII Code von 0 dazuzaehlen
352:          addlw        1h       ; und nomoi ans dazua
353:          call         dataout
354:          goto         kleiner_10
355: zehn_anzeigen:
356:          movlw        31h      ; ASCII Code von 1
357:          call         dataout
358:          movfw        sp11         ; Delta Value laden
359:          addlw        1h       ; und nomoi ans dazua
360:          sublw        0Ah
361:          sublw        0
362:          addlw        30h      ; ASCII Code von 0 dazuzaehlen
363:          call         dataout
364: kleiner_10
365: 
366:          movlw        20h          ;<space>
367:          call         dataout
368:          movlw        20h          ;<space>
369:          call         dataout
370:          movlw        20h          ;<space>
371:          call         dataout
372:          movlw        20h          ;<space>
373:          call         dataout
374:          movlw        20h          ;<space>
375:          call         dataout
376: 
377:          goto         end_menu
378: 
379: show_htflag
380:          movlw        48h          ;H
381:          call         dataout
382:          movlw        49h          ;I
383:          call         dataout
384:          movlw        4Ch          ;L
385:          call         dataout
386:          movlw        42h          ;B
387:          call         dataout
388:          movlw        45h          ;E
389:          call         dataout
390:          movlw        52h          ;R
391:          call         dataout
392:          movlw        54h          ;T
393:          call         dataout
394:          movlw        20h          ;<space>
395:          call         dataout
396: 
397:          btfss       sp13,0          ; ist hilbertflag gesetzt ?
398:          goto        showset_htflag  ;   is net gsetzt, anzeigen
399:          movlw        4Fh          ;O
400:          call         dataout
401:          movlw        4Eh          ;N
402:          call         dataout
403:          movlw        20h          ;<space>
404:          call         dataout
405:          goto        showend_htflag
406: showset_htflag
407:          movlw        4Fh          ;O
408:          call         dataout
409:          movlw        46h          ;F
410:          call         dataout
411:          movlw        46h          ;F
412:          call         dataout
413: showend_htflag
414:          goto         end_menu
415: 
416: show_firflag
417:          movlw        46h          ;F
418:          call         dataout
419:          movlw        49h          ;I
420:          call         dataout
421:          movlw        52h          ;R
422:          call         dataout
423:          movlw        46h          ;F
424:          call         dataout
425:          movlw        49h          ;I
426:          call         dataout
427:          movlw        4Ch          ;L
428:          call         dataout
429:          movlw        54h          ;T
430:          call         dataout
431:          movlw        20h          ;<space>
432:          call         dataout
433: 
434:          btfss       sp13,1          ; ist firfilter flag gesetzt ?
435:          goto        showset_firflag ;   is net gsetzt, anzeigen
436:          movlw        4Fh          ;O
437:          call         dataout
438:          movlw        4Eh          ;N
439:          call         dataout
440:          movlw        20h          ;<space>
441:          call         dataout
442:          goto        showend_firflag
443: showset_firflag
444:          movlw        4Fh          ;O
445:          call         dataout
446:          movlw        46h          ;F
447:          call         dataout
448:          movlw        46h          ;F
449:          call         dataout
450: showend_firflag
451:          goto         end_menu
452: 
453: show_nothing:
454: 
455:          movlw        4Eh          ;N
456:          call         dataout
457:          movlw        20h          ;<space>
458:          call         dataout
459:          movlw        49h          ;I
460:          call         dataout
461:          movlw        20h          ;<space>
462:          call         dataout
463:          movlw        58h          ;X
464:          call         dataout
465:          movlw        20h          ;<space>
466:          call         dataout
467:          movlw        20h          ;<space>
468:          call         dataout
469: 
470:          movlw        20h ;5bh          ;[
471:          call         dataout
472:          movlw        20h ;5dh          ;]
473:          call         dataout
474: 
475: end_menu:
476:          movlw        20h          ;<space>
477:          call         dataout
478:          movlw        20h          ;<space>
479:          call         dataout
480:          movlw        20h          ;<space>
481:          call         dataout
482:          movlw        20h          ;<space>
483:          call         dataout
484: 
485: 
486: ;;         call         DSP_Int
487: ;;         bcf          sp9,6        ; Wenn nicht aus ISR aufgerufen
488:          return
489: 
490: ;;------------------------------------------------------------------------
491: ;; DSP Interrupt ausloesen (low aktiv)
492: ;; 4. Pin auf Port a auf 0 - warten - wieda auf high
493: 
494: DSP_Int
495:          call         zeit_13_1ms
496:          bcf          porta,4      ; RA4: Interruptleitung fuer DSP
497:          call         zeit_5_1ms  ;      mal auf GND ziehn, warten,
498:          bsf          porta,4      ;      und wieder auf High
499:          call         zeit_5_1ms
500:          call         zeit_5_1ms
501:          return
502: 
503: ;;------------------------------------------------------------------------
504: ;; Zeichen Ausgabe:
505: 
506: dataout:
507:          movwf        sp1
508:          bcf          status,0
509:          movlw        b'00001001'
510:          movwf        sp2
511: 
512: dataout1:
513:          decfsz       sp2,1
514:          goto         dataout2
515:          goto         uu
516:          return
517: 
518: dataout2:
519:          rrf          sp1,1        ; Daten seriell auf das
520:          btfss        status,0     ; Schieberegister ausgeben
521:          goto         null
522:          goto         eins
523: 
524: null:
525:          bcf          portb,0      ; Serial Input von Schieberegister
526: 
527:          call         clock
528:          goto         dataout1
529: 
530: eins:
531:          bsf          portb,0      ; Serial Input von Schieberegister
532: 
533:          call         clock
534:          goto         dataout1
535: 
536: clock:
537:          bcf          portb,1      ; Clock Input von Schieberegister
538:          bsf          portb,1      ; einen Taktflanke erzeugen, damit
539:          bcf          portb,1      ; das naechste Bit uebernommen wird
540:          return
541: 
542: uu:
543:          bcf          portb,3      ; Und schliesslich
544:          call         zeit_13_1ms  
545:          bsf          portb,3      ; Enable Signal fuer LCD erzeugen
546:          call         zeit_13_1ms  
547:          bcf          portb,3      ; und wieder loeschen
548:          return
549: 
550: ;;------------------------------------------------------------------------
551: ;; zeit_13_1ms
552: 
553: zeit_13_1ms:
554:          movlw        b'00000011'
555:          movwf        sp3
556: 
557:          movlw        b'00000001'
558:          movwf        sp4
559: 
560: zeit_13_2ms:
561:          decfsz       sp3,1
562:          goto         zeit_13_3ms
563:          return
564: 
565: zeit_13_3ms:
566:          decfsz       sp4,1
567:          goto         zeit_13_3ms
568:          goto         zeit_13_2ms
569: 
570: ;;------------------------------------------------------------------------
571: ;; Zeit_30ms => 325,125 msec
572: 
573: zeit_30ms:
574:          call         zeit_30_1ms
575:          return
576: 
577: zeit_30_1ms:
578:          movlw        b'11111111'
579:          movwf        sp3
580: 
581: zeit_30_2ms:
582:          movlw        b'11111111'
583:          movwf        sp4
584:          decfsz       sp3,1
585:          goto         zeit_30_3ms       ; 255 * 1,275 msec = 325,125 msec
586:          return
587: 
588: zeit_30_3ms:
589:          decfsz       sp4,1
590:          goto         zeit_30_4ms       
591:          goto         zeit_30_2ms
592: 
593: zeit_30_4ms:
594:          nop                            ; 4 Mhz Takt =>
595:          nop                            
596:          nop                            
597:          nop                            
598:          nop                            
599:          goto         zeit_30_3ms
600: 
601: ;;------------------------------------------------------------------------
602: ;; Entprellen
603: 
604: Entprellen
605:          nop
606:          call         zeit_4x_1ms
607:          nop
608:          call         zeit_4x_1ms
609:          nop
610:          return
611: 
612: zeit_4x_1ms:
613:          movlw        b'11111111'
614:          movwf        sp5
615: 
616: zeit_4x_2ms:
617:          movlw        b'00000110'
618:          movwf        sp6
619:          decfsz       sp5,1
620:          goto         zeit_4x_3ms
621:          return
622: 
623: zeit_4x_3ms:
624:          decfsz       sp6,1
625:          goto         zeit_4x_4ms
626:          goto         zeit_4x_2ms
627: 
628: zeit_4x_4ms:
629:          nop
630:          goto         zeit_4x_3ms
631: 
632: 
633: ;;------------------------------------------------------------------------
634: ;; zeit_5_1ms
635: 
636: zeit_5_1ms:
637:          movlw        b'00000111'
638:          movwf        sp3
639: 
640:          movlw        b'00001111'
641:          movwf        sp4
642: 
643: zeit_5_2ms:
644:          decfsz       sp3,1      
645:          goto         zeit_5_3ms 
646:          return
647: 
648: zeit_5_3ms:                      
649:          decfsz       sp4,1      
650:          goto         zeit_5_3ms 
651:          nop
652:          nop
653:          nop                     
654:          goto         zeit_5_2ms 
655: 
656: 
657:          end                       ; und zu Ende is unser schoenes Prog.
658: 
659: ;;------------------------------------------------------------------------
660: ;; check out the DSP Project Site:
661: ;; http://blub2k.no-ip.com/dsp/
662: ;; http://sprossenwanne.yi.org/dsp/ or http://sprossenwanne.myip.org/dsp/
663: ;; mailto: leo@sprossenwanne.at
664: ;;------------------------------------------------------------------------
665: ;; einige Teile des Programmcodes wurden von der MaturaDoku der Schueler
666: ;; Eggler/Geiger 1998/99 Schellinggasse, Wien1, Oesterreich entnommen.
667: ;;------------------------------------------------------------------------
 

4. Protkoll

Datum Eintrag
11.09.2000 Anpassen des Entwicklungsrechners und installieren der Software.
14.09.2000 Kennenlernen von Matlab (Demo-Programme)
18.09.2000 Optimieren der Softwareeinstellungen, Kennenlernen der Assemblerspreche des DSP
21.09.2000 Entwerfen von Analog- und Digitalfilter in Matlab
25.09.2000 FIR-Filter programmiert, mit Matlab verschiedene FIR-Filter entworfen und am DSP getestet
28.09.2000 Protokoll-Arbeiten und entwickeln mit Matlab
02.10.2000 Fehlersuche im Programm, da sich der Filter nicht so anhört wie er sollte
03.10.2000 Arbeiten an allgemeiner Dokumentation
04.10.2000 Konzeption der Webdokumentation
09.10.2000 Genau Messung des DSP-Outputs mit Spektrumanalyzer um den Fehler einzugrenzen; debuggen des Programms
10.10.2000 Arbeit im Labor: Fehler im Programm gefunden (zirkuläre Adressierung); trotzdem zeigt die Analyse mit Spektrumanalyzer noch immer Fehler
11.10.2000 weitere theoretische Fehlersuche im Programm
16.10.2000 Falsche Implementierung im Motorola Originalquellcode (FIR-Filter) gefunden; Messung mit Spektrumanalyzer ergibt gleiches Ergebniss wie in Theorie (Matlab)
17.10.2000 Neuschreiben des Programmes zur besseren Übersicht
18.10.2000 Erstellen von Grafiken mit Matlab
23.10.2000 Echoprogramm zum Programm hinzugefügt; Einarbeitung in PIC-Programmierung
24.10.2000 Weitere Informationen über PIC gesucht
25.10.2000 Zusammenfassen und Ausdrucken der gefundenen PIC-Dokumentation
30.10.2000 PIC Programmer aufgebaut. Doku auf englisch verfasst und Projekt auf Englisch erklaert. Beginn mit Aufbau der PIC Ansteuer/Anzeige Unit.
31.10.2000 Weitere Referenzen zu PIC gesucht
6.11.2000 LCD Platine fuer PIC fertig geloetet. PIC Programmer getestet - keine Funktion - Fehlersuche - Fehler behoben. PIC Programm funktioniert.
7.11.2000 Fehler auf PIC Platine: zu hoher Stromverbrauch. Fehlersuche im Labor: Hintergrundbeleuchtung ohne Vorwiderstand (Fehler im Schaltplan). LCD Doku gesucht. Preprozessor fuer Assemblerprogramme entwickelt.
8.11.2000 PIC Dokumentation genau durchgenommen (Interrupt, Register-Mapping, Speicherbelegung, I/O Ports, ...)
13.11.2000 DSP Programm (FIR Filter+Echo) Interrupt faehig gemacht. Durch IRQA auf Masse Signal ein/ausschalten bzw. dann Echo an/aus. Interface von PIC Steuerplatine zu DSP hergestellt. PIC Programm angepasst. Tastenentprellung perfektioniert.
14.11.2000 im Labor: DSP Programm: je nach Bitkombination an Port B Echo ein/aus oder Filter ein/aus. PIC Programm angepasst. Fehler in Filterroutine beseitigt. DSP Programm weiterentwickelt um zwischen 2 Filter umzuschalten.
15.11.2000 FREI
18.11.2000 Labor: Tag der offenen Tuer: Praesentation des DSP und der PIC Steuerung. DSP Programm optimiert (Lautstaerkeanpassung)
20.11.2000 Filter mit FFT Analyzer nachgemessen - kleiner Fehler bei Anzahl der Koeffizienten korrigiert. Analyse ok.
21.11.2000 in Labor: Fehler bei PIC Platine gesucht - teilweise mehrmaliges Einschalten erforderlich.
22.11.2000 in PIC Dokumentation Hinweis auf Fehlerursache gesucht.
27.11.2000 Fehlerursache: Nicht beschaltener Reset Eingang. korrigiert. Weitergearbeitet an DSP Programm. neue Koeffizienten probiert.
28.11.2000 in Labor: Parallelgruppe mit PIC und Programm geholfen.
29.11.2000 Informationen zu Hilbert Filter gesucht und Funktion im Matlab angeschaut.
4.12.2000 Modulationsfilter Entwurf mit Matlab. Darstellung nicht korrekt.
5.12.2000 Analyse der genauen Funktionsweise des Modulationsfilters.
6.12.2000 weitere Analyse. weiterhin Probleme.
11.12.2000 Weiterentwicklung des Modulationsfilters. korrekte Funktion des Hilbert Filters und des Verzoegerungsgliedes. Grafische Darstellung im Matlab ok.
12.12.2000 M-Files im Matlab fuer die Filter und die Modulation erstellt.
13.12.2000 M-Files zu einer Gesamtpraesentation zusammengefasst.
18.12.2000 Ueberlegungen der Implementation im DSP Programm. grosse Probleme mit der Modulation selbst (e^jO, sinus/cosinus)
19.12.2000 Application Sheets zu Sinus fuer DSP gesucht/ausgedruckt.
20.12.2000 Durchschauen und versuchen, die Funktionsweise des Sinus und der Tabelle zu verstehen.
8.1.2001 Versuchen, im DSP Programm die Sinus Tabelle anzusprechen. Probleme mit OMR usw.
9.1.2001 im Labor: endlich korrektes Auslesen der Sinus Tabelle (Probleme mit Speicherbereiche beseitigt). Ausgabe eines Sinus Ton. Analyse mit Oszi - wunderschoener Sinus ;-)
10.1.2001 Mit Vorarbeiten an Praesentation begonnen.
15.1.2001 Ueberarbeiten des DSP Programms, um 2 Filter zu durchlaufen (Verzoegerungsglied und Hilbert). Modulation (nach Formel mit Sinus und Cosinus). Ergebnis entspricht nicht eines gepitchten Signals.http://
16.1.2001 im Labor: weitere Analyse des Programms. Sinus und Cosinus Werte sind korrekt. Filterroutinen funktionieren korrekt. Trotzdem nicht gewuenschtes Ergebnis.
17.1.2001 Recoding des DSP Programms (sinus3.asm). Neuanordnung der Speicherbereiche. Dokumentation des Quellcodes.
22.1.2001 Fehler gefunden: Beim Cosinus wird ein 2tes Mal weitergezaehlt. Aufgrund Timing-Optimierungen Sinus und Cosinus direkt in den Main Loop und Debug Code eliminiert.
23.1.2001 Analyse mit FFT. Wahrscheinlich Problem mit Hilbert Filter: negative Frequenzanteile werden auch gepitcht. Delta Wert stimmt aber laut Messung.
24.1.2001 Aufbereiten der Projektdoku.
29.1.2001 PIC Platine - Fehler bei Power on Reset - korrigiert. Im PIC Programm Fehler bei Warteroutine zeit_30_1 korrigiert. PIC Programm korrigiert. DSP Programm um IRQ Steuerung erweitert, um Hilbert Filter ein/auszuschalten. Serielles Verlängerungskabel gebaut. DSP kann Stereo.
30.1.2001 im Labor: Geschwindigkeitsprobleme, wegen Stereo. Mit Samplingfrequenz runtergegangen. Weiterhin Fehler wegen der negativen Frequenzanteile.
31.1.2001 Theoretisches durchgehen des DSP Programms und Fehlersuche wegen negativen Frequenzen.
5.2.2001 Ferien
6.2.2001 Ferien
7.2.2001 Ferien
12.2.2001 Komplettes recoding des DSP Hilbert Programms. Stereo deaktiviert und Interrupts deaktiviert. Beide Kanäle zusammen addiert um 1 einzelnes Signal zu bekommen.
13.2.2001 im Labor: weitere Messungen durchgeführt - noch immer Fehler. durchgehen der Speicherbereiche (vielleicht zirkuläre Buffer ?). checken der Sinus Routine.
14.2.2001 Kommentieren des PIC Programms
19.2.2001 Nochmalige Messung mit Spektrumanalyser. Auf einmal nur mehr eine Spektrallinie (keine negative mehr). Doch das nur in einem sehr kleinen Frequenzbereich (hat in keiner Weise mit den Hilbertkoeffizienten zu tun). Darüber hinaus komische Ergebnisse im Spektrum.
20.2.2001 im Labor: Suche des Fehlers, warum ausserhalb des kleinen Frequenzbereichs solch komische Fehler auftreten. Überprüfen der Matlabkoeffizienten.
21.2.2001 DSP Programm kommentiert.
26.2.2001 Fehler gefunden, wieso bei den Messungen diese Ergebnisse rauskommen: Falsche Einstellungen beim Spektrumanalyser. Nach wiederherstellen der richtigen Einstellungen wieder dasselbe Problem wie vorher - negative Spektrallinien werden wieder moduliert.
27.2.2001 im Labor: Fehler nicht auffindbar. ratlosigkeit
28.2.2001 Übungen mit ANA
5.3.2001 Da noch immer Fehler, Prof. Wess um Hilfe gebeten. Gemeinsam das Programm durchgegangen, doch noch zu keinem Ergebnis.
6.3.2001 im Labor: Instruktionen, alle Sachen aus dem Programm zu nehmen, die nicht mehr nötig sind (sprich: temp variablen, Speicherreservierungen die nicht mehr genutzt werden, Interrupt aktivierungsroutinen, ...)
7.3.2001 Übungen mit PSPice und ANA
12.3.2001 Gemeinsam mit Prof. Wess den nun überarbeiteten Code durchgecheckt. Überprüfung der Speicherbereiche (zirkuläre Buffer) - ok ! Überprüfen wegen der Definition von n (Delta) und logisches Durchgehen der Anzahl der Repeat anweisungen und initialisieren der korrekten Wertes der m Register. 1 Fehler entdeckt und korrigiert. Doch weiterhin kein korrektes Ergebnis.
13.3.2001 im Labor: Nochmaliges Überprüfen der Sinus Routine: Fehler entdeckt. Da der Cosinus ebenfalls aus der 256 Werte Sinustabelle gebildet wird (sprich um 64 Verschoben) ungewollte zusätzliche Phasenverschiebung zwischen Berechnung des Cosinus und des Sinus - logischer Denkfehler - korrigiert. Programm funktioniert nun einwandfrei.
14.3.2001 Vorbereiten für div. andere Fächer (tests !!)
19.3.2001 Sinus3.asm funktioniert !! Nur mehr die positiven Anteile werden gepitcht. Nun Recoding und Geschwindigkeitsoptimierungen (Hilbert.asm).
20.3.2001 im Labor: die beiden Filterschleifen in eine einzelne verpackt. Alle Befehle, die sich parallelisieren lassen ausgenutzt.
21.3.2001 Weitere Auseinandersetzung mit Programmierung von Mikrocontrollern (EDT)
26.3.2001 FIR Filter Routine (Bandpass) im DSP Programm implementiert, um nur das Sprachsignalband zu erhöhen. Notwendige Änderung: Extremes herabsetzen der Samplingfrequenz (auf 16 kHz). Probieren, welche Bandbreite der Bandpass haben muss.
27.3.2001 im Labor: allgemeine Einführung in die Programmierung von Mikrocontrollern (EDT) für einige Schulkollegen.
28.3.2001 Ausarbeitung eines neuen Konzepts für die Präsentation und Dokumentation (/kurzdoku)
2.4.2001 Neues PIC Programm PIC_TST5.ASM (Grundgerüst von pic_tst4.asm übernommen). Ziel: Steuerung des DSP (einstellen der Deltavariable, Hilbert ein/ausschalten). Überlegungen eins genialen Übertragungsprotokolls (2&3 Byte Kommandos). Anpassen des DSP Programms HILBERT.ASM (IRQ Steuerung). Umlöten des PIC Boards, daß RB0-RB3 angesprochen wird.
3.4.2001 im Labor: Fehler bein Interrupt im DSP Programm. Vergessen in die Interrupt Tabelle einzutragen und Initialisierungscode vom Interrupt Fehlerhaft - korrigiert ! Implementierung des Protokolls in den PIC. Interrupt wird aufgerufen, doch Delta Wert wird nicht korrekt geändert.
4.4.2001 weiteres kennenlernen und arbeiten mit PSpice. Ausgabe am Display und Code vom PIC Programm PIC_TST5.ASM verschönert.
9.4.2001 Osterferien
10.4.2001 Osterferien
11.4.2001 Osterferien
16.4.2001 Osterferien: Debuggen des DSP Programms. Komisches Verhalten beim AND (wenn AND Wert kleiner FFh). Korrigiert, indem AND mit F0000Fh. Korrektur im PIC_TST5.ASM: Es wurde ein Interrupt zuviel ausgelöst. Nun korrekte Übernahme des Delta Werts.
17.4.2001 Osterferien: Display Ausgabe verschönert und debuggen des PIC Programms mittels "DEBUG Sockel - Ausgabe auf LED's). Implementierung von 2 Byte Kommandos. Funktioniert nicht. Idee mit 2&3Byte Protokoll verworfen und einfacheres angepasstes Protokoll verwendet. Kein Erfolg, da in der Interrupt Routine nur 1 einzelnes decrease abgearbeitet wird. dann nicht mehr. Nun ganz einfaches Protokoll implementiert - nur Änderung des Delta Wertes und Ausschalten des Hilbertfilters. PIC angepasst. Funktioniert !!
18.4.2001 Osterferien: Übernehmen der Alten Dokumentation in die neue (/kurzdoku)
 

X. Anhang

 

X.A. Quellenangabe

 

X.B. Eigene Unterlagen

Unsere Programme, Dokumentationen und Präsentation sind auch online zu bekommen unter http://blub2k.yi.org/dsp/.
Bei weiteren Fragen sind wir auch per E-Mail zu erreichen:

 

X.C. Diese Dokumentation

Diese Dokumentation basiert auf Scripts von view->source[Nico Edtinger] um sie sowohl online verfügbar als auch druckbar zu machen. In nächster Zeit wird der Code unter der GPL auf http://viewsource.web.ag/ zur Verfügung stehen.

Das Copyright für den gesamten Inhalt liegt bei Leo Eibler und Nico Edtinger. Wir sind per Mail zu ereichen falls jemand größere Auszüge aus dieser Dokumentation verwenden will.

Valid HTML 4.01!

Valid CSS!