{$IFDEF miniDDS} procedure miniDDS; begin disableints; m:= byte(wave); asm; mov _ACCA, SoftDDS.m ldi _ACCDLO, $FF; kein Taster gedrückt-Vergleich mov SoftDDS.m, _ACCDLO ; set sinewave output as default ldi _ACCCHI, SoftDDS.sinus SHRB 8; setup Z pointer hi ldi _ACCCLO, SoftDDS.sinus AND $FF; setup Z pointer lo ldi _ACCDHI, $00; clear accumulator ldi _ACCDLO, $00 mov _ACCFLO, SoftDDS.DDSL; setup adder registers mov _ACCFHI, SoftDDS.DDSM mov _ACCBLO, SoftDDS.DDSH; tst _ACCA breq SoftDDS.SinLoop dec _ACCA breq SoftDDS.TriLoop dec _ACCA breq SoftDDS.SquLoop rjmp SoftDDS.myExit ; _ACCDLO, _ACCDHI, _ACCCLO is the phase accumulator ; _ACCFLO, _ACCFHI, _ACCBLO is the adder value determining frequency ; Sinus: SoftDDS.SinLoop: add _ACCDLO, _ACCFLO; 1 add value to accumulator adc _ACCDHI, _ACCFHI; 1 adc _ACCCLO, _ACCBLO; 1 lpm; 3, ROM Zugriff Sinustabelle out PORTA, _ACCGLO; 1 output byte to port in _ACCA, PIND; 1 CPSE _ACCA, SoftDDS.m; 2, bei Änderung an Taster-Port abbrechen rjmp SoftDDS.myExit; bei Abbruch rjmp SoftDDS.SinLoop; 2 = > 12 cycles ; Rechteck: SoftDDS.SquLoop: add _ACCDLO, _ACCFLO; 1 adc _ACCDHI, _ACCFHI; 1 adc _ACCCLO, _ACCBLO; 1 ldi _ACCA, $00; 1 brmi SoftDDS.setsqu; 1 / 2 ldi _ACCA, $FF; 0 / 1 SoftDDS.setsqu: out PORTA, _ACCA; 1 in _ACCA, PIND; 1 CPSE _ACCA, SoftDDS.m; 2, bei Änderung an Taster-Port abbrechen rjmp SoftDDS.myExit; bei Abbruch rjmp SoftDDS.SquLoop; 2 = > 12 cycles in SoftDDS.m, PIND; m:= PinD; ldi _ACCDHI, $00; clear accumulator ldi _ACCDLO, $00 mov _ACCFLO, SoftDDS.DDSL; setup adder registers mov _ACCFHI, SoftDDS.DDSM mov _ACCBLO, SoftDDS.DDSH; ; Sägezahn: SoftDDS.TriLoop: add _ACCDLO, _ACCFLO; 1 adc _ACCDHI, _ACCFHI; 1 adc _ACCCLO, _ACCBLO; 1 mov _ACCA, _ACCCLO; Zählerstand LSB nop nop out PORTA, _ACCA; 1 in _ACCA, PIND; 1 CPSE _ACCA, SoftDDS.m; 2, bei Änderung an Taster-Port abbrechen rjmp SoftDDS.myExit; bei Abbruch rjmp SoftDDS.TriLoop; 2 = > 12 cycles SoftDDS.myExit: ldi _ACCA, 128; Ausgang auf 8-Bit-Mittelwert out PORTA, _ACCA endasm; enableints; end; {$ENDIF} procedure SendSR; //Sende MP3switchState an den 4094 oder Ausgangsport begin if MP3isOn then b_MP3Power:= c_MP3On; else b_MP3Power:= c_MP3Off; endif; {$IFDEF miniDDS} PortB:= MP3switchState; {$ELSE} asm; LDS _ACCA, SoftDDS.MP3switchState; sbi SoftDDS.DDSOutPort, SoftDDS.b_STROBE cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK ldi _ACCB, 8 SoftDDS.srloop: LSL _ACCA brcs SoftDDS.datahigh1 cbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA rjmp SoftDDS.dataset1 SoftDDS.datahigh1: sbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA SoftDDS.dataset1: nop sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK nop cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK dec _ACCB BRNE SoftDDS.srloop cbi SoftDDS.DDSOutPort, SoftDDS.b_STROBE sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK endasm; {$ENDIF} end; {AD9833 DDS functions } {$IFNDEF miniDDS} procedure SendDDS; //Sende ein Wort an den DDS-Chip begin _ACCDLO:=lo(dss_cmd); _ACCDHI:=hi(dss_cmd); // for i := 0 to 15 do asm; lds _ACCDLO, SoftDDS.dss_cmd lds _ACCDHI, SoftDDS.dss_cmd+1 cbi SoftDDS.DDSOutPort, SoftDDS.b_FSYNC ldi _ACCB, 8 SoftDDS.ddsloop1: ;höherwertiges Byte rausschieben lsl _ACCDHI brcs SoftDDS.ddsdatahigh cbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA rjmp SoftDDS.ddsdataset SoftDDS.ddsdatahigh: sbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA SoftDDS.ddsdataset: cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK nop sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK dec _ACCB brne SoftDDS.ddsloop1 ldi _ACCB, 8 SoftDDS.dssloop2: ;niederwertiges Byte rausschieben lsl _ACCDLO brcs SoftDDS.ddsdatahigh2 cbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA rjmp SoftDDS.ddsdataset2 SoftDDS.ddsdatahigh2: sbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA SoftDDS.ddsdataset2: cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK nop sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK dec _ACCB brne SoftDDS.dssloop2 sbi SoftDDS.DDSOutPort, SoftDDS.b_FSYNC endasm; end; {$ENDIF} procedure SetFrequ; var freq, fac, acc : LongInt; freqHi, freqLo : word; begin freq:= 0; for i := 0 to 6 do //Einzelne Stellen aufaddieren fac:= LongInt(gettable(EditArray, (i))); acc:= gettable(fhz, i); freq:= freq + (acc*fac); endfor; acc:= LongInt(gettable(fdhz, FrequDez)); //Dezihertz freq:= freq + acc; {$IFDEF miniDDS} freqHi:= hiword(freq); freqLo:= Loword(freq); DDSL:= Lo(freqLo); DDSM:= Hi(freqLo); DDSH:= Lo(freqHi); {$ELSE} dss_cmd:= loword(freq) AND %0011111111111111; dss_cmd:= dss_cmd OR %0100000000000000; SendDDS; freq:= freq shl 2; dss_cmd:= hiword(freq) AND %0011111111111111; dss_cmd:= dss_cmd OR %0100000000000000; SendDDS; dss_cmd:= wave_cmd; SendDDS; {$ENDIF} end;