Experiment: Programmierbarer Funktionsgenerator
Im folgenden Experiment soll ein digitaler Funktionsgenerator aufgebaut werden, der verschiedene Funktionsverläufe auf dem DA-Wandler zyklisch ausgibt. Dieser Funktionsgenerator erlaubt nur zwei Parameter der ausgegebenen Funktion zu ändern, nämlich die Frequenz und die Funktion selbst. Die Frequenz wird, wie bereits zuvor beschrieben durch eine externe Rechteckspannung bestimmt, die als Taktsignal für den Funktionsgenerator verwendet wird. Zur Einstellung der Amplitude und des Gleichspannungs-Offsets sei der Leser auf die einschlägigen Schaltungen mit Operationsverstärkern verwiesen.
Die Funktion selbst kann aus sieben fix vorgegebenen Kurvenverläufen ausgewählt werden. Die Auswahl der Funktion geschieht über die Tasten T0-T7 der Platine DIGMLT, die über den 8-Bit-Port PIN eingelesen werden. Die Tasten haben folgende Bedeutung:
T0 |
Parabel 2. Ordnung |
T1 |
Gaußfunktion (Glockenkurve) |
T2 |
Sinus |
T3 |
Sägezahn |
T4 |
Dreieck |
T5 |
Nadelimpuls |
T6 |
Rechteck |
T7 |
Funktionsspeicher löschen (= Nullinie) |
Drückt man eine der Tasten T0-T7, so wird die ausgewählte Funktion in den Funktionspuffer geladen und ausgegeben.
Das unten aufgeführte Listing zeigt die Funktionsweise des Programms: Zuerst wird die aktuelle Tastenkombination der Platine DIGMLT von PIN eingelesen. Falls keine Taste gedrückt ist oder sich der Zustand der Tasten gegenüber der letzten Abfrage nicht geändert hat, wird keine weitere Aktion unternommen. Wenn eine der Tasten umgeschaltet wurde, wird der neue Zustand gespeichert und jene gedrückte Taste ermittelt, die die höchsten Priorität besitzt (bei mehreren gleichzeitig gedrückten Tasten wird immer nur eine Funktion aktiviert). Zu der ermittelten Taste wird nun die Ausführungsadresse des entsprechenden Unterprogramms errechnet. Dieses Unterprogramm füllt nun den Funktionspuffer mit den Werten der gewünschten Funktion und kehrt dann an den Anfang des Programms zurück.
;===================================================
;---- Experiment: Funktionsgenerator ---------------
;===================================================
;
.GLOBAL FNCGEN
FNCGEN: LD HL,FNCBUF ;Zeiger initialisieren
LD (FBFPOI),HL
FNCG1: IN A,(PIN) ;Tasten einlesen
OR A ;keine Taste
JR Z,FNCG1 ; gedrückt ?
LD HL,LASTF
CP (HL) ;Tasten geändert ?
JR Z,FNCG1
LD (LASTF),A ;Tastenzustand merken
LD HL,FNCTAB ;aktive Funktion
$2: SLA A ; ermitteln
JR C,$1
INC HL
INC HL
JR $2
;
$1: LD A,(HL) ;Ausführungsadresse
INC HL ; des Ladeprogramms
LD H,(HL) ; berechnen
LD L,A
LD DE,FNCG1 ;Return-Adresse
PUSH DE
JP (HL) ;do it !
;
.DATA
LASTF: DEFB 0
.CODE
;
FNCTAB: DEFW ZEROLN ;Nullinie
DEFW SQUARE ;Rechteckfunktion
DEFW PULSE ;Nadelimpuls
DEFW TRIANG ;Dreiecksfunktion
DEFW SAWTOO ;Sägezahn
DEFW SINE ;Sinus
DEFW GAUSS ;Gauß-Funktion
DEFW PARABO ;Parabel
;
ZEROLN: LD B,0 ;Nullinie berechnen
LD HL,FNCBUF
$3: LD (HL),0
INC HL
LD (HL),80H
INC HL
DJNZ $3
RET
;
SQUARE: LD B,0 ;Rechteckfunktion
LD HL,FNCBUF
$4: LD (HL),0
INC HL
DJNZ $4
$5: LD (HL),0FFH
INC HL
DJNZ $5
RET
;
TRIANG: LD B,128 ;Dreiecksfunktion
LD HL,FNCBUF
$6: LD (HL),0
INC HL
LD A,B
DEC A
ADD A,A
LD (HL),A
INC HL
DJNZ $6
LD B,128
$7: LD (HL),0
INC HL
LD A,B
DEC A
ADD A,A
CPL
LD (HL),A
INC HL
DJNZ $7
RET
;
SAWTOO: LD B,0 ;Sägezahn
LD HL,FNCBUF
$8: LD (HL),0
INC HL
LD (HL),B
INC HL
DJNZ $8
RET
PULSE: LD B,254 ;Impuls
LD HL,FNCBUF
$9: LD (HL),0
INC HL
LD (HL),0
INC HL
DJNZ $9
LD (HL),0FFH
INC HL
LD (HL),0FFH
INC HL
LD (HL),0FFH
INC HL
LD (HL),0FFH
INC HL
RET
;
SINE: LD HL,SINTAB ;Sinus
LD DE,FNCBUF
LD BC,512
LDIR
RET
;
GAUSS: LD HL,GAUSTB ;Gauß
LD DE,FNCBUF
LD BC,512
LDIR
RET
;
;---- Tabelle der Gauß'schen Kurve -----------------
;
GAUSTB: DEFW 0000H, 0000H, 0000H, 0000H, 0000H
DEFW 0000H, 0000H, 0000H, 0010H, 0010H
DEFW 0010H, 0010H, 0010H, 0010H, 0010H
DEFW 0010H, 0020H, 0020H, 0020H, 0020H
DEFW 0030H, 0030H, 0040H, 0040H, 0050H
DEFW 0050H, 0060H, 0070H, 0080H, 0090H
DEFW 00A0H, 00B0H, 00D0H, 00F0H, 0100H
DEFW 0120H, 0150H, 0170H, 01A0H, 01D0H
DEFW 0200H, 0240H, 0280H, 02D0H, 0320H
DEFW 0370H, 03D0H, 0440H, 04B0H, 0530H
DEFW 05B0H, 0650H, 06F0H, 07A0H, 0860H
DEFW 0920H, 0A00H, 0AF0H, 0C00H, 0D10H
DEFW 0E40H, 0F80H, 10D0H, 1240H, 13D0H
DEFW 1570H, 1730H, 1900H, 1B00H, 1D10H
DEFW 1F40H, 2190H, 2410H, 26A0H, 2960H
DEFW 2C40H, 2F40H, 3260H, 35A0H, 3910H
DEFW 3CA0H, 4060H, 4430H, 4830H, 4C50H
DEFW 5090H, 5500H, 5980H, 5E20H, 62F0H
DEFW 67D0H, 6CC0H, 71E0H, 7700H, 7C40H
DEFW 8190H, 86F0H, 8C60H, 91D0H, 9750H
DEFW 9CD0H, A240H, A7C0H, AD30H, B290H
DEFW B7E0H, BD20H, C250H, C750H, CC40H
DEFW D100H, D5A0H, DA20H, DE60H, E270H
DEFW E650H, E9F0H, ED50H, F070H, F350H
DEFW F5E0H, F830H, FA40H, FC00H, FD60H
DEFW FE80H, FF50H, FFC0H, FFF0H, FFC0H
DEFW FF50H, FE80H, FD60H, FC00H, FA40H
DEFW F830H, F5E0H, F350H, F070H, ED50H
DEFW E9F0H, E650H, E270H, DE60H, DA20H
DEFW D5A0H, D100H, CC40H, C750H, C250H
DEFW BD20H, B7E0H, B290H, AD30H, A7C0H
DEFW A240H, 9CD0H, 9750H, 91D0H, 8C60H
DEFW 86F0H, 8190H, 7C40H, 7700H, 71E0H
DEFW 6CC0H, 67D0H, 62F0H, 5E20H, 5980H
DEFW 5500H, 5090H, 4C50H, 4830H, 4430H
DEFW 4060H, 3CA0H, 3910H, 35A0H, 3260H
DEFW 2F40H, 2C40H, 2960H, 26A0H, 2410H
DEFW 2190H, 1F40H, 1D10H, 1B00H, 1900H
DEFW 1730H, 1570H, 13D0H, 1240H, 10D0H
DEFW 0F80H, 0E40H, 0D10H, 0C00H, 0AF0H
DEFW 0A00H, 0920H, 0860H, 07A0H, 06F0H
DEFW 0650H, 05B0H, 0530H, 04B0H, 0440H
DEFW 03D0H, 0370H, 0320H, 02D0H, 0280H
DEFW 0240H, 0200H, 01D0H, 01A0H, 0170H
DEFW 0150H, 0120H, 0100H, 00F0H, 00D0H
DEFW 00B0H, 00A0H, 0090H, 0080H, 0070H
DEFW 0060H, 0050H, 0050H, 0040H, 0040H
DEFW 0030H, 0030H, 0020H, 0020H, 0020H
DEFW 0020H, 0010H, 0010H, 0010H, 0010H
DEFW 0010H, 0010H, 0010H, 0010H, 0000H
DEFW 0000H, 0000H, 0000H, 0000H, 0000H
DEFW 0000H
;
PARABO: LD HL,PARATB ;Parabel
LD DE,FNCBUF
LD BC,512
LDIR
RET
;
;----- Tabelle der Parabel 2. Ordnung --------------
;
PARATB: DEFW FE00H, FA10H, F620H, F230H, EE50H
DEFW EA80H, E6B0H, E2E0H, DF20H, DB70H
DEFW D7C0H, D410H, D070H, CCE0H, C950H
DEFW C5C0H, C240H, BED0H, BB60H, B7F0H
DEFW B490H, B140H, ADF0H, AAA0H, A760H
DEFW A430H, A100H, 9DD0H, 9AB0H, 97A0H
DEFW 9490H, 9180H, 8E80H, 8B90H, 88A0H
DEFW 85B0H, 82D0H, 8000H, 7D30H, 7A60H
DEFW 77A0H, 74F0H, 7240H, 6F90H, 6CF0H
DEFW 6A60H, 67D0H, 6540H, 62C0H, 6050H
DEFW 5DE0H, 5B70H, 5910H, 56C0H, 5470H
DEFW 5220H, 4FE0H, 4DB0H, 4B80H, 4950H
DEFW 4730H, 4520H, 4310H, 4100H, 3F00H
DEFW 3D10H, 3B20H, 3930H, 3750H, 3580H
DEFW 33B0H, 31E0H, 3020H, 2E70H, 2CC0H
DEFW 2B10H, 2970H, 27E0H, 2650H, 24C0H
DEFW 2340H, 21D0H, 2060H, 1EF0H, 1D90H
DEFW 1C40H, 1AF0H, 19A0H, 1860H, 1730H
DEFW 1600H, 14D0H, 13B0H, 12A0H, 1190H
DEFW 1080H, 0F80H, 0E90H, 0DA0H, 0CB0H
DEFW 0BD0H, 0B00H, 0A30H, 0960H, 08A0H
DEFW 07F0H, 0740H, 0690H, 05F0H, 0560H
DEFW 04D0H, 0440H, 03C0H, 0350H, 02E0H
DEFW 0270H, 0210H, 01C0H, 0170H, 0120H
DEFW 00E0H, 00B0H, 0080H, 0050H, 0030H
DEFW 0020H, 0010H, 0000H, 0000H, 0010H
DEFW 0020H, 0030H, 0050H, 0080H, 00B0H
DEFW 00E0H, 0120H, 0170H, 01C0H, 0210H
DEFW 0270H, 02E0H, 0350H, 03C0H, 0440H
DEFW 04D0H, 0560H, 05F0H, 0690H, 0740H
DEFW 07F0H, 08A0H, 0960H, 0A30H, 0B00H
DEFW 0BD0H, 0CB0H, 0DA0H, 0E90H, 0F80H
DEFW 1080H, 1190H, 12A0H, 13B0H, 14D0H
DEFW 1600H, 1730H, 1860H, 19A0H, 1AF0H
DEFW 1C40H, 1D90H, 1EF0H, 2060H, 21D0H
DEFW 2340H, 24C0H, 2650H, 27E0H, 2970H
DEFW 2B10H, 2CC0H, 2E70H, 3020H, 31E0H
DEFW 33B0H, 3580H, 3750H, 3930H, 3B20H
DEFW 3D10H, 3F00H, 4100H, 4310H, 4520H
DEFW 4730H, 4950H, 4B80H, 4DB0H, 4FE0H
DEFW 5220H, 5470H, 56C0H, 5910H, 5B70H
DEFW 5DE0H, 6050H, 62C0H, 6540H, 67D0H
DEFW 6A60H, 6CF0H, 6F90H, 7240H, 74F0H
DEFW 77A0H, 7A60H, 7D30H, 8000H, 82D0H
DEFW 85B0H, 88A0H, 8B90H, 8E80H, 9180H
DEFW 9490H, 97A0H, 9AB0H, 9DD0H, A100H
DEFW A430H, A760H, AAA0H, ADF0H, B140H
DEFW B490H, B7F0H, BB60H, BED0H, C240H
DEFW C5C0H, C950H, CCE0H, D070H, D410H
DEFW D7C0H, DB70H, DF20H, E2E0H, E6B0H
DEFW EA80H, EE50H, F230H, F620H, FA10H
DEFW FE00H
|