
PLL
für Software DDS
DDS die auf Jesper Hansen's Minidds-Programm basieren sind häufig
gebaut worden, zuletzt von Rudolf Drabek mit schönem Display für
die eingestellte Frequenz und einer guten Beschreibung der Theorie.
Daher kommen hier auch keine weiteren Grundlagen über DDS
sondern ich möchte die Idee vorstellen, mit einfachen Mitteln
den Frequenzbereich für Kurzwelle zu erweitern.
Zunächst aber die Basisschaltung und ein paar Anmerkungen dazu.
Die ganze Box hat kein Display, sie wird über die serielle
Schnittstelle gesteuert. Dann hat man oft auch einen MAX202 und der
liefert die plus minus 10 V für den Ausgangstreiber TL081. Das
ist eine einfache Lösung, einen OpAmp aus +5 V zu versorgen.
Es gibt zwei Taster an Int1 (wired or), damit kann man die Frequenz
manuell erhöhen oder erniedrigen, und zwar um die Schrittweite
steps, die programmierbar ist. Das geht auch über die serielle
Schnittstelle oder über einen 555. Dann hat man einen
Sweepgenerator.
Die
Frequenz
(mit einem 24
bit accumulator) ist:
f =
deltaPhase * fClock/2^24
und
dabei ist fClock die Quarzfrequenz geteilt durch die Anzahl der
cycles in der Loop.
LOOP1:
add dds0,delta0 ; 1
adc dds1,delta1 ; 1
adc dds2,delta2 ; 1
lpm ; 3
out PORTB,r0 ; 1
rjmp LOOP1 ; 2 => 9 cycle
Das sind hier 9 cycles. Nun wird die Quarzfrequenz
gewählt. Ziel ist es, eine durch 2^n teilbare Loopfrequenz
fClock zu finden. Mit einem Quarz von 18,432 Mhz läuft die loop
mit 2,048 Mhz. 18432 / 9 = 2048. Das ergibt dann glatte binäre
Zahlen für deltaPhase, z.B.
ldi delta0,0x00 ; setup adder value default ldi delta1,0x20 ; to 1 kHz 0x002000 at 18432kHz
ldi delta2,0x00 ; dezimal 8192
Damit wird 1 kHz tatsächlich 1000,00 Hz.. Die Frequenz ist f =
delta0/delta1/delta2 * 0.122070312
Damit die
Frequenz genau wird sollte man den Quarz kalibrieren. Dazu braucht
man einen Kurzwellenempfänger, der auf 10 MHz abgestimmt wird,
dort ist standard NIST radio
station WWV, Time and Frequency Division .WWV station sendet on 5,
10, und 15 MHz Der DDS Generator
wird auf 100 kHz programmiert und generiert Oberwellen auf 10 MHz.
Nun hört man ein Schwebungssignal im Empfänger. Mit den
passenden Kondensatoren am Quarz wird er auf Schwebungsnull getrimmt,
dann ist er kalibriert.
DDS erzeugen kein
harmonisches Ausgangssignal, die Amplitude ist hier mit 8 bit
quantisiert und braucht ein Filter zur Interpolation. Die sampling
Frequenz fClock hat Harmonische im Frequenzbereich, die stören
bis 200 kHz aber kaum. Die 8 bit Quantisierung erzeugt Rauschen.
Davon abgesehen ist das ein sehr brauchbarer Frequenzgenerator.
PLL
Nach den
langen Vorbemerkungen geht es nun zum eigentlichen Thema, der
Kurzwelle
Dazu braucht man
nur 3 weitere ICs und der Frequenzbereich wird erweitert, von 2,5 bis
16 Mhz.
Es ist eine phase locked loop mit 74HC4046, einem 74HC4040 als Teiler
durch 64 und einem 74HC132 zum pulse shaping.
Schaltbild der
PLL
Die
Eingangsfrequenz der DDS (input oben rechts) wird hier mit 64
multipliziert und so wird aus 100 kHz dann 6400 kHz. Mit dem
Kondensator C3 von 500 pF rastet die PLL von etwa 2,5 bis 16 Mhz. Der
Schalter S1 schaltet mit free tune auf das Poti und man hat dann
einen frei durchstimmbaren Oszillator. Die Basisauflösung DDS
ist 0,12 Hz und so hat man hier etwa 7 Hz auf Kurzwelle.
7.00 MHz
Ausgangssignal der PLL
Das ist kein
Ersatz für einen echten DDS Generator wie z.B. AD9835 aber ein
schneller und kostengünstiger Weg, ein quarzstabiles HF Signal
zu erzeugen. Na ja, es rauscht eben, für DRM nur bedingt
geeignet.
Das Ganze wird
von einem Programm über die serielle Schnittstelle gesteuert.
Das
Steuerprogramm am PC
Hier kann man
rechts oben die Signalform wählen. Die gelben Felder setzen die
Basisfrequenz oder die HF Frequenz, auf F oder HF drücken oder
im Feld auf return. Das untere Memofeld zeigt die Kommunikation mit
der Box. Die tatsächliche DDS Frequenz wird in den weißen
Feldern angezeigt, hier ist HF von 7 MHz angeklickt und die DDS
Basisfrequenz ist dann 109375 Hz.
Die Schrittweite
für die Frequenz, wenn man entweder Up oder Dn drückt oder
die up down Tasten, wird mit Steps programmiert. Mit einem Timer wird
das automatisiert, das Programm sendet 'Up' z.B. alle 1000 ms, das
ist dann ein sweep up der einfachen Art.
Nur 3 ICs
zusätzlich und es gibt ein quarzstabiles HF Signal. Viel Spass.
Zitate:
Rudolf Drabek, DDS-Generator 0,1Hz-100kHz
Jesper Hansen's software: http://www.myplace.nu/avr/minidds/
Wikipedia info: http://en.wikipedia.org/wiki/Direct_digital_synthesizer, http://en.wikipedia.org/wiki/Numerically-controlled_oscillator
Gerd's AVR assembler version 3.3: http://www.avr-asm-tutorial.net/gavrasm/index_en.html
datasheet ATtiny2313, Atmel.com
Download: 2313minidds6.zip
;******************************************************************************
;
; DDS Synthesizer / function generator
; sine, triangle, sawtooth, square wave or inverted sawtooth output
;
; changed to ATtiny2313 18.432MHz quartz GS 2005-03-06
; added command 't' frequency steps setting, txx 2 bytes
; added External Interrupt1 on PIND3, button pressed PIND4 (dn) or PIND5 (up);
;
;******************************************************************************
;
; Code originally written by Jesper Hansen for AT90S2313, 2001-02-15
;
; This program is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation; either version 2
; of the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
;
;******************************************************************************
;
; ATiny2313 PDIP
;
; (RESET/dW) PA2 1 20 VCC
; (RXD) PD0 2 19 PB7 (UCSK/SCK/PCINT7)
; (TXD) PD1 3 18 PB6 (MISO/DO/PCINT6)
; (XTAL2) PA1 4 17 PB5 (MOSI/DI/SDA/PCINT5)
; (XTAL1) PA0 5 16 PB4 (OC1B/PCINT4)
; (CKOUT/XCK/INT0)PD2 6 15 PB3 (OC1A/PCINT3)
; (INT1) PD3 7 14 PB2 (OC0A/PCINT2)
; (T0) PD4 8 13 PB1 (AIN1/PCINT1)
; (OC0B/T1) PD5 9 12 PB0 (AIN0/PCINT0)
; GND 10 11 PD6 (ICP)
;
;******************************************************************************
;
; PB0..7 R2R DAC waveform out
;
; PD0 RXD
; PD1 TXD
;
; PD345 input , up/down buttons wired or (diodes) to ext int1 (GS)
;
;******************************************************************************
;
;
; Output frequency (using 24 bit accumulator) :
;
; f = deltaPhase * fClock/2^24
;
; fClock is in this case the CPU clock (18.432MHz) divided by the
; number of cycles to output the data (9 cycles)
;
; f = delta0/delta1/delta2 * (clock/9)/16777216
;
; fClock = 18.432 / 9 = 2.048 Mhz
;
; f = delta0/delta1/delta2 * 0.122070312 with 18.432MHz quartz
;
; fMax (theoretical) = 0.5 * fClock
;
;
;******************************************************************************
; start
;******************************************************************************
.DEVICE ATtiny2313 ;for gavrasm
.equ clock = 18432000
.equ baudrate = 9600
.equ baudval = clock/(16*baudrate)-1
.equ step1k = 8192 ; 1 kHz frequency step
.def temp = r16
.def stepL = r17
.def stepH = r18
.def delay = r19
.def zero = r23
.def delta0 = r24 ; Phase increment of dds
.def delta1 = r25
.def delta2 = r26
.def dds0 = r28 ; 3 byte dds accumulator
.def dds1 = r29
.def dds2 = r30
.def ZL = r30
.def ZH = r31
;r0 used
.cseg
.org 0
rjmp RESET
.org 2 ;INT1addr = 0x002 External Interrupt1
rjmp ExtInt1
.org 7 ;URXC0addr = 0x007 USART0 RX Complete Interrupt
rjmp RX_COMPLETE_INT
;******************************************************************************
; code
;******************************************************************************
RESET:
ldi temp, RAMEND
out SPL, temp ; setup stack pointer
ldi temp,low(baudval) ; UBRRL set uart speed
out UBRRL,temp
ldi temp,high(baudval) ; UBRRH set uart speed
out UBRRH,temp
; 98 = 10011000
ldi temp,0x98 ;UCSRB=UCR enable RXint and enable tx/rx
out UCSRB,temp ; UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
ser temp ;
out DDRB,temp ; set all PORTB bits as output
ldi temp,0b00111100 ; set pullup PD5 4 3 2 (GS)
out PORTD, temp ; 1 = pull-up , 0 = float
; MCUCR: PUD SM1 SE SMD ISC11 ISC10 ISC01 ISC00
; Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1
; 1 0 The falling edge of INT1 generates an interrupt request.
ldi temp,0b00001000 ; set INT1 PD5 (GS)
out MCUCR, temp ; falling edge
; GIMSK:INT1 INT0 PCIE – – – – – GIMSK
ldi temp,0b10000000 ; enable INT1 PD5 (GS)
out GIMSK, temp ; falling edge
; set sinewave output as default
ldi ZH,high(2*sine) ; setup Z pointer hi
ldi ZL,low(2*sine) ; sine wave
ldi temp, low(step1k) ; 1 kHz frequency steps default
mov stepL, temp
ldi temp, high(step1k)
mov stepH, temp
; clear accumulator
ldi dds1,0x00 ; clear accumulator
ldi dds0,0x00 ; clear accumulator
mov zero,dds0 ; zero constant
; setup adder registers
ldi delta0,0x00 ; setup adder value default
ldi delta1,0x20 ; to 1 kHz 0x2000 at 18432kHz
ldi delta2,0x00 ; decimal 8192
sei ; global enable interrupts
;******************************************************************************
; main loop
;
; dds0,dds1,dds2 is the phase accumulator
; delta0,delta1,delta2 is the adder value determining frequency
;
; add value to accumulator
; load byte from current table in ROM
; output byte to port B
; repeat
;
;******************************************************************************
LOOP1:
add dds0,delta0 ; 1
adc dds1,delta1 ; 1
adc dds2,delta2 ; 1
lpm ; 3
out PORTB,r0 ; 1
rjmp LOOP1 ; 2 => 9 cycles
;**********************************************************************
; communication functionality
;**********************************************************************
;
; get char in temp
;
get_char: ; UCSRA: RXC TXC UDRE FE DOR UPE U2X MPCM
in temp,UCSRA ; UCSRA =USR wait for a byte to be ready
sbrs temp,7 ; ready ?
rjmp get_char ; no, wait some more
in temp,UDR ; get the byte
ret ; and return
;
; send char in temp
;
send_char:
sbis UCSRA, UDRE ; wait for UDR
rjmp send_char
out UDR,temp ; send char
ret ; ans return
;
; send the current frequency to the PC
; as a 5 byte sequence :
; 'F=' followed by a 24 bit phase accumulator value
;
;
send_data:
push temp ; save temp
ldi temp,'F' ; flag
rcall send_char
ldi temp,'=' ; flag
rcall send_char
;clr temp ; zero byte for 32-bit compatibility
;rcall send_char ; not used
mov temp,delta2
rcall send_char ; high add
mov temp,delta1
rcall send_char ; mid add
mov temp,delta0
rcall send_char ; low add
ldi temp,0x0a
rcall send_char ; terminator
pop temp
ret
; add 1 to the phase accumulator
up_one:
adiw delta0,1
adc delta2,zero
ret
; add 10 to the phase accumulator
up_ten:
adiw delta0,8 ;1Hz
adc delta2,zero
ret
; add steps to the phase accumulator 'U'
up_hundred:
; ldi zero,82 ;10Hz
; add delta0,zero
; clr zero
; adc delta1,zero
; adc delta2,zero
; ret
add delta0,stepL ;frequency steps
adc delta1,stepH
adc delta2,zero
ret
; subtract 1 from the phase accumulator
down_one:
sbiw delta0,1
sbc delta2,zero
ret
; subtract 10 from the phase accumulator
down_ten:
sbiw delta0,8
sbc delta2,zero
ret
; subtract steps from the phase accumulator 'D'
down_hundred:
; clr zero
; subi delta0,82
; sbc delta1,zero
; sbc delta2,zero
; ret
sub delta0,stepL ;frequency steps
sbc delta1,stepH
sbc delta2,zero
ret
;
; read in 4 characters from the serial link, set frequency
;
read_4:
rcall get_char ; read and ignore bits 32..24
rcall get_char ; read bits 23..16
mov delta2,temp
rcall get_char ; read bits 15..8
mov delta1,temp
rcall get_char ; read bits 7..0
mov delta0,temp
ret
;
; read in 2 characters from the serial link, set steps
;
read_2:
rcall get_char ; read bits 15..8
mov stepH,temp ; steps to add in 'U' command
rcall get_char ; read bits 7..0
mov stepL,temp
ret
;**********************************************************************
; External Interrupt1 on PIND3, button pressed PIND4 (dn) or PIND5 (up)
; change frequency by value defined in stepH, stepL
;**********************************************************************
ExtInt1:
clr delay ; debounce key
EIdelay: dec delay
brne EIdelay
sbis PIND, PIND5 ; check if button is high
rcall up_hundred ; if low, up_hundred
sbis PIND, PIND4 ; check if button is high
rcall down_hundred ; if low, down_hundred
reti
;**********************************************************************
; Interrupt routine for incoming bytes on the RS232 link
;**********************************************************************
RX_COMPLETE_INT:
push temp
in temp,UDR
cpi temp,'+' ; up one
brne tx_2
rcall up_one
rjmp tx_exit
tx_2:
cpi temp,'u' ; up ten
brne tx_3
rcall up_ten
rjmp tx_exit
tx_3:
cpi temp,'U' ; up hundred
brne tx_4
rcall up_hundred
rjmp tx_exit
tx_4:
cpi temp,'-' ; down one
brne tx_5
rcall down_one
rjmp tx_exit
tx_5:
cpi temp,'d' ; down ten
brne tx_6
rcall down_ten
rjmp tx_exit
tx_6:
cpi temp,'D' ; down hundred
brne tx_7
rcall down_hundred
rjmp tx_exit
tx_7:
cpi temp,'s' ; frequency setting
brne tx_8
rcall read_4
rjmp tx_exit
tx_8:
cpi temp,'?' ; just force a reply
brne tx_9
rjmp tx_exit
tx_9:
cpi temp,'1' ; request sinewave output
brne tx_10
ldi ZH,high(2*sine) ; setup Z pointer hi
ldi dds2,low(2*sine) ; setup Z pointer lo
rjmp tx_exit
tx_10:
cpi temp,'2' ; request sawtooth output
brne tx_11
ldi ZH,high(2*sawtooth) ; setup Z pointer hi
ldi dds2,low(2*sawtooth) ; setup Z pointer lo
rjmp tx_exit
tx_11:
cpi temp,'3' ; request triangle output
brne tx_12
ldi ZH,high(2*triangle) ; setup Z pointer hi
ldi dds2,low(2*triangle) ; setup Z pointer lo
rjmp tx_exit
tx_12:
cpi temp,'4' ; request squarewave output
brne tx_13
ldi ZH,high(2*square) ; setup Z pointer hi
ldi dds2,low(2*square) ; setup Z pointer lo
rjmp tx_exit
tx_13:
cpi temp,'5' ; request inverted sawtooth output
brne tx_14
ldi ZH,high(2*sawinv) ; setup Z pointer hi
ldi dds2,low(2*sawinv) ; setup Z pointer lo
rjmp tx_exit
tx_14:
cpi temp,'t' ; frequency steps setting
brne tx_15
rcall read_2
rjmp tx_exit
; unknown command, just ignore it
tx_15:
; always reply with the current frequency
tx_exit:
rcall send_data
pop temp
reti
;******************************************************************************
; data tables
;******************************************************************************
; force table to begin at 256 byte boundary
.org 0x100
sine: ; 256 step sinewave table
.db 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae
.db 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8
.db 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5
.db 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7
.db 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc
.db 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3
.db 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83
.db 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51
.db 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27
.db 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a
.db 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
.db 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23
.db 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c
.db 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
sawtooth: ; 256 step sawtoothwave table
.db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
.db 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
.db 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
.db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
.db 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
.db 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
.db 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
.db 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
.db 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
.db 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
.db 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
.db 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
.db 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf
.db 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf
.db 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef
.db 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
triangle: ; 256 step trianglewave table
.db 0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e
.db 0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e
.db 0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e
.db 0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e
.db 0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e
.db 0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe
.db 0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde
.db 0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe
.db 0xff,0xfd,0xfb,0xf9,0xf7,0xf5,0xf3,0xf1,0xef,0xef,0xeb,0xe9,0xe7,0xe5,0xe3,0xe1
.db 0xdf,0xdd,0xdb,0xd9,0xd7,0xd5,0xd3,0xd1,0xcf,0xcf,0xcb,0xc9,0xc7,0xc5,0xc3,0xc1
.db 0xbf,0xbd,0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xaf,0xab,0xa9,0xa7,0xa5,0xa3,0xa1
.db 0x9f,0x9d,0x9b,0x99,0x97,0x95,0x93,0x91,0x8f,0x8f,0x8b,0x89,0x87,0x85,0x83,0x81
.db 0x7f,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71,0x6f,0x6f,0x6b,0x69,0x67,0x65,0x63,0x61
.db 0x5f,0x5d,0x5b,0x59,0x57,0x55,0x53,0x51,0x4f,0x4f,0x4b,0x49,0x47,0x45,0x43,0x41
.db 0x3f,0x3d,0x3b,0x39,0x37,0x35,0x33,0x31,0x2f,0x2f,0x2b,0x29,0x27,0x25,0x23,0x21
.db 0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x11,0x0f,0x0f,0x0b,0x09,0x07,0x05,0x03,0x01
square: ; 256 step squarewave table
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
sawinv: ; 256 step inverted sawtoothwave table
.db 255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240
.db 239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224
.db 223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208
.db 207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192
.db 191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176
.db 175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160
.db 159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144
.db 143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128
.db 127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112
.db 111,110,109,108,107,106,105,104,103,102,101,100, 99 ,98, 97, 96
.db 95 ,94, 93, 92, 91,90, 89, 88, 87, 86 , 85, 84 ,83 ,82, 81, 80
.db 79 ,78, 77, 76, 75,74, 73, 72, 71, 70 , 69, 68 ,67 ,66, 65, 64
.db 63 ,62, 61, 60, 59,58, 57, 56, 55, 54 , 53, 52 ,51 ,50, 49, 48
.db 47 ,46, 45, 44, 43,42, 41, 40, 39, 38 , 37, 36 ,35 ,34, 33, 32
.db 31 ,30, 29, 28, 27,26, 25, 24, 23, 22 , 21, 20 ,19 ,18, 17, 16
.db 15 ,14, 13, 12, 11,10, 9 , 8 ,7 , 6 , 5, 4 , 3 , 2, 1 , 0
;******************************************************************************
; end of file
;******************************************************************************
Elektronik-Labor Projekte AVR