home *** CD-ROM | disk | FTP | other *** search
/ World of Ham Radio 1997 / WOHR97_AmSoft_(1997-02-01).iso / basic / network.bas < prev    next >
BASIC Source File  |  1997-02-01  |  8KB  |  272 lines

  1. 1000 ' NETWORK - An AC electronic circuit simulator program
  2. 1001 '
  3. 1002 ' Origional: "Verify Network Frequency Response With This
  4. 1003 '             Simple BASIC Program", Werner Schnider, EDN
  5. 1004 '           magazine, Oct. 5, 1977 (HP 9830 implementation).  
  6. 1005 '
  7. 1010 ' Next:      "Basic Program Performs Circuit Analysis", Richard
  8. 1011 '            Steincross, EDN magazine, Sept. 1, 1982 (Apple ][
  9. 1012 '            implementation with inductive elements added)    
  10. 1013 '
  11. 1020 ' Now:      Converted for the IBM PC/XT and compatibles by
  12. 1021 '          Bruce A. Trolli, Cleveland, Oh., 2/16/85
  13. 1022 '
  14. 1100 CLS
  15. 1110 LOCATE 2,10:PRINT "AC ELECTRONIC CIRCUIT FREQUENCY RESPONSE"
  16. 1120 LOCATE 4,20:PRINT "NETWORK   (V1.0)"
  17. 1140 PRINT
  18. 1160 I=0:J=0:K=0:N=0:I1=0
  19. 1180 GOSUB 6200              ' Print help information on screen
  20. 1190 PRINT
  21. 1200 Y=40                               ' Allocate memory for circuit
  22. 1220 'Note: If you have less than 64K in your system, you must decrease Y
  23. 1240 DIM A(Y,Y),B(Y,Y),P(Y,Y),Q(Y,Y),B1(Y,Y),Q1(Y,Y)
  24. 1300 N=0:PI=3.141592:LGTEN=8.685889    ' Initialize constants    
  25. 1340 INPUT"What file for input? [Hit CR for list.] ",F$
  26. 1360 IF F$="" THEN FILES"*.net":GOTO 1340     ' Show possible input files
  27. 1380 FOR I=1 TO LEN(F$)                ' Check for extension
  28. 1400 IF MID$(F$,I,1)="." THEN J=I
  29. 1420 NEXT I
  30. 1440 IF J<>0 THEN F$=MID$(F$,1,J-1)        ' Add .NET if missing    
  31. 1460 F$=F$+".net"
  32. 1500 OPEN F$ FOR INPUT AS #1
  33. 1510 PRINT
  34. 1530 '
  35. 1531 '
  36. 1532 '************* Main Loop for Input of Circuit Description *************
  37. 1533 '
  38. 1540 IF EOF(1) THEN GOTO 2220
  39. 1545 INPUT #1,Z$
  40. 1550 PRINT Z$
  41. 1560 E$=Z$:Z$=LEFT$(Z$,1)
  42. 1570 IF Z$=";" THEN GOTO 1540              'Comment for Description of Circuit
  43. 1580 IF Z$="R" OR Z$="r" THEN 1860         'Resistors
  44. 1600 IF Z$="C" OR Z$="c" THEN 1900         'Capacitors
  45. 1620 IF Z$="L" OR Z$="l" THEN 1960         'Inductors
  46. 1640 IF Z$="O" OR Z$="o" THEN 2140         'Amplifiers
  47. 1660 IF Z$="F" OR Z$="f" THEN 2020         'Fets
  48. 1680 IF Z$="B" OR Z$="b" THEN 2060         'Bipolar Transistors
  49. 1720 CLOSE #1                              'Not Valid Component
  50. 1730 BEEP:BEEP
  51. 1740 PRINT
  52. 1760 PRINT"Bad component type":PRINT Z$
  53. 1800 PRINT
  54. 1840 END
  55. 1850 '
  56. 1851 '
  57. 1852 ' ************** Enter Component Parameters into Matrix ****************
  58. 1853 '
  59. 1860 INPUT #1,I,J,V                     'resistor
  60. 1861 PRINT I,J,V
  61. 1880 V=1/V:GOSUB 3900:GOTO 1540
  62. 1900 INPUT #1,I,J,V                     ' capacitor
  63. 1901 PRINT I,J,V
  64. 1920 V=V/1000000!
  65. 1940 GOSUB 4120:GOTO 1540
  66. 1960 INPUT #1,I,J,V                     ' inductor
  67. 1961 PRINT I,J,V
  68. 1980 V=-1/V
  69. 2000 GOSUB 4260:GOTO 1540
  70. 2020 INPUT #1,K,J,I,V                     'fet
  71. 2021 PRINT K,J,I,V
  72. 2040 L=J:GOTO 2200
  73. 2060 INPUT #1,K,J,I,B1,V                 'npn transistor
  74. 2061 PRINT K,J,I,B1,V
  75. 2080 L=I:I=K:V=1/V:GOSUB 3900
  76. 2100 I=L:L=J:GOTO 2180
  77. 2120                            ' op amp
  78. 2140 INPUT #1,K,L,J,I,B1,V 'in+,-:out+,-:,gain,ohms
  79. 2141 PRINT K,L,J,I,B1,V
  80. 2160 V=1/V:GOSUB 3900
  81. 2180 V=B1*V
  82. 2200 GOSUB 4400:GOTO 1540
  83. 2220 E=1:F=N                                            'end read io
  84. 2240 CLOSE #1
  85. 2300 FOR I=0 TO N
  86. 2320 FOR J=0 TO N
  87. 2340 P(I,J)=A(I,J)
  88. 2360 Q1(I,J)=B1(I,J)
  89. 2380 Q(I,J)=B(I,J)
  90. 2400 NEXT J:NEXT I
  91. 3000 PRINT
  92. 3020 PRINT "This circuit has ";N;"nodes"
  93. 3040 PRINT "Node";E;"is INPUT &  Node";F;"IS OUTPUT"
  94. 3060 PRINT
  95. 3200 ' entry point for new freq range
  96. 3225 INPUT "Enter file for data save [CR for no-save]: ",DATFILE$
  97. 3226 IF DATFILE$<>"" THEN OPEN DATFILE$ FOR OUTPUT AS #2
  98. 3260 PRINT
  99. 3280 PRINT "Frequency range [Start,End,Increment (- for log incr)] ";
  100. 3320 INPUT G,H,D
  101. 3340 PRINT
  102. 3360 PRINT"        Frequency         Amplitude       Amplitude(db)  Phase"
  103. 3370 PRINT"--------------------------------------------------------------------"
  104. 3380 IF D<0 THEN F2=-D:GOTO 3420
  105. 3400 F2=1+(H-G)/D
  106. 3420 IF D<0 THEN D=-((H/G)^(1/(-D-1)))
  107. 3440 F1=G
  108. 3460 FOR I1=1 TO F2
  109. 3480 W=2*PI*F1:D1=E:D2=F:GOSUB 5660
  110. 3500 V=B1:U=D2
  111. 3520 IF (-1)^(E+F) >0 THEN 3560
  112. 3540 U=U-180
  113. 3560 D1=E:D2=E
  114. 3580 GOSUB 5660:V=V/B1:U=U-D2
  115. 3600 IF U>180 THEN U=U-360
  116. 3620 IF U<-180 THEN U=U+360
  117. 3640 DB=LGTEN*LOG(V)
  118. 3645 T1=F1
  119. 3646 T2=V
  120. 3647 T3=DB
  121. 3648 T4=U
  122. 3660 PRINT USING "##########.#######";T1;
  123. 3680 PRINT USING "###########.#######";T2;
  124. 3685 PRINT USING "#######.#######";T3;
  125. 3700 PRINT USING "#####.#######";T4
  126. 3705 IF DATFILE$<>"" THEN WRITE #2,T1,T2,T3,T4
  127. 3720 IF D<0 THEN F1 =-F1*D:GOTO 3760
  128. 3740 F1=F1+D
  129. 3760 NEXT I1
  130. 3765 CLOSE #2
  131. 3780 PRINT CHR$(7): ' ring bell
  132. 3800 PRINT "Do you want a new freq sweep ";
  133. 3820 INPUT Z$
  134. 3840 PRINT:IF Z$="y" OR Z$="Y" THEN 3000
  135. 3860 END
  136. 3885 '
  137. 3886 ' Calculation Portion
  138. 3887 '
  139. 3888 '
  140. 3900 IF I=0 THEN 4000
  141. 3920 A(I,I)=A(I,I)+V
  142. 3940 IF J=0 THEN 4020
  143. 3960 A(I,J)=A(I,J)-V
  144. 3980 A(J,I)=A(J,I)-V
  145. 4000 A(J,J)=A(J,J)+V
  146. 4020 IF I<N THEN 4060
  147. 4040 N=I
  148. 4060 IF J<N THEN 4100
  149. 4080 N=J
  150. 4100 RETURN
  151. 4120 IF I=0 THEN 4220
  152. 4140 B(I,I)=B(I,I)+V
  153. 4160 IF J=0 THEN 4020
  154. 4180 B(I,J)=B(I,J)-V
  155. 4200 B(J,I)=B(J,I)-V
  156. 4220 B(J,J)=B(J,J)+V
  157. 4240 GOTO 4020
  158. 4260 IF I=0 THEN 4360
  159. 4280 B1(I,I)=B1(I,I)+V
  160. 4300 IF J=0 THEN 4020
  161. 4320 B1(I,J)=B1(I,J)-V
  162. 4340 B1(J,I)=B1(J,I)-V
  163. 4360 B1(J,J)=B1(J,J)+V
  164. 4380 GOTO 4020
  165. 4400 IF I<>0 AND K<>0 THEN A(I,K)=A(I,K)+V
  166. 4420 IF J<>0 AND L<>0 THEN A(J,L)=A(J,L)+V
  167. 4440 IF J<>0 AND K<>0 THEN A(J,K)=A(J,K)-V
  168. 4460 IF I<>0 AND L<>0 THEN A(I,L)=A(I,L)-V
  169. 4480 IF K<N THEN 4520
  170. 4500 N=K
  171. 4520 IF L<N THEN 4560
  172. 4540 N=L
  173. 4560 GOTO 4020
  174. 4580 ' determinant computation
  175. 4600 IF N>1 THEN 4640
  176. 4620 D1=A(N,N):D2=B(N,N):RETURN
  177. 4640 D1=1:D2=0:K=1
  178. 4660 L=K
  179. 4680 S=ABS(A(K,K))+ABS(B(K,K))
  180. 4700 FOR I=K TO N
  181. 4720 T=ABS(A(I,K))+ABS(B(I,K))
  182. 4740 IF S>=T THEN 4780
  183. 4760 L=I:S=T
  184. 4780 NEXT I
  185. 4800 IF L=K THEN 4960
  186. 4820 FOR J=1 TO N
  187. 4840 S=-A(K,J)
  188. 4860 A(K,J)=A(L,J)
  189. 4880 A(L,J)=S
  190. 4900 S1=-B(K,J)
  191. 4920 B(K,J)=B(L,J):B(L,J)=S1
  192. 4940 NEXT J
  193. 4960 L=K+1
  194. 4980 FOR I=L TO N
  195. 5000 S1=A(K,K)*A(K,K)+B(K,K)*B(K,K)
  196. 5020 S=(A(I,K)*A(K,K)+B(I,K)*B(K,K))/S1
  197. 5040 B(I,K)=(A(K,K)*B(I,K)-A(I,K)*B(K,K))/S1
  198. 5060 A(I,K)=S:NEXT I
  199. 5080 J2=K-1
  200. 5100 IF J2=0 THEN 5220
  201. 5120 FOR J=L TO N
  202. 5140 FOR I=1 TO J2
  203. 5160 A(K,J)=A(K,J)-A(K,I)*A(I,J)+B(K,I)*B(I,J)
  204. 5180 B(K,J)=B(K,J)-B(K,I)*A(I,J)-A(K,I)*B(I,J)
  205. 5200 NEXT I:NEXT J
  206. 5220 J2=K:K=K+1
  207. 5240 FOR I=K TO N
  208. 5260 FOR J=1 TO J2
  209. 5280 A(I,K)=A(I,K)-A(I,J)*A(J,K)+B(I,J)*B(J,K)
  210. 5300 B(I,K)=B(I,K)-B(I,J)*A(J,K)-A(I,J)*B(J,K)
  211. 5320 NEXT J:NEXT I
  212. 5340 IF K<>N THEN 4660
  213. 5360 L=1
  214. 5380 J2=INT(N/2)
  215. 5400 IF N=2*J2 THEN 5480
  216. 5420 L=0
  217. 5440 D1=A(N,N)
  218. 5460 D2=B(N,N)
  219. 5480 FOR I=1 TO J2
  220. 5500 J=N-I+L
  221. 5520 S=A(I,I)*A(J,J)-B(I,I)*B(J,J)
  222. 5540 S1=A(I,I)*B(J,J)+A(J,J)*B(I,I)
  223. 5560 T=D1*S-D2*S1
  224. 5580 D2=D2*S+D1*S1
  225. 5600 D1=T
  226. 5620 NEXT I
  227. 5640 RETURN
  228. 5660 N1=N:N=N-1:I=0
  229. 5680 FOR K=1 TO N
  230. 5700 IF K<>D1 THEN 5740
  231. 5720 I=1
  232. 5740 J=0
  233. 5760 FOR L=1 TO N
  234. 5780 IF L<>D2 THEN 5820
  235. 5800 J=1
  236. 5820 A(K,L)=P(K+I,L+J)
  237. 5840 B(K,L)=W*Q(K+I,L+J)+Q1(K+I,L+J)/W
  238. 5860 NEXT L:NEXT K
  239. 5880 GOSUB 4600
  240. 5900 N=N1
  241. 5920 B1=SQR(D1*D1+D2*D2)
  242. 5940 IF D1<>0 THEN 6020
  243. 5960 IF D2=0 THEN 6100
  244. 5980 IF D2>0 THEN D2=90:GOTO 6100
  245. 6000 D2=-90:GOTO 6100
  246. 6020 IF D1<0 THEN Q=180:GOTO 6060
  247. 6040 Q=0
  248. 6060 IF D2<0 THEN Q=-Q
  249. 6080 D2=Q+180*ATN(D2/D1)/PI
  250. 6100 RETURN
  251. 6200 '
  252. 6201 '
  253. 6202 '
  254. 6205 '******************** Print help information *****************
  255. 6206 '
  256. 6220 PRINT"Data must be in a text file in the following format:"
  257. 6240 PRINT
  258. 6260 PRINT"R    (resistor)"
  259. 6280 PRINT"from node #, to node #, value in ohms"
  260. 6300 PRINT"C    (capacitor)"
  261. 6320 PRINT"from node #, to node #, value in microfarads"
  262. 6340 PRINT"L    (inductor)"
  263. 6360 PRINT"from node #, to node #, value in henries"
  264. 6380 PRINT"F    (fet transistor)"
  265. 6400 PRINT"gate, source, drain, gain (amps/volts)"
  266. 6420 PRINT"B    (bipolar transistor)"
  267. 6440 PRINT"base, emitter, collector, beta, b-e ohms"
  268. 6460 PRINT"O    (op-amp)"
  269. 6480 PRINT"+in, -in, +out, -out, gain, ohms out"
  270. 6540 PRINT
  271. 6560 RETURN
  272.