PLL für Software DDS           

by Gerd Sinning                       
Elektronik-Labor   Projekte   AVR 

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.
 

Schaltplan basis DDS
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