procedure SerCRLF; begin Serout(#$0D); Serout(#$0A); end; procedure serprompt(ok:boolean); begin if ok then Serout(#$3D); //"=" else Serout(#$3F); //"?" endif; Serout(#$3E); //">" SerCRLF; aBool:=ok; end; procedure BurstGen; //Burst-Generierung per Software, während auf Tastatureingabe gewartet wird begin if BurstMode <> 0 then if isSysTimerZero(BurstTimer) then setSystimer(BurstTimer, 10); dec(BurstCount); if BurstCount = 0 then dss_cmd:= c_ddsresetcmd; SendDDS; BurstCount:= BurstMode + 1; BurstPrime:= true; endif; endif; if BurstCount = 1 then if BurstPrime then dss_cmd:= wave_cmd; SendDDS; BurstPrime:= false; endif; endif; endif; end; procedure SerOutFreq(myfreq: Longint); var lastdigit:char; l:byte; begin FreqStr:= longtostr(myfreq); // ohne führenden Nullen l:=length(FreqStr); lastdigit:=FreqStr[l]; //letztes Zeichen dec(l); SetLength(freqStr,l); write(serout, freqStr); serout('.'); serout(lastdigit); end; procedure SetSweepUpper; // obere Frequenz-Grenze für Sweep setzen begin SweepUpper:=longint(gettable(SweepFak,SweepRange)); SweepUpper:=SweepUpper*Frequenz; SweepStarted:=false; end; procedure SweepGen; //Sweep-Generierung per Software, Ausgabe aktueller Frequenz seriell begin if (SweepRange <> 0) then // dec(SweepCount); if not SweepStarted then setSystimer(BurstTimer, SweepTime); SetLevelDDS; // SweepCount:=0; SweepStarted:=true; endif; if isSysTimerZero(BurstTimer) then setSystimer(BurstTimer, SweepTime); AktuelleFrequenz:=(AktuelleFrequenz * 101) div 100; SetLevelDDS; mdelay(word(SweepTime)); if AktuelleFrequenz>=SweepUpper then SweepStarted:=false; AktuelleFrequenz:=Frequenz; if SweepOnce then SweepRange:=0; write(serout, StopStr); SerCRLF; serprompt(true); SweepOnce:=false; AktuelleFrequenz:=Frequenz; SetLevelDDS; // Falls durch Burst abgeschaltet endif; endif; endif; { if SweepCount <= 0 then SweepCount:=3; // Alle 4 neuen Frequenzen eine Ausgabe write(serout, SCPIFreqStr); SerOutFreq(AktuelleFrequenz); serout(#10); endif; } else AktuelleFrequenz:=Frequenz; if SweepOnce then serprompt(true); SweepOnce:=false; SetLevelDDS; // Falls durch Burst abgeschaltet endif; endif; end; procedure ParseCmd; var InpStr:string[63]; ParamStr:string[15]; Param:LongInt; ParamByte:byte; ParamDez:byte; Request:boolean; CmdChar1, CmdChar2:char; begin readln(SerInp, InpStr); InpStr:=uppercase(InpStr); if length(InpStr) = 0 then serprompt(true); return; endif; //Parse einzelnen Befehl i:=pos(' ',InpStr); // Trenner Request:=(pos('?',InpStr)>1); // Request CmdChar1:=InpStr[1]; CmdChar2:=InpStr[2]; ParamStr:=copy(InpStr,i+1,15); i:=pos('.',ParamStr); ParamDez:=0; if i > 1 then ParamStr:=copy(ParamStr,1,i-1); ParamDez:=byte(ParamStr[i+1])-48; // 1. Nachkommastelle endif; Param:=StrtoInt(ParamStr); ParamByte:=byte(Param); aBool:=true; if request then case CmdChar1 of '*': if (Cmdchar2='I') then write(Serout,Vers1Str); SerCRLF; else serprompt(false); endif; | 'F': SeroutFreq(AktuelleFrequenz); SerCRLF; | 'W': write(serout, bytetostr(wave)); SerCRLF; | 'V', 'M': write(Serout,inttostr(GetAdc)); SerCRLF; | else serprompt(false); endcase; else // kein Request, also Parameter setzen case CmdChar1 of 'F': AktuelleFrequenz:= Param * 10 + longInt(ParamDez); Frequenz:=AktuelleFrequenz; SetSweepUpper; | 'W': wave:= ParamByte; | 'L': // AttnStep:= ParamByte; | 'B': BurstMode:= ParamByte; | 'S': // SweepRange SweepRange:= ParamByte; SweepOnce:=true; SetSweepUpper; SerOutFreq(Frequenz); serout(#44); //"," serout(#32); SerOutFreq(SweepUpper); SerCRLF; | 'T': // SweepTime SweepTime:= ParamByte; | else serprompt(false); endcase; endif; if aBool then serprompt(true); endif; SetLevelDDS; end; {###########################################################################}