'//////////////////////////////////////////////////////////////////// '/// FastAVR Basic Compiler for AVR by MICRODESIGN /// '/// DDS Function generator 0.1 Hz - 250 kHz, resolution 0.1 Hz /// '//////////////////////////////////////////////////////////////////// $Device = 8515 ' used device $Stack = 32 ' stack depth $Clock = 11.0592 ' adjust for used crystal $Timer1 =Timer, Prescale=1024 $Lcd = PORTA.0, Rs=PORTA.5, En=PORTA.4, 20, 4 $Key Rows=PORTD &hfc $LeadChar=" ", Format(6.1) $Baud=9600 '$Def OutPin=PORTD.2 Declare Interrupt Ovf1() Declare Sub Init() Declare Sub MainMenu() Declare Sub SweepMenu() Declare Sub SetFreq() Declare Sub SetSweep() Declare Sub SetSweepTime() Declare Sub ShowFreq() Declare Sub ShowStep() Declare Sub ShowMaxMin() Declare Sub Generator() Declare Sub GenSquare() Declare Sub CalcFreq() Declare Sub LoadWaveForm() Declare Sub SetScale() Declare Sub FreqUp() Declare Sub FreqDn() Declare Sub CalcLoad() Dim freq As Long, load As Long, scale As Long Dim tip As Byte, WaveForm As Byte, m As Byte Dim SweepMode As Byte, Stime As Word Dim buff(256) As Byte At &h100 Dim WaveStr As String*8, Stimes As String*5 Dim MinFreq As Long, MaxFreq As Long, StepFreq As Word Dim Table As Flash Byte Const Tip1=128 Const Tip2=64 Const Tip3=32 Const Tip4=16 Const Esc=8 Const Tip6=4 Const Square=3 Init() MainMenu() Do tip=Key() If tip Then Select Case tip Case Esc Locate 4,1 If SweepMode Then freq=MinFreq Enable Ovf1 Lcd "SWEEP" Else Disable Ovf1 Lcd "RUN " End If CalcLoad() If WaveForm=Square Then GenSquare() Else Generator() End If Case 16 Case 32 SetSweep() Case 64 Incr WaveForm If WaveForm=5 Then WaveForm=0 LoadWaveForm() Case 128 SetFreq() End Select MainMenu() NoKey() End If Loop '//////////////////////////////////////////////////////////////////// Sub Init() DDRC=&hff freq=10000 scale=10000 WaveForm=0 MaxFreq=100000 MinFreq=10000 StepFreq=2000 SweepMode=0 Timer1=&hfbc8 Start Timer1 LoadWaveForm() Enable Interrupts End Sub '//////////////////////////////////////////////////////////////////// Sub LoadWaveForm() Local n As Byte, adr As Word n=0 For adr=&h100 To (&h100+255) Poke(adr, Table(n+256*WaveForm)) Incr n Next End Sub '//////////////////////////////////////////////////////////////////// Sub SetFreq() Local x As Byte, tip As Byte Cls 'Locate 1,16: Lcd "Esc >" Locate 2,15: Lcd "Step >" Locate 3,17: Lcd "Up >" Locate 4,17: Lcd "Dn >" ShowFreq() ShowStep() NoKey() Do tip=Key() If tip Then Select Case tip Case Esc Exit Sub Case 16 FreqDn() Case 32 ' LEFT FreqUp() Case 64 SetScale() End Select NoKey() ShowFreq() ShowStep() End If Loop End Sub '//////////////////////////////////////////////////////////////////// Sub CalcLoad() If WaveForm=3 Then load=271*freq+853*freq/1000+37*freq/1000000 '11.0592 Else load=349*freq+525*freq/1000+333*freq/1000000 '11.0592 End If 'load=209*freq+715*freq/1000+2*freq/10000 '18.432 'load=163*freq+111*freq/1000+82*freq/100000 '18.432 End Sub '//////////////////////////////////////////////////////////////////// Sub SetSweep() Cls SweepMenu() NoKey() Do tip=Key() If tip Then Select Case tip Case Esc Exit Sub Case 16 SetSweepTime() Case 32 freq=StepFreq SetFreq() StepFreq=freq SweepMenu() NoKey() Case 64 ' Stop freq=MaxFreq SetFreq() MaxFreq=freq SweepMenu() NoKey() Case 128 ' Start freq=MinFreq SetFreq() MinFreq=freq SweepMenu() NoKey() End Select NoKey() ShowMaxMin() End If Loop End Sub '//////////////////////////////////////////////////////////////////// Sub SetSweepTime() Incr SweepMode If SweepMode>3 Then SweepMode=0 ShowMaxMin() End Sub '//////////////////////////////////////////////////////////////////// Sub FreqUp() freq=freq+scale If freq>7000000 Then freq=freq-scale End Sub '//////////////////////////////////////////////////////////////////// Sub FreqDn() freq=freq-scale If freq<0 Then freq=0 End Sub '//////////////////////////////////////////////////////////////////// Sub SetScale() scale=scale*10 If scale>1000000 Then scale=1 End Sub '//////////////////////////////////////////////////////////////////// Sub ShowFreq() Locate 1,1: Lcd freq; " Hz" End Sub '//////////////////////////////////////////////////////////////////// Sub ShowMaxMin() Select Case SweepMode Case 0 Stimes=" OFF" Case 1 Stime=&hff94 Stimes=" 10ms" Case 2 Stime=&hfbc8 Stimes="100ms" Case 3 Stime=&hd5d0 Stimes=" 1s" End Select Locate 1,1: Lcd MinFreq; " Hz" Locate 2,1: Lcd MaxFreq; " Hz" Locate 3,1: Lcd StepFreq; " Hz" Locate 4,1: Lcd Stimes End Sub '//////////////////////////////////////////////////////////////////// Sub ShowStep() Locate 2,1: Lcd scale; " Hz" End Sub '//////////////////////////////////////////////////////////////////// Sub MainMenu() Cls ShowFreq() Select Case WaveForm Case 0 WaveStr="Sine" Case 1 WaveStr="Sawtooth" Case 2 WaveStr="Triangle" Case 3 WaveStr="Square" Case 4 WaveStr="User" End Select Locate 2,1: Lcd WaveStr Locate 1,15: Lcd "FREQ >" Locate 2,11: Lcd "WaveForm >" Locate 3,14: Lcd "Sweep >" Locate 4,13: Lcd "Output >" End Sub '//////////////////////////////////////////////////////////////////// Sub SweepMenu() Cls Locate 1,13: Lcd "Start >" Locate 2,14: Lcd "Stop >" Locate 3,15: Lcd "Step >" Locate 4, 9: Lcd "Sweep Time >" ShowMaxMin() End Sub '//////////////////////////////////////////////////////////////////// Interrupt Ovf1(), Save All Timer1=Stime freq=freq+StepFreq If freq>MaxFreq Then freq=MinFreq CalcLoad() $Asm ldi r31,1 ldi r30,0 lds r12,load lds r13,load+1 lds r14,load+2 lds r15,load+3 $EndAsm End Interrupt '//////////////////////////////////////////////////////////////////// Sub Generator() $Asm ldi r31,1 ldi r30,0 lds r12,load lds r13,load+1 lds r14,load+2 lds r15,load+3 Main: add r11,r12 ; 1 Adc r26,r13 ; 1 Adc r27,r14 ; 1 Adc r30,r15 ; 1 ld r10,Z ; 2 out PORTC,r10 ; 1 rjmp Main ; 2 $EndAsm End Sub '//////////////////////////////////////////////////////////////////// Sub GenSquare() $Asm ldi r30,0 lds r12,load lds r13,load+1 lds r14,load+2 lds r15,load+3 Sqrs: add r11,r12 ; 1 Adc r26,r13 ; 1 Adc r27,r14 ; 1 Adc r30,r15 ; 1 out PORTC,r30 ; 1 rjmp Sqrs ; 2 $EndAsm End Sub '//////////////////////////////////////////////////////////////////// Table= &h80,&h83,&h86,&h89,&h8c,&h8f,&h92,&h95,&h98,&h9c,&h9f,&ha2,&ha5,&ha8,&hab,&hae, &hb0,&hb3,&hb6,&hb9,&hbc,&hbf,&hc1,&hc4,&hc7,&hc9,&hcc,&hce,&hd1,&hd3,&hd5,&hd8, &hda,&hdc,&hde,&he0,&he2,&he4,&he6,&he8,&hea,&hec,&hed,&hef,&hf0,&hf2,&hf3,&hf5, &hf6,&hf7,&hf8,&hf9,&hfa,&hfb,&hfc,&hfc,&hfd,&hfe,&hfe,&hff,&hff,&hff,&hff,&hff, &hff,&hff,&hff,&hff,&hff,&hff,&hfe,&hfe,&hfd,&hfc,&hfc,&hfb,&hfa,&hf9,&hf8,&hf7, &hf6,&hf5,&hf3,&hf2,&hf0,&hef,&hed,&hec,&hea,&he8,&he6,&he4,&he2,&he0,&hde,&hdc, &hda,&hd8,&hd5,&hd3,&hd1,&hce,&hcc,&hc9,&hc7,&hc4,&hc1,&hbf,&hbc,&hb9,&hb6,&hb3, &hb0,&hae,&hab,&ha8,&ha5,&ha2,&h9f,&h9c,&h98,&h95,&h92,&h8f,&h8c,&h89,&h86,&h83, &h80,&h7c,&h79,&h76,&h73,&h70,&h6d,&h6a,&h67,&h63,&h60,&h5d,&h5a,&h57,&h54,&h51, &h4f,&h4c,&h49,&h46,&h43,&h40,&h3e,&h3b,&h38,&h36,&h33,&h31,&h2e,&h2c,&h2a,&h27, &h25,&h23,&h21,&h1f,&h1d,&h1b,&h19,&h17,&h15,&h13,&h12,&h10,&h0f,&h0d,&h0c,&h0a, &h09,&h08,&h07,&h06,&h05,&h04,&h03,&h03,&h02,&h01,&h01,&h00,&h00,&h00,&h00,&h00, &h00,&h00,&h00,&h00,&h00,&h00,&h01,&h01,&h02,&h03,&h03,&h04,&h05,&h06,&h07,&h08, &h09,&h0a,&h0c,&h0d,&h0f,&h10,&h12,&h13,&h15,&h17,&h19,&h1b,&h1d,&h1f,&h21,&h23, &h25,&h27,&h2a,&h2c,&h2e,&h31,&h33,&h36,&h38,&h3b,&h3e,&h40,&h43,&h46,&h49,&h4c, &h4f,&h51,&h54,&h57,&h5a,&h5d,&h60,&h63,&h67,&h6a,&h6d,&h70,&h73,&h76,&h79,&h7c, &h00,&h01,&h02,&h03,&h04,&h05,&h06,&h07,&h08,&h09,&h0a,&h0b,&h0c,&h0d,&h0e,&h0f, &h10,&h11,&h12,&h13,&h14,&h15,&h16,&h17,&h18,&h19,&h1a,&h1b,&h1c,&h1d,&h1e,&h1f, &h20,&h21,&h22,&h23,&h24,&h25,&h26,&h27,&h28,&h29,&h2a,&h2b,&h2c,&h2d,&h2e,&h2f, &h30,&h31,&h32,&h33,&h34,&h35,&h36,&h37,&h38,&h39,&h3a,&h3b,&h3c,&h3d,&h3e,&h3f, &h40,&h41,&h42,&h43,&h44,&h45,&h46,&h47,&h48,&h49,&h4a,&h4b,&h4c,&h4d,&h4e,&h4f, &h50,&h51,&h52,&h53,&h54,&h55,&h56,&h57,&h58,&h59,&h5a,&h5b,&h5c,&h5d,&h5e,&h5f, &h60,&h61,&h62,&h63,&h64,&h65,&h66,&h67,&h68,&h69,&h6a,&h6b,&h6c,&h6d,&h6e,&h6f, &h70,&h71,&h72,&h73,&h74,&h75,&h76,&h77,&h78,&h79,&h7a,&h7b,&h7c,&h7d,&h7e,&h7f, &h80,&h81,&h82,&h83,&h84,&h85,&h86,&h87,&h88,&h89,&h8a,&h8b,&h8c,&h8d,&h8e,&h8f, &h90,&h91,&h92,&h93,&h94,&h95,&h96,&h97,&h98,&h99,&h9a,&h9b,&h9c,&h9d,&h9e,&h9f, &ha0,&ha1,&ha2,&ha3,&ha4,&ha5,&ha6,&ha7,&ha8,&ha9,&haa,&hab,&hac,&had,&hae,&haf, &hb0,&hb1,&hb2,&hb3,&hb4,&hb5,&hb6,&hb7,&hb8,&hb9,&hba,&hbb,&hbc,&hbd,&hbe,&hbf, &hc0,&hc1,&hc2,&hc3,&hc4,&hc5,&hc6,&hc7,&hc8,&hc9,&hca,&hcb,&hcc,&hcd,&hce,&hcf, &hd0,&hd1,&hd2,&hd3,&hd4,&hd5,&hd6,&hd7,&hd8,&hd9,&hda,&hdb,&hdc,&hdd,&hde,&hdf, &he0,&he1,&he2,&he3,&he4,&he5,&he6,&he7,&he8,&he9,&hea,&heb,&hec,&hed,&hee,&hef, &hf0,&hf1,&hf2,&hf3,&hf4,&hf5,&hf6,&hf7,&hf8,&hf9,&hfa,&hfb,&hfc,&hfd,&hfe,&hff, &h00,&h02,&h04,&h06,&h08,&h0a,&h0c,&h0e,&h10,&h12,&h14,&h16,&h18,&h1a,&h1c,&h1e, &h20,&h22,&h24,&h26,&h28,&h2a,&h2c,&h2e,&h30,&h32,&h34,&h36,&h38,&h3a,&h3c,&h3e, &h40,&h42,&h44,&h46,&h48,&h4a,&h4c,&h4e,&h50,&h52,&h54,&h56,&h58,&h5a,&h5c,&h5e, &h60,&h62,&h64,&h66,&h68,&h6a,&h6c,&h6e,&h70,&h72,&h74,&h76,&h78,&h7a,&h7c,&h7e, &h80,&h82,&h84,&h86,&h88,&h8a,&h8c,&h8e,&h90,&h92,&h94,&h96,&h98,&h9a,&h9c,&h9e, &ha0,&ha2,&ha4,&ha6,&ha8,&haa,&hac,&hae,&hb0,&hb2,&hb4,&hb6,&hb8,&hba,&hbc,&hbe, &hc0,&hc2,&hc4,&hc6,&hc8,&hca,&hcc,&hce,&hd0,&hd2,&hd4,&hd6,&hd8,&hda,&hdc,&hde, &he0,&he2,&he4,&he6,&he8,&hea,&hec,&hee,&hf0,&hf2,&hf4,&hf6,&hf8,&hfa,&hfc,&hfe, &hff,&hfd,&hfb,&hf9,&hf7,&hf5,&hf3,&hf1,&hef,&hef,&heb,&he9,&he7,&he5,&he3,&he1, &hdf,&hdd,&hdb,&hd9,&hd7,&hd5,&hd3,&hd1,&hcf,&hcf,&hcb,&hc9,&hc7,&hc5,&hc3,&hc1, &hbf,&hbd,&hbb,&hb9,&hb7,&hb5,&hb3,&hb1,&haf,&haf,&hab,&ha9,&ha7,&ha5,&ha3,&ha1, &h9f,&h9d,&h9b,&h99,&h97,&h95,&h93,&h91,&h8f,&h8f,&h8b,&h89,&h87,&h85,&h83,&h81, &h7f,&h7d,&h7b,&h79,&h77,&h75,&h73,&h71,&h6f,&h6f,&h6b,&h69,&h67,&h65,&h63,&h61, &h5f,&h5d,&h5b,&h59,&h57,&h55,&h53,&h51,&h4f,&h4f,&h4b,&h49,&h47,&h45,&h43,&h41, &h3f,&h3d,&h3b,&h39,&h37,&h35,&h33,&h31,&h2f,&h2f,&h2b,&h29,&h27,&h25,&h23,&h21, &h1f,&h1d,&h1b,&h19,&h17,&h15,&h13,&h11,&h0f,&h0f,&h0b,&h09,&h07,&h05,&h03,&h01, &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h01,&h01,&h01, &h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01, &h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01,&h01, &h01,&h01,&h01,&h01,&h01,&h01,&h01,&h02,&h02,&h02,&h02,&h02,&h02,&h02,&h02,&h02, &h02,&h02,&h02,&h02,&h02,&h02,&h02,&h02,&h02,&h02,&h02,&h03,&h03,&h03,&h03,&h03, &h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h04,&h04,&h04,&h04,&h04,&h04,&h04,&h04, &h04,&h04,&h05,&h05,&h05,&h05,&h05,&h05,&h05,&h05,&h06,&h06,&h06,&h06,&h06,&h06, &h06,&h07,&h07,&h07,&h07,&h07,&h08,&h08,&h08,&h08,&h08,&h09,&h09,&h09,&h09,&h0A, &h0A,&h0A,&h0A,&h0B,&h0B,&h0B,&h0B,&h0C,&h0C,&h0C,&h0D,&h0D,&h0D,&h0E,&h0E,&h0E, &h0F,&h0F,&h10,&h10,&h10,&h11,&h11,&h12,&h12,&h13,&h13,&h14,&h14,&h15,&h15,&h16, &h16,&h17,&h17,&h18,&h19,&h19,&h1A,&h1B,&h1B,&h1C,&h1D,&h1E,&h1E,&h1F,&h20,&h21, &h22,&h22,&h23,&h24,&h25,&h26,&h27,&h28,&h29,&h2A,&h2B,&h2D,&h2E,&h2F,&h30,&h31, &h33,&h34,&h35,&h37,&h38,&h3A,&h3B,&h3D,&h3E,&h40,&h41,&h43,&h45,&h47,&h48,&h4A, &h4C,&h4E,&h50,&h52,&h55,&h57,&h59,&h5B,&h5E,&h60,&h63,&h65,&h68,&h6B,&h6D,&h70, &h73,&h76,&h79,&h7C,&h80,&h83,&h86,&h8A,&h8D,&h91,&h95,&h99,&h9D,&hA1,&hA5,&hA9, &hAE,&hB2,&hB7,&hBB,&hC0,&hC5,&hCA,&hD0,&hD5,&hDB,&hE0,&hE6,&hEC,&hF2,&hF9,&hFF