Programa Calculador de Rms
-
Upload
paul-william-rabino -
Category
Documents
-
view
235 -
download
0
Transcript of Programa Calculador de Rms
-
7/28/2019 Programa Calculador de Rms
1/34
PROGRAMA CALCULADOR DE RMS
DECLARE SUB sinewave ()
DECLARE SUB squarewave ()
DECLARE SUB sawtoothwave ()
DIM SHARED waveType AS INTEGER
DIM SHARED outputFile AS INTEGERDIM SHARED pi AS SINGLE
pi = 3.141593
DIM SHARED A AS SINGLE
DIM SHARED B AS SINGLE
DIM SHARED D AS SINGLE
DIM SHARED E AS SINGLE
DIM SHARED F AS SINGLE
DIM SHARED K AS SINGLE
DIM SHARED X AS SINGLE
DIM SHARED arccosX AS SINGLE
DIM SHARED average AS SINGLE
DIM SHARED totalRMS AS SINGLE
DIM SHARED acRMS AS SINGLEDIM SHARED rectAve AS SINGLE
DIM SHARED acRectAve AS SINGLE
DIM SHARED acRctAveCF AS SINGLE
SCREEN 12
CLS
10
PRINT "Enter the type of waveform you want to analyze."
PRINT "1 for sine wave, 2 for square wave, "
INPUT "3 for sawtooth/triangle wave, 4 to end program."; waveType
IF waveType = 4 THEN SYSTEM
PRINT " "
CLOSE
INPUT "Enter 1 if you want to save the output to a file called RMSOUT.TXT"; outputFilePRINT " "
IF outputFile = 1 THEN
OPEN "RMSout.txt" FOR APPEND AS #1
END IF
IF waveType = 1 THEN
CALL sinewave
ELSEIF waveType = 2 THEN
CALL squarewave
ELSEIF waveType = 3 THEN
CALL sawtoothwave
ELSE GOTO 10
END IF
PRINT "Average Voltage ="; average
PRINT "Total RMS Voltage ="; totalRMS
PRINT "AC RMS Voltage ="; acRMS
PRINT "Rectified Average Voltage ="; rectAve
PRINT "AC Rectified Average Voltage ="; acRectAve
PRINT "AC Rectified Average times 1.110721 (AC voltmeter reading) ="; acRctAveCF
PRINT " "
PRINT " "
IF outputFile = 1 THEN
PRINT #1, "Average Voltage ="; average
PRINT #1, "Total RMS Voltage ="; totalRMS
PRINT #1, "AC RMS Voltage ="; acRMS
PRINT #1, "Rectified Average Voltage ="; rectAve
PRINT #1, "AC Rectified Average Voltage ="; acRectAve
PRINT #1, "AC Rectified Average times 1.110721 (AC voltmeter reading) =";
acRctAveCF
PRINT #1, " "
PRINT #1, " "
END IF
-
7/28/2019 Programa Calculador de Rms
2/34
CLOSE
GOTO 10
SUB sawtoothwave
100
INPUT "enter A, (the upper peak voltage)"; A
INPUT "enter B, (the lower peak voltage)"; B
PRINT " "
IF A < B THEN
PRINT "A must be greater than or equal to B."
GOTO 100
END IF
average = (A + B) / 2
totalRMS = SQR((A ^ 2 + A * B + B ^ 2) / 3)
E = A - average
F = B - average
acRMS = E / SQR(3)
IF B > 0 OR B = 0 THEN
rectAve = average
ELSEIF A < 0 OR A = 0 THEN
rectAve = -average
ELSE
rectAve = (A ^ 2 + B ^ 2) / (2 * A - 2 * B)
END IF
acRectAve = E / 2
acRctAveCF = acRectAve * 1.110721#
PRINT "Sawtooth/Triangle Wave"
PRINT "Upper Peak Voltage A ="; A
PRINT "Lower Peak Voltage B ="; B
IF outputFile = 1 THEN
PRINT #1, "Sawtooth/Triangle Wave"
PRINT #1, "Upper Peak Voltage A ="; A
PRINT #1, "Lower Peak Voltage B ="; B
END IF
END SUB
SUB sinewave
200
INPUT "enter A, (the upper peak voltage)"; A
INPUT "enter B, (the lower peak voltage)"; B
PRINT " "
IF A < B THEN
PRINT "A must be greater than or equal to B."
GOTO 200
END IF
average = (A + B) / 2
totalRMS = SQR((((A - B) ^ 2) / 8) + (((A + B) ^ 2) / 4))
E = A - average
F = B - average
acRMS = E / SQR(2)IF B > 0 OR B = 0 THEN
rectAve = average
ELSEIF A < 0 OR A = 0 THEN
rectAve = -average
ELSE
X = (B + A) / (B - A)
IF X = 1 THEN
arccosX = 0
ELSE
arccosX = ATN(-X / SQR(1 - X ^ 2)) + pi / 2
END IF
K = (1 / pi) * arccosX
rectAve = (((A - B) / pi) * SIN(K * pi)) + K * (A + B) - ((A + B) / 2)END IF
acRectAve = (2 * E) / pi
acRctAveCF = acRectAve * 1.110721#
PRINT "Sine Wave"
-
7/28/2019 Programa Calculador de Rms
3/34
PRINT "Upper Peak Voltage A ="; A
PRINT "Lower Peak Voltage B ="; B
IF outputFile = 1 THEN
PRINT #1, "Sine Wave"
PRINT #1, "Upper Peak Voltage A ="; A
PRINT #1, "Lower Peak Voltage B ="; B
END IF
END SUB
SUB squarewave
300
INPUT "enter A, (the upper peak voltage)"; A
INPUT "enter B, (the lower peak voltage)"; B
PRINT " "
IF A < B THEN
PRINT "A must be greater than or equal to B."
GOTO 300
END IF
310
PRINT "enter D, (the duty cycle of the square wave)"
PRINT "The duty cycle D is the fraction of a period"
PRINT "during which the wave remains at A."
INPUT "Therefore D can be from 0 to 1"; D
PRINT " "
IF D > 1 GOTO 310
IF D < 0 GOTO 310
average = A * D + B - B * D
totalRMS = SQR(((A ^ 2) * D) + (B ^ 2) - ((B ^ 2) * D))
E = A - average
F = B - average
acRMS = SQR(((E ^ 2) * D) + (F ^ 2) - ((F ^ 2) * D))
IF B > 0 OR B = 0 THEN
rectAve = average
ELSEIF A < 0 OR A = 0 THEN
rectAve = -average
ELSE
rectAve = A * D - B + B * D
END IF
acRectAve = E * D - F + F * D
acRctAveCF = acRectAve * 1.110721#
PRINT "Square Wave"
PRINT "Upper Peak Voltage A ="; A
PRINT "Lower Peak Voltage B ="; B
PRINT "Duty Cycle is"; D * 100; "%"
IF outputFile = 1 THEN
PRINT #1, "Square Wave"
PRINT #1, "Upper Peak Voltage A ="; A
PRINT #1, "Lower Peak Voltage B ="; B
PRINT #1, "Duty Cycle is"; D * 100; "%"
END IFEND SUB
-
7/28/2019 Programa Calculador de Rms
4/34
REM IgnCapCoil.bas written by Louis Dudzik Feb 12 '04
DECLARE SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
SCREEN 12
5
CLS 0
PRINT "This program analyzes a capacitor-driven ignition-coil-circuit. It is a"
PRINT "special case of a general RLC series circuit. Specifically, the capacitor"
PRINT "has an initial voltage on it, but there is no initial current in the circuit."
PRINT "Given R, L, C, and the initial voltage on the capacitor, the program plots"
PRINT "the current as a function of time, and the capacitor's voltage as a"
PRINT "function of time."
PRINT " The program first determines the damping of the circuit. It can be"
PRINT "underdamped, overdamped, or critically damped. Depending on the "
PRINT "damping, the program selects the appropriate equations to use."
PRINT "The current is plotted as a thin, solid line."
PRINT "The capacitor voltage is plotted as a dotted line."
PRINT "The X axis is time in seconds."
PRINT "The Y axis is both current in Amps and voltage in Volts."
PRINT " Note: there is no checking of out-of-range variables, so overflow"
PRINT "errors may result if input values are not selected carefully."
PRINT "Printing: This progam can generate a bitmap file of the screen. The files"
PRINT "will appear in the same folder as this program file resides. If it will be "
PRINT "printed out, it is recommended the file be opened in MSPaint and edited."
PRINT "If converting to black and white, first save as 24bit BMP then "
PRINT "invert colors and convert to black and white. It's all done in MSPaint."
PRINT " Seven different time scales can be chosen from."
PRINT "0 to .001 sec."
PRINT "0 to .01 sec."
PRINT "0 to .1 sec."
PRINT "0 to 1 sec."
PRINT "0 to 10 sec."
PRINT "0 to 100 sec."
PRINT "0 to 1000 sec."
INPUT "Enter the number of seconds for the x axis (default is .1)"; tScale
REM "tScale" is the range of the x axis in seconds
IF tScale < 0 THEN GOTO 5
IF tScale = 0 THEN
REM default case
tScale = .1
GOTO 8
END IF
IF tScale < .0011 THENtScale = .001
GOTO 8
END IF
IF tScale < .011 THEN
tScale = .01
GOTO 8
END IF
IF tScale < .11 THEN
tScale = .1
GOTO 8
END IF
IF tScale < 1.1 THEN
tScale = 1
GOTO 8
-
7/28/2019 Programa Calculador de Rms
5/34
END IF
IF tScale < 11 THEN
tScale = 10
GOTO 8
END IF
IF tScale < 110 THEN
tScale = 100
GOTO 8
END IF
tScale = 1000
8
CLS 0
REM the graphics port is set to leave room to the left and bottom for scale indicators
REM Vertically, 0-368 gives 23 spaces, but 1/2 is wasted on top and 1/2 is wasted on
bottom
REM to leave room for the scale numbers so the center of the number lines up with the
graph lines.
REM The graph is broken into 22 useable spaces vertically with a 1/2 unused on top,
REM and 1/2 unused on bottom for a total of 23, and the scale gets 22 numbers.
REM It has to be that way in order for the vertical scale numbers to line up.
REM Vertically, one line of text takes 16 vertical pixels. 368/23 = 16
REM if more vertical space is needed at the bottom for text, the graph loses 16 pixels
per line.
VIEW (39, 0)-(639, 368)
REM graphics port scale will be 0 to "tScale" seconds by -7 to +15 amps/volts.
REM (15.5 and -7.5 in order to center the scale with the scale numbers)
REM tScale is either .001, .01, .1, 1, 10, 100, or 1000.
WINDOW (0, 15.5)-(tScale, -7.5)
REM show the scale numbers of the y axis as 15 to -7
REM note: using "PRINT USING" command to force the formatting.
REM without it, extra spaces get printed.
LOCATE 1, 1
FOR y = 15 TO -7 STEP -1
PRINT USING "####"; y
NEXT y
REM print the x axis time-scale values
LOCATE 24, 1
IF tScale = .001 THEN PRINT " 0sec .0001 .0002 .0003 .0004 .0005 .0006
.0007 .0008 .0009 .001"
IF tScale = .01 THEN PRINT " 0sec .001 .002 .003 .004 .005 .006 .007.008 .009 .01"
IF tScale = .1 THEN PRINT " 0sec .01 .02 .03 .04 .05 .06 .07
.08 .09 .1"
IF tScale = 1 THEN PRINT " 0sec .1 .2 .3 .4 .5 .6 .7
.8 .9 1"
IF tScale = 10 THEN PRINT " 0sec 1 2 3 4 5 6 7
8 9 10"
IF tScale = 100 THEN PRINT " 0sec 10 20 30 40 50 60 70
80 90 100"
IF tScale = 1000 THEN PRINT " 0sec 100 200 300 400 500 600
700 800 900 1000"
10VIEW PRINT 25 TO 30
CLS
CLS 2
-
7/28/2019 Programa Calculador de Rms
6/34
REM -------------Sets up the graph underlay--------------------------------------------
----------
COLOR 8
FOR y = -7 TO 15
LINE (0, y)-(tScale, y)
NEXT y
FOR x = 0 TO tScale + tScale / 100 STEP tScale / 100
REM The x loop goes to "tScale + tScale/100" to put one extra step in the loop.
REM Due to rounding errors, the last step in the loop was not being performed.
REM This is because the STEP calculation was not exactly tScale /100
LINE (x, -7)-(x, 15)
NEXT x
COLOR 15
LINE (0, 15)-(0, -7)
LINE (0, 0)-(tScale, 0)
LINE (0, -23 / 368)-(tScale, -23 / 368)
FOR x = 0 TO tScale + tScale / 10 STEP tScale / 10
REM one extra step is put into the loop. see rem notes above.
LINE (x, -7)-(x, 15)
LINE (x + tScale / 600, -7)-(x + tScale / 600, 15)
NEXT x
REM------------------------------------------------------------------------------------
---------
REM This initializes the color for the plot.
REM each successive plot changes color.
GrphColor = 8
REM command section--------------------------------------------------------------------
-----------
20
VIEW PRINT 27 TO 30
LOCATE 28, 1
COLOR 15
PRINT "Enter 475 to generate a bitmap (BMP) of the screen."
PRINT "Enter 1 to clear screen. 2 to exit. Enter 3 to change time scale (start)."
INPUT "Or just enter 0 to continue."; command%
CLS 2
IF command% = 2 THEN SYSTEM
IF command% = 1 THEN GOTO 10
IF command% = 3 THEN
REM this next line is needed to expand the text port before starting over
VIEW PRINT 1 TO 30
GOTO 5
END IFIF command% = 475 THEN
'this increments a new bitmap name-number every time a bitmap is generated (up to
9999)
BMPnumber% = BMPnumber% + 1
'this makes the new bitmap name based on the new number
BMPname$ = "IGCC" + STR$(BMPnumber%)
PRINT "A bitmap of this screen called "; BMPname$; ".BMP is being generated. Please
wait. "
'the previously set VIEW and WINDOW commands have to be cleared for the sub to
work.
VIEW
WINDOW
FourBIT 0, 0, 639, 479, BMPname$'must now reinstate the VIEW and WINDOW
VIEW (39, 0)-(639, 368)
WINDOW (0, 15.5)-(tScale, -7.5)
CLS 2
-
7/28/2019 Programa Calculador de Rms
7/34
PRINT "Image file "; BMPname$; " is saved in the folder in which this program
resides."
GOTO 20
END IF
REM---------------------------------------------------------------------
REM input section----------------------------------------------------------------------
-----------
REM all equation variables should be double-length floating point. They end in #
INPUT "Enter DC resistance of coil (plus ballast if any) in Ohms "; R#
INPUT "Enter the inductance of the coil in milli-Henrys "; ML#
REM convert to henrys
L# = ML# / 1000
INPUT "Enter the capacitance of the capacitor in Farads "; C#
INPUT "Enter the initial voltage on the capacitor in Volts "; V#
REM -----------------------------------------------------------------------------------
----------
REM clear text window
CLS 2
REM Redraw X axis
LINE (0, 0)-(tScale, 0)
REM change plot color for new plot
GrphColor = GrphColor + 1
IF GrphColor = 15 THEN GrphColor = 9
COLOR GrphColor
VIEW PRINT 25 TO 27
CLS 2
PRINT "The line plot is current. The dotted plot is capacitor voltage."
REM reprint input values in same color
REM to print neatly, they should be converted to single length. They end in !
R! = R#
ML! = ML#
C! = C#
V! = V#
PRINT R!; "ohms "; ML!; "mHenrys "; C!; "farads "; V!; "volts ";
REM determine damping type
alpha# = R# / (2 * L#)
alphaSQ# = alpha# ^ 2
omegaSQ# = 1 / (L# * C#)
IF omegaSQ# < alphaSQ# THEN GOTO 100
IF omegaSQ# > alphaSQ# THEN GOTO 200
IF omegaSQ# = alphaSQ# THEN GOTO 300
GOTO 20
100
REM---------------------------------------overdamp------------------------------------
PRINT " Overdamped."
-
7/28/2019 Programa Calculador de Rms
8/34
s1# = -1 * alpha# + SQR(alphaSQ# - omegaSQ#)
s2# = -1 * alpha# - SQR(alphaSQ# - omegaSQ#)
a1# = V# / (L# * (s2# - s1#))
a2# = (-1 * V#) / (L# * (s2# - s1#))
REM move current graphic cursor to origin
PSET (0, 0)
REM plot i(t) (solid line)
REM t is in seconds
FOR t = 0 TO tScale STEP tScale / 620
i# = a1# * (EXP(s1# * t)) + a2# * (EXP(s2# * t))
i# = -1 * i#
LINE STEP(0, 0)-(t, i#)
NEXT t
REM plot capacitor v(t) dotted line
FOR t = 0 TO tScale STEP tScale / 6200
vc# = -1 * R# * a1# * (EXP(s1# * t)) - R# * a2# * (EXP(s2# * t)) - L# * s1# * a1# *
(EXP(s1# * t)) - L# * s2# * a2# * (EXP(s2# * t))
REM This checks for distance between points on the plot. It skips the point if the
previous point was too close.
IF ABS(vcPrevious# - vc#) < .25 AND ABS(t - tPrevious) < tScale / 130 THEN GOTO 110
REM draw a circle and fill it
radius = tScale / 600
CIRCLE (t, vc#), radius
PAINT (t, vc#)
REM save coordinates of plotted point
vcPrevious# = vc#
tPrevious = t
110
NEXT t
GOTO 20
200
REM-----------------------------------underdamp---------------------------------------
PRINT " Underdamped."
omegaD# = SQR(omegaSQ# - alphaSQ#)
b2# = -1 * V# / (L# * omegaD#)
REM move current graphic cursor to origin
PSET (0, 0)
REM plot i(t) (solid line)
REM t is in secondsFOR t = 0 TO tScale STEP tScale / 620
i# = b2# * EXP(-1 * alpha# * t) * SIN(omegaD# * t)
i# = -1 * i#
LINE STEP(0, 0)-(t, i#)
-
7/28/2019 Programa Calculador de Rms
9/34
NEXT t
REM plot capacitor v(t) dotted line
FOR t = 0 TO tScale STEP tScale / 6200
vc# = -1 * L# * omegaD# * b2# * (EXP(-1 * alpha# * t)) * COS(omegaD# * t) + L# * alpha#
* b2# * (EXP(-1 * alpha# * t)) * SIN(omegaD# * t) - R# * b2# * (EXP(-1 * alpha# * t)) *
SIN(omegaD# * t)
REM This checks for distance between points on the plot. It skips the point if the
previous point was too close.
IF ABS(vcPrevious# - vc#) < .25 AND ABS(t - tPrevious) < tScale / 130 THEN GOTO 210
REM draw a circle and fill it
radius = tScale / 600
CIRCLE (t, vc#), radius
PAINT (t, vc#)
REM save coordinates of plotted point
vcPrevious# = vc#
tPrevious = t
210
NEXT t
GOTO 20
300
REM-----------------------------------------critically damp----------------------------
------
PRINT " Critically damped."
d1# = -1 * V# / L#
REM move current graphic cursor to origin
PSET (0, 0)
REM plot i(t) (solid line)
REM t is in seconds
FOR t = 0 TO tScale STEP tScale / 620
i# = d1# * t * EXP(-1 * alpha# * t)
i# = -1 * i#LINE STEP(0, 0)-(t, i#)
NEXT t
REM plot capacitor v(t) dotted line
FOR t = 0 TO tScale STEP tScale / 6200
vc# = -1 * L# * d1# * (EXP(-1 * alpha# * t)) + alpha# * L# * d1# * t * (EXP(-1 * alpha#
* t)) - R# * d1# * t * (EXP(-1 * alpha# * t))
REM This checks for distance between points on the plot. It skips the point if the
previous point was too close.
IF ABS(vcPrevious# - vc#) < .25 AND ABS(t - tPrevious) < tScale / 130 THEN GOTO 310
REM draw a circle and fill it
radius = tScale / 600
CIRCLE (t, vc#), radius
PAINT (t, vc#)
-
7/28/2019 Programa Calculador de Rms
10/34
REM save coordinates of plotted point
vcPrevious# = vc#
tPrevious = t
310
NEXT t
GOTO 20
'------------------------this is the screen 12 bitmap generator---------------
SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM FileCOLORS%(1 TO 48)
DIM Colors4%(15)
IF INSTR(FileNAME$, ".BMP") = 0 THEN
FileNAME$ = RTRIM$(LEFT$(FileNAME$, 8)) + ".BMP"
END IF
FOR x = x1% TO x2%
FOR y = y1% TO y2%
Colors4%(POINT(x, y)) = 1
NEXT y
NEXT x
FOR n = 0 TO 15
IF Colors4%(n) = 1 THEN SigCOLORS& = SigCOLORS& + 1
NEXT n
FileTYPE$ = "BM"
Reserved1% = 0
Reserved2% = 0
OffsetBITS& = 118
InfoHEADER& = 40
PictureWIDTH& = x2% - x1% + 1
PictureDEPTH& = y2% - y1% + 1
NumPLANES% = 1
BPP% = 4
Compression& = 0
WidthPELS& = 3780
DepthPELS& = 3780
NumCOLORS& = 16
IF PictureWIDTH& MOD 8 0 THEN
ZeroPAD$ = SPACE$((8 - PictureWIDTH& MOD 8) \ 2)
END IF
ImageSIZE& = (((ImageWIDTH& + LEN(ZeroPAD$)) * ImageDEPTH&) + .1) / 2
FileSIZE& = ImageSIZE& + OffsetBITS&
Colr = 0FOR n = 1 TO 48 STEP 3
OUT &H3C7, Colr
FileCOLORS%(n) = INP(&H3C9)
FileCOLORS%(n + 1) = INP(&H3C9)
FileCOLORS%(n + 2) = INP(&H3C9)
Colr = Colr + 1
NEXT n
OPEN FileNAME$ FOR BINARY AS #1
PUT #1, , FileTYPE$
PUT #1, , FileSIZE&
PUT #1, , Reserved1% 'should be zeroPUT #1, , Reserved2% 'should be zero
PUT #1, , OffsetBITS&
PUT #1, , InfoHEADER&
PUT #1, , PictureWIDTH&
-
7/28/2019 Programa Calculador de Rms
11/34
PUT #1, , PictureDEPTH&
PUT #1, , NumPLANES%
PUT #1, , BPP%
PUT #1, , Compression&
PUT #1, , ImageSIZE&
PUT #1, , WidthPELS&
PUT #1, , DepthPELS&
PUT #1, , NumCOLORS&
PUT #1, , SigCOLORS&
u$ = " "
FOR n% = 1 TO 46 STEP 3
Colr$ = CHR$(FileCOLORS%(n% + 2) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n% + 1) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n%) * 4)
PUT #1, , Colr$
PUT #1, , u$ 'Unused byte
NEXT n%
FOR y = y2% TO y1% STEP -1
FOR x = x1% TO x2% STEP 2
HiX = POINT(x, y)
LoX = POINT(x + 1, y)
HiNIBBLE$ = HEX$(HiX)
LoNIBBLE$ = HEX$(LoX)
HexVAL$ = "&H" + HiNIBBLE$ + LoNIBBLE$
a$ = CHR$(VAL(HexVAL$))
PUT #1, , a$
NEXT x
PUT #1, , ZeroPAD$
NEXT y
CLOSE #1
END SUB
-
7/28/2019 Programa Calculador de Rms
12/34
'This program is built from RLseries.BAS. 10-18-10
DECLARE SUB Intro ()
DECLARE SUB SetTscale ()
DECLARE SUB SetVscale ()
DECLARE SUB DrawScreen ()
DECLARE SUB DrawGrid ()
DECLARE SUB PrintVar ()
DECLARE SUB Charge () 'Plots charging function
DECLARE SUB Discharge () 'Plots discharging function
DECLARE FUNCTION CheckRange# (y#)
DECLARE FUNCTION subtract# (aaa#, bbb#)
DECLARE SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM SHARED Fault AS INTEGER 'This holds a fault code
DIM SHARED StyleHex 'This holds the alternating style pattern to create the
dotted plot.
DIM SHARED tScale AS DOUBLE 'tScale is the range of the x axis in seconds.
DIM SHARED vMax AS DOUBLE 'vMax is the max of the y axis in volts and amps.
DIM SHARED vMin AS DOUBLE 'vMin is the min of the y axis in volts and amps.
DIM SHARED GrphColor AS INTEGER 'Holds the color to be used for each plot. The color
value increments for each successive plot.
DIM SHARED CharOrDis AS STRING 'this holds whether the circuit is charging or
discharging
DIM SHARED R AS DOUBLE 'resistance in ohms
DIM SHARED L AS DOUBLE 'inductance in Henrys
DIM SHARED V AS DOUBLE 'initial voltage on the capacitor
DIM SHARED Rs AS SINGLE 'resistance in ohms used for display
DIM SHARED Ls AS SINGLE 'inductance in Henrys used for display
DIM SHARED Vs AS SINGLE 'initial voltage on the capacitor used for display
DIM SHARED Isat AS SINGLE 'This is the saturation current based on V and
R
SCREEN 12
CLS 0 'Clears everything
Intro
CLS 0 'Clears everything
'----------This initializes the variables.------------
tScale = .1
REM vMax = 15.5 not used
REM vMin = -7.5 not used
R = 2.6
L = .0063
V = 13
REM CharOrDis = "Charging" not used
GrphColor = 8 'This initializes the color for the plot. Each successive plot changes
color.
'----------------------------------------------------
DrawScreen 'Setup the graphics port and print the graph scales.
DrawGridCOLOR 7
VIEW PRINT 25 TO 30
CLS 2
PrintVar
REM command section--------------------------------------------------------------------
-----------
DO
COLOR 15
VIEW PRINT 28 TO 30
CLS 2
PRINT "Enter 1 to clear. 2 exit. 475 to generate a bitmap (BMP)."
REM PRINT "3 time scale. 4 vertical scale. 5 charge. 6 discharge. Or hit enter toplot." not used.
PRINT "3 change time scale. Or hit enter to plot."
INPUT "Or the variable name (r, l, v) to be changed."; Comand$ 'Mispelled Comand$
intentionally beause COMMAND$ is recognized by Qbasic as a "special feature"
-
7/28/2019 Programa Calculador de Rms
13/34
CLS 2
IF Comand$ = "2" THEN
SYSTEM
ELSEIF Comand$ = "1" THEN
CLS 0
DrawScreen
DrawGrid
COLOR 7
VIEW PRINT 25 TO 30
CLS 2
PrintVar
ELSEIF Comand$ = "475" THEN
'this increments a new bitmap name-number every time a bitmap is generated (up to
9999)
BMPnumber% = BMPnumber% + 1
'this makes the new bitmap name based on the new number
BMPname$ = "IGcoil" + LTRIM$(STR$(BMPnumber%))
PRINT "A bitmap of this screen called "; BMPname$; ".BMP is being generated. Please
wait. "
'the previously set VIEW and WINDOW commands have to be cleared for the sub to work.
VIEW
WINDOW
FourBIT 0, 0, 639, 479, BMPname$
'must now reinstate the VIEW and WINDOW
DrawScreen
VIEW PRINT 28 TO 30
CLS 2
LOCATE 29, 1
PRINT "Image file "; BMPname$; " is saved in the folder in which this program
resides."
INPUT "Enter to continue"; Continue
ELSEIF Comand$ = "3" THEN
VIEW PRINT 1 TO 30 'needed to expand the text port
CLS 2
SetTscale
CLS 0
DrawScreen
DrawGrid
COLOR 7
VIEW PRINT 25 TO 30
CLS 2
PrintVar
'ELSEIF Comand$ = "4" THEN
' VIEW PRINT 1 TO 30 'needed to expand the text port
' CLS 2
' SetVscale
' CLS 0
' DrawScreen
' DrawGrid
' COLOR 7' VIEW PRINT 25 TO 30
' CLS 2
' PrintVar
'ELSEIF Comand$ = "5" THEN 'set to charging
' CharOrDis = "Charging"
' COLOR 7
' VIEW PRINT 25 TO 30
' CLS 2
' PrintVar
'ELSEIF Comand$ = "6" THEN 'set to discharging
' CharOrDis = "Discharging"
' COLOR 7
' VIEW PRINT 25 TO 30' CLS 2
' PrintVar
ELSEIF Comand$ = "r" THEN
DO
-
7/28/2019 Programa Calculador de Rms
14/34
INPUT "Enter resistance of the coil primary in Ohms "; R
IF R < .001# OR R > 1000000000# THEN PRINT "Enter .001 to 1,000,000,000"
LOOP WHILE R < .001# OR R > 1000000000#
COLOR 7
VIEW PRINT 25 TO 30
CLS 2
PrintVar
ELSEIF Comand$ = "l" THEN
DO
INPUT "Enter the inductance of the coil primary in Henrys "; L
IF L < .0000000000001# OR L > 1000# THEN PRINT "Enter .0000000000001 to 1000"
LOOP WHILE L < .0000000000001# OR L > 1000#
COLOR 7
VIEW PRINT 25 TO 30
CLS 2
PrintVar
ELSEIF Comand$ = "v" THEN
DO
INPUT "Enter the applied voltage in Volts "; V
IF V < -100000000# OR V > 100000000# THEN PRINT "Enter -100,000,000 to
100,000,000"
LOOP WHILE V < -100000000# OR V > 100000000#
COLOR 7
VIEW PRINT 25 TO 30
CLS 2
PrintVar
ELSEIF Comand$ = "" THEN 'plot
'CLS 2
LINE (0, 0)-(tScale, 0) 'Redraw X axis
GrphColor = GrphColor + 1 'change plot color for new plot
IF GrphColor = 15 THEN GrphColor = 9
COLOR GrphColor
VIEW PRINT 11 TO 24
LOCATE 23
PrintVar
PRINT " "
REM IF CharOrDis = "Charging" THEN Charge not used
REM IF CharOrDis = "Discharging" THEN Discharge not used
Charge
END IF
LOOP
REM command section--------------------------------------------------------------------
-
SUB Charge '--------------------- Charge---------------------------
DIM t AS DOUBLE
DIM i AS DOUBLE
DIM vl AS DOUBLE
DIM tau AS DOUBLE
tau = L / R
REM plot i(t) (solid line)
REM t is in seconds
FOR t = 0 TO tScale STEP tScale / 600#
IF -1# * t / tau > 709 THEN Fault = 1 'EXP function
can't take an input higher than about 709
IF Fault = 1 THEN
PRINT "Combination of inputs out of Range. Cannot continue plot."
Fault = 0
EXIT SUB
END IF
i = (V / R) - (V / R) * EXP(-1# * t / tau)
i = CheckRange(i) 'Checks to see if i is far off scale. Alters it ifnecessary.
IF t = 0 THEN PSET (t, i) 'This sets the graphic cursor to the first
point.
LINE STEP(0, 0)-(t, i)
-
7/28/2019 Programa Calculador de Rms
15/34
NEXT t
'REM plot inductor v(t) dotted line
'StyleHex = &HAAAA 'This initializes the style option. Each style has every other
pixel blank. This style starts with a color pixel, 'then will alternate for each plot,
between starting with blank pixel to starting with color pixel.
'FOR t = 0 TO tScale STEP tScale / 600#
'IF -1# * t / tau > 709 THEN Fault = 1 'EXP function
can't take an input higher than about 709
'IF Fault = 1 THEN
' PRINT "Combination of inputs out of Range. Cannot continue plot."
' Fault = 0
' EXIT SUB
'END IF
'vl = V * EXP(-1# * t / tau)
'vl = CheckRange(vl) 'Checks to see if v is far off scale. Alters it if
necessary.
'IF t = 0 THEN PSET (t, vl) 'This sets the graphic cursor to the first
point.
'LINE STEP(0, 0)-(t, vl), , , StyleHex 'The commas separate the non-used optons to
designate the "style" option. The 16bit hex 'number is a pixel pattern. The style
alternates from starting with a color pixel to starting with a blank pixel so
consecutive 1-pixel 'lines will still be dotted.
'IF StyleHex = &HAAAA THEN 'This if statement flip flops the stylehex
from AAAA to 5555 and vice versa.
' StyleHex = &H5555
'ELSE
' StyleHex = &HAAAA
'END IF
'NEXT t
END SUB '---------------------------Charge----------------------------------------
FUNCTION CheckRange# (y#) '----------------------------------CheckRange-------------
'This function is to avoid the glitch in Qbasic which plots errantly ("wrapping
around") if the plotting points are very far off scale.
'This function checks the y value to be plotted and alters it if it's very far off the
scale.
'If it's over 3 times the scale, it will be set to three times the scale range. If it's
less than 3 times the scale it will not be altered.
'(The negative side only has half the range of the positive side, so 6 is the
multiplier for the negative side.)
'This is so the slope of the line will be straight up if the point is far off scale,
and the slope will have proper slope if it's not far off scale.
'This will then make the slope appear correct.
vMax = 8 'Adding these limits for the ignition coil version.
vMin = -4
IF y# > (3# * vMax) THEN
y# = 3# * vMaxELSEIF y# < (6# * vMin) THEN
y# = 6# * vMin
END IF
CheckRange# = y#
END FUNCTION '----------------------------------------CheckRange---------------
SUB Discharge '--------------------- Discharge---------------------------NOT USED
DIM t AS DOUBLE
DIM i AS DOUBLE
DIM vl AS DOUBLE
DIM tau AS DOUBLE
tau = L / R
REM plot i(t) (solid line)
REM t is in seconds
FOR t = 0 TO tScale STEP tScale / 600#
-
7/28/2019 Programa Calculador de Rms
16/34
IF -1# * t / tau > 709 THEN Fault = 1 'EXP function
can't take an input higher than about 709
IF Fault = 1 THEN
PRINT "Combination of inputs out of Range. Cannot continue plot."
Fault = 0
EXIT SUB
END IF
i = (-1# * V / R) * EXP(-1# * t / tau)
i = -1# * i 'Due to the passive
sign convention, the current will come out negative, but for convenience will be
plotted as positive.
i = CheckRange(i) 'Checks to see if i is far off scale. Alters it if
necessary.
IF t = 0 THEN PSET (t, i) 'This sets the graphic cursor to the first
point.
LINE STEP(0, 0)-(t, i)
NEXT t
REM plot inductor v(t) dotted line
StyleHex = &HAAAA 'This initializes the style option. Each style has every other
pixel blank. This style starts with a color pixel, then will alternate for each plot,
between starting with blank pixel to starting with color pixel.
FOR t = 0 TO tScale STEP tScale / 600#
IF -1# * t / tau > 709 THEN Fault = 1 'EXP function
can't take an input higher than about 709
IF Fault = 1 THEN
PRINT "Combination of inputs out of Range. Cannot continue plot."
Fault = 0
EXIT SUB
END IF
vl = V * EXP(-1# * t / tau)
vl = CheckRange(vl) 'Checks to see if i is far off scale. Alters it if
necessary.
IF t = 0 THEN PSET (t, vl) 'This sets the graphic cursor to the first
point.
LINE STEP(0, 0)-(t, vl), , , StyleHex 'The commas separate the non-used optons to
designate the "style" option. The 16bit hex number is a pixel pattern. The style
alternates from starting with a color pixel to starting with a blank pixel so
consecutive 1-pixel lines will still be dotted.
IF StyleHex = &HAAAA THEN 'This if statement flip flops the stylehex from
AAAA to 5555 and vice versa.
StyleHex = &H5555
ELSE
StyleHex = &HAAAA
END IF
NEXT t
END SUB '---------------------------discharge----------------------------------------
SUB DrawGrid '-------------DrawGrid----------------------------------------------------
--COLOR 8
'FOR y = vMax - vMax / 31 TO vMin + vMax / 31 STEP -(vMax / 15.5)
'LINE (0, y)-(tScale, y) 'draws horizontal gray lines
'NEXT y
'LINE (0, (vMax - vMin) / 368)-(tScale, (vMax - vMin) / 368) 'adds a gray line above
the zero line
'LINE (0, (vMin - vMax) / 368)-(tScale, (vMin - vMax) / 368)'adds a gray line below the
zero line
FOR y = 8 TO 0 STEP -1
LINE (0, y)-(tScale, y) 'draws horizontal gray lines
NEXT y
FOR x = 0 TO tScale + tScale / 100 STEP tScale / 100
'The x loop goes to "tScale + tScale/100" to put one extra step in the loop.
'Due to rounding errors, the last step in the loop was not being performed.
'This is because the STEP calculation was not exactly tScale /100
-
7/28/2019 Programa Calculador de Rms
17/34
'LINE (x, vMin + vMax / 31)-(x, vMax - vMax / 31) 'draws
vertical gray lines
LINE (x, 0)-(x, 8)
NEXT x
COLOR 15
'LINE (0, vMax - vMax / 31)-(0, vMin + vMax / 31) 'adds vertical
zero line in white
LINE (0, 0)-(0, 8)
LINE (0, 0)-(tScale, 0) 'adds horizontal zero line in white
FOR x = 0 TO tScale + tScale / 10 STEP tScale / 10
'One extra step is put into the loop. See notes above.
'LINE (x, vMin + vMax / 31)-(x, vMax - vMax / 31) 'draws
vertical white lines
LINE (x, 0)-(x, 8)
'LINE (x + tScale / 600, vMin + vMax / 31)-(x + tScale / 600,vMax - vMax / 31 )
'draws extra vertical white lines to thicken the vertical white lines. Not used for
now.
NEXT x
END SUB'-------------------DrawGrid----------------------------------------------------
----
SUB DrawScreen '---------------------------DrawScreen----------------------------------
-
'The graphics port is set to leave room to the left and bottom for scale indicators.
'Vertically, 0-368 gives 23 spaces, but 1/2 is wasted on top and 1/2 is wasted on
bottom to leave room for the scale numbers so the center of the number lines up with
the graph lines.
'The graph is broken into 22 useable spaces vertically with a 1/2 unused on top, and
1/2 unused on bottom for a total of 23, and the scale gets 22 numbers.
'It has to be that way in order for the vertical scale numbers to line up.
'Vertically, one line of text takes 16 vertical pixels. 368/23 = 16 .
'If more vertical space is needed at the bottom for text, the graph loses 16 pixels per
line.
REM not used VIEW (39, 0)-(639, 368) 'must be 601 by 369 (The View and
Window commands are also reinstated after bitmap generator call.)
VIEW (39, 0)-(639, 144) 'For ignition coils, must be 601 by 145.
'Graphics port scale will be 0 to "tScale" seconds by -7 to +15 amps/volts (multiplied
ordivided by some factor of 10 and called vmax and vmin).
'(15.5 and -7.5 in order to center the scale with the scale numbers)
'tScale is either .0001, .001, .01, .1, 1, 10, 100, 1000, or 10000.
REM not using WINDOW (0, vMax)-(tScale, vMin) 'vMax/248 is one pixel, vMin/120 is one
pixel.
WINDOW (0, 8.5)-(tScale, -.5) 'For ignition coils, only using 0 to 8 amps
'Show the scale numbers of the y axis as 15 to -7
'note: using "PRINT USING" command to force the formatting. Without it, extra spaces
get printed.
VIEW PRINT 1 TO 30
LOCATE 1, 1
'FOR y = vMax - vMax / 31 TO vMin + vMax / 31 STEP -(vMax / 15.5)
FOR y = 8 TO 0 STEP -1
PRINT USING "####"; y
NEXT y
'IF vMax = .0155 THEN
' PRINT USING ".###"; ABS(y)
'ELSEIF vMax = .155 THEN
' PRINT USING "#.##"; y
-
7/28/2019 Programa Calculador de Rms
18/34
'ELSEIF vMax = 1.55 THEN
' PRINT USING "#.##"; y
'ELSE
' PRINT USING "####"; y
'END IF
'NEXT y
'Print the x axis time-scale values
LOCATE 10, 1
IF tScale = .0001 THEN PRINT " 0msec .01ms .02ms .03ms .04ms .05ms .06ms
.07ms .08ms .09ms .1ms"
IF tScale = .001 THEN PRINT " 0sec .0001 .0002 .0003 .0004 .0005 .0006
.0007 .0008 .0009 .001"
IF tScale = .01 THEN PRINT " 0sec .001 .002 .003 .004 .005 .006 .007
.008 .009 .01"
IF tScale = .1 THEN PRINT " 0sec .01 .02 .03 .04 .05 .06 .07
.08 .09 .1"
IF tScale = 1 THEN PRINT " 0sec .1 .2 .3 .4 .5 .6 .7
.8 .9 1"
IF tScale = 10 THEN PRINT " 0sec 1 2 3 4 5 6 7
8 9 10"
IF tScale = 100 THEN PRINT " 0sec 10 20 30 40 50 60 70
80 90 100"
IF tScale = 1000 THEN PRINT " 0sec 100 200 300 400 500 600
700 800 900 1000"
IF tScale = 10000 THEN PRINT " 0sec 1k 2k 3k 4k 5k 6k
7k 8k 9k 10k"
END SUB'--------------------------------------DrawScreen-------------------------------
---------
'------------------------this is the screen 12 bitmap generator---------------
SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM FileCOLORS%(1 TO 48)
DIM Colors4%(15)
IF INSTR(FileNAME$, ".BMP") = 0 THEN
FileNAME$ = RTRIM$(LEFT$(FileNAME$, 8)) + ".BMP"
END IF
FOR x = x1% TO x2%
FOR y = y1% TO y2%
Colors4%(POINT(x, y)) = 1
NEXT y
NEXT x
FOR n = 0 TO 15
IF Colors4%(n) = 1 THEN SigCOLORS& = SigCOLORS& + 1
NEXT n
FileTYPE$ = "BM"
Reserved1% = 0
Reserved2% = 0OffsetBITS& = 118
InfoHEADER& = 40
PictureWIDTH& = x2% - x1% + 1
PictureDEPTH& = y2% - y1% + 1
NumPLANES% = 1
BPP% = 4
Compression& = 0
WidthPELS& = 3780
DepthPELS& = 3780
NumCOLORS& = 16
IF PictureWIDTH& MOD 8 0 THEN
ZeroPAD$ = SPACE$((8 - PictureWIDTH& MOD 8) \ 2)END IF
ImageSIZE& = (((ImageWIDTH& + LEN(ZeroPAD$)) * ImageDEPTH&) + .1) / 2
FileSIZE& = ImageSIZE& + OffsetBITS&
-
7/28/2019 Programa Calculador de Rms
19/34
Colr = 0
FOR n = 1 TO 48 STEP 3
OUT &H3C7, Colr
FileCOLORS%(n) = INP(&H3C9)
FileCOLORS%(n + 1) = INP(&H3C9)
FileCOLORS%(n + 2) = INP(&H3C9)
Colr = Colr + 1
NEXT n
OPEN FileNAME$ FOR BINARY AS #1
PUT #1, , FileTYPE$
PUT #1, , FileSIZE&
PUT #1, , Reserved1% 'should be zero
PUT #1, , Reserved2% 'should be zero
PUT #1, , OffsetBITS&
PUT #1, , InfoHEADER&
PUT #1, , PictureWIDTH&
PUT #1, , PictureDEPTH&
PUT #1, , NumPLANES%
PUT #1, , BPP%
PUT #1, , Compression&
PUT #1, , ImageSIZE&
PUT #1, , WidthPELS&
PUT #1, , DepthPELS&
PUT #1, , NumCOLORS&
PUT #1, , SigCOLORS&
u$ = " "
FOR n% = 1 TO 46 STEP 3
Colr$ = CHR$(FileCOLORS%(n% + 2) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n% + 1) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n%) * 4)
PUT #1, , Colr$
PUT #1, , u$ 'Unused byte
NEXT n%
FOR y = y2% TO y1% STEP -1
FOR x = x1% TO x2% STEP 2
HiX = POINT(x, y)
LoX = POINT(x + 1, y)
HiNIBBLE$ = HEX$(HiX)
LoNIBBLE$ = HEX$(LoX)
HexVAL$ = "&H" + HiNIBBLE$ + LoNIBBLE$
a$ = CHR$(VAL(HexVAL$))
PUT #1, , a$
NEXT xPUT #1, , ZeroPAD$
NEXT y
CLOSE #1
END SUB
SUB Intro '----------------------Intro--------------------------------
'PRINT "This program analyzes a resistor-inductor series circuit."
'PRINT "It can analyze the charging of the RL circuit in series with a voltage"
'PRINT "source, or analyze the discharging of the RL circuit without any sources"
'PRINT "connected."
'PRINT "Given R, L, and V, the program plots the current as a function of time,"'PRINT "and the inductor's voltage as a function of time."
PRINT "This program plots the primary current of an idealized ignition coil."
PRINT "The resistance, inductance, and applied voltage are the input values."
-
7/28/2019 Programa Calculador de Rms
20/34
PRINT "Resistance is in ohms, inductance is in Henrys, voltage in volts."
PRINT "The current is plotted as a thin, solid line."
'PRINT "The inductor voltage is plotted as a dotted line."
PRINT "The X axis is time in seconds."
'PRINT "The Y axis is both current in amps and voltage in Volts."
PRINT "The Y axis is current in amps."
PRINT " Note: there is only some checking of out-of-range variables, so overflow"
PRINT "errors may result if input values are not selected carefully."
PRINT "Printing: This progam can generate a bitmap file of the screen. The files"
PRINT "will be saved in the folder in which this program resides. If it will be "
PRINT "printed out, it is recommended the file be opened in MSPaint and edited."
PRINT "If converting to black and white, first save as 256 color or 24bit BMP then "
PRINT "invert colors and convert to black and white. It's all done in MSPaint."
INPUT "Enter to continue"; Continue
END SUB'----------------------Intro----------------------------------
SUB PrintVar '---------------------------PrintVar---------------
'CLS 2
'PRINT "The line plot is current. The dotted plot is inductor voltage."
'-------reprint input values in same color-----------
'to print neatly, they should be converted to single length.
Rs = R
Ls = L
Vs = V
Isat = Vs / Rs
PRINT "R"; Rs; "ohms, L"; Ls; "henrys, V"; Vs; "volts, Isat"; Isat; "amps."
'PRINT "R"; Rs; "ohms L"; Ls; "henrys V"; Vs; "volts " ;
'IF CharOrDis = "Charging" THEN PRINT " Charging."
'IF CharOrDis = "Discharging" THEN PRINT " Discharging."
END SUB '--------------------------------PrintVar----------------
SUB SetTscale '----------------------------SetTscale-------------------------------
PRINT " Nine different time scales can be chosen from."
PRINT "0 to .0001 sec."
PRINT "0 to .001 sec."
PRINT "0 to .01 sec."
PRINT "0 to .1 sec."
PRINT "0 to 1 sec."
PRINT "0 to 10 sec."
PRINT "0 to 100 sec."
PRINT "0 to 1000 sec."
PRINT "0 to 10,000 sec."
DO
INPUT "Enter the number of seconds for the x axis (default is .1)"; tScale
LOOP WHILE tScale < 0IF tScale = 0 THEN
tScale = .1 'default case
ELSEIF tScale < .00011 THEN tScale = .0001
ELSEIF tScale < .0011 THEN tScale = .001
ELSEIF tScale < .011 THEN tScale = .01
ELSEIF tScale < .11 THEN tScale = .1
ELSEIF tScale < 1.1 THEN tScale = 1
ELSEIF tScale < 11 THEN tScale = 10
ELSEIF tScale < 110 THEN tScale = 100
ELSEIF tScale < 1100 THEN tScale = 1000
ELSE tScale = 10000
END IF
END SUB'----------------------------SetTscale-------------------------------
SUB SetVscale '----------------------------SetVscale-----------NOT USED----------------
----
PRINT " Five different vertical scales can be chosen from."
-
7/28/2019 Programa Calculador de Rms
21/34
PRINT "-.007 to +.015 volts and amps."
PRINT "-.07 to +.15 volts and amps."
PRINT "-.7 to +1.5 volts and amps."
PRINT "-7 to +15 volts and amps."
PRINT "-70 to +150 volts and amps."
DO
INPUT "Enter the max number for the y axis (default is 15)"; vMax
LOOP WHILE vMax < 0
IF vMax = 0 THEN
vMax = 15.5 'default casefx
vMin = -7.5 'default case
ELSEIF vMax < .016 THEN
vMax = .0155
vMin = -.00750001# 'Scale has to be fudged a little to get the full scale to
show since it is not an integer in this case.
ELSEIF vMax < .16 THEN
vMax = .155
vMin = -.0750001 'Scale has to be fudged a little to get the full scale to
show since it is not an integer in this case.
ELSEIF vMax < 1.6 THEN
vMax = 1.55
vMin = -.750001 'Scale has to be fudged a little to get the full scale to
show since it is not an integer in this case.
ELSEIF vMax < 16 THEN
vMax = 15.5
vMin = -7.5
ELSE
vMax = 155
vMin = -75
END IF
END SUB'--------------------------------SetVscale--------------------------------
FUNCTION subtract# (aaa#, bbb#) '---------------Subtraction function--------------
' The purpose of this function is to avoid loss-of-significance errors.
' subtract# = aaa# - bbb#
' But, if both aaa and bbb are positive or both negative, then loss-of-sig is possible.
' In that case, check the ratio of aaa to bbb, and bbb to aaa. (Use different ratio for
Double and Single precision math.)
' If too close, then loss of sig is going to happen.
' In that case, subtract# = 0.
subtract# = aaa# - bbb#
IF (aaa# > 0# AND bbb# > 0#) OR (aaa# < 0# AND bbb# < 0#) THEN
IF ((aaa# / bbb#) < 1.0000000000001# AND (aaa# / bbb#) > 1#) OR ((bbb# / aaa#) 1#) THEN
subtract# = 0
END IF
END IF
END FUNCTION'----------------------------------Subtraction function--------------
-
7/28/2019 Programa Calculador de Rms
22/34
SCREEN 12
SCREEN 0
PRINT "This program compares carburetor needle profiles for an '81 GPZ 550."
PRINT "One is a stock (stok) needle (brass) with one clip position."
PRINT "The second (kaw2) is same as stock but has 5 clip positions."
PRINT "2nd position from the top makes it the same as the stock needle."
PRINT "The third is a Dynojet (dyno) needle (stainless steel) with 6"
PRINT "clip positions. ";
PRINT "3rd position from the top is the Dynojet recommended position."
PRINT "Each clip position moves the needle by 1 mm."
PRINT " "
PRINT "Reading the output:"
PRINT "The numbers marked (x), on the left, represent ";
PRINT "the distance (in mm) from the bottom of the clip at which the diameter ";
PRINT "was measured."
PRINT "The middle numbers are the needle's diameter (at the position x from ";
PRINT "the clip) in inches."
PRINT "The numbers on the right are differences in ";
PRINT "diameters in inches (at distance x from the clip) between the two clips. "
PRINT "The final column on the right tells which needle is richer (at position x, ";
PRINT "based on the specified clip positions and measured diameters)."
PRINT " "
INPUT "(enter 4 to print the above)"; p
IF p = 4 THEN
LPRINT "This program compares carburetor needle profiles for an '81 GPZ 550."
LPRINT " "
LPRINT "One is a stock (stok) needle (brass) with one clip position."
LPRINT " "
LPRINT "The second (kaw2) is same as stock but has 5 clip positions."
LPRINT "2nd position from the top makes it the same as the stock needle."
LPRINT " "
LPRINT "The third is a Dynojet (dyno) needle (stainless steel) with 6"
LPRINT "clip positions. ";
LPRINT "3rd position from the top is the Dynojet recommended position."
LPRINT " "
LPRINT "Each clip position moves the needle by 1 mm."
LPRINT " "
LPRINT " "
LPRINT "Reading the output:"
LPRINT "The numbers marked (x), on the left, represent ";
LPRINT "the distance (in mm) from the bottom of the clip at which the diameter ";
LPRINT "was measured."
LPRINT "The middle numbers are the needle's diameter (at the position x from ";LPRINT "the clip) in inches."
LPRINT "The numbers on the right are differences in ";
LPRINT "diameters in inches (at distance x from the clip) between the two clips. "
LPRINT "The final column on the right tells which needle is richer (at position x, ";
LPRINT "based on the specified clip positions and measured diameters)."
LPRINT ""
LPRINT ""
END IF
CLS
INPUT "Enter 5 to print the results to the printer."; p
CLS
-
7/28/2019 Programa Calculador de Rms
23/34
DIM stok(-2 TO 60) AS SINGLE
DIM kaw2(-2 TO 60) AS SINGLE
DIM dyno(-2 TO 60) AS SINGLE
10
INPUT "Enter clip position for Kaw2 needle (1 to 5 counted from top)"; clipk
IF clipk < 1 OR clipk > 5 THEN
PRINT "Must be 1 to 5"
GOTO 10
END IF
clipk = clipk - 2
20
INPUT "Enter clip position for Dyno needle (1 to 6 counted from top)"; clipd
IF clipd < 1 OR clipd > 6 THEN
PRINT "Must be 1 to 6"
GOTO 20
END IF
clipd = clipd - 3
'initializes stok and kaw2 arrays
FOR x = -2 TO 60
IF x < 21 THEN
stok(x) = .1
kaw2(x) = .1
GOTO 99
END IF
IF x < 25 THEN
stok(x) = .1 - ((.002 / 4) * (x - 20))
kaw2(x) = .1 - ((.002 / 4) * (x - 20))
GOTO 99
END IF
IF x < 44 THEN
stok(x) = .1 - .002 - ((.038 / 19.3) * (x - 24))
kaw2(x) = .1 - .002 - ((.038 / 19.3) * (x - 24))
GOTO 99
END IF
stok(x) = 0
kaw2(x) = 0
99 NEXT x
'initializes dyno array
FOR x = -2 TO 60
IF x < 22 THEN
dyno(x) = .1
GOTO 199
END IF
IF x < 51 THEN
dyno(x) = .1 - ((.05 / 29.5) * (x - 21.5))
GOTO 199
END IF
dyno(x) = 0
199 NEXT x
-
7/28/2019 Programa Calculador de Rms
24/34
'rounds off the values
FOR x = -2 TO 60
stok(x) = (CINT(stok(x) * 10000)) / 10000
kaw2(x) = (CINT(kaw2(x) * 10000)) / 10000
dyno(x) = (CINT(dyno(x) * 10000)) / 10000
NEXT x
'prints results
PRINT "Stock versus Kawasaki2 at clip position"; clipk + 2
IF p = 5 THEN LPRINT "Stock versus Kawasaki2 at clip position"; clipk + 2
FOR x = 0 TO 55
diff = (CINT((stok(x) - kaw2(x + clipk)) * 10000)) / 10000
PRINT "x="; x; " Stock="; stok(x); " Kaw2="; kaw2(x + clipk); " Stk-K2="; diff;
IF diff > 0 THEN PRINT " K2 richer"
IF diff < 0 THEN PRINT " Stk richer"
IF diff = 0 THEN PRINT " same"
IF p = 5 THEN GOTO 100
FOR t = 1 TO 24000
NEXT t
100
IF p = 5 THEN
LPRINT "x="; x; " Stock="; stok(x); " Kaw2="; kaw2(x + clipk); " Stk-K2="; diff;
IF diff > 0 THEN LPRINT " K2 richer"
IF diff < 0 THEN LPRINT " Stk richer"
IF diff = 0 THEN LPRINT " same"
END IF
NEXT x
PRINT " "
IF p = 5 THEN LPRINT " "
PRINT "Stock versus Dynojet at clip position"; clipd + 3
IF p = 5 THEN LPRINT "Stock versus Dynojet at clip position"; clipd + 3
FOR x = 0 TO 55
diff = (CINT((stok(x) - dyno(x + clipd)) * 10000)) / 10000
PRINT "x="; x; " Stock="; stok(x); " Dyno="; dyno(x + clipd); " Stk-Dy="; diff;
IF diff > 0 THEN PRINT " Dy richer"
IF diff < 0 THEN PRINT " Stk richer"IF diff = 0 THEN PRINT " same"
IF p = 5 THEN GOTO 200
FOR t = 1 TO 24000
NEXT t
200
IF p = 5 THEN
LPRINT "x="; x; " Stock="; stok(x); " Dyno="; dyno(x + clipd); " Stk-Dy="; diff;
IF diff > 0 THEN LPRINT " Dy richer"
IF diff < 0 THEN LPRINT " Stk richer"
IF diff = 0 THEN LPRINT " same"
END IFNEXT x
PRINT " "
IF p = 5 THEN LPRINT " "
-
7/28/2019 Programa Calculador de Rms
25/34
PRINT "Dynojet at clip pos"; clipd + 3; " versus Kawasaki2 at clip pos"; clipk + 2
IF p = 5 THEN LPRINT "Dynojet at clip pos"; clipd + 3; " versus Kawasaki2 at clip pos";
clipk + 2
FOR x = 0 TO 55
diff = (CINT((dyno(x + clipd) - kaw2(x + clipk)) * 10000)) / 10000
PRINT "x="; x; " Dyno="; dyno(x + clipd); " Kaw2="; kaw2(x + clipk); " Dy-K2=";
diff;
IF diff > 0 THEN PRINT " K2 richer"
IF diff < 0 THEN PRINT " Dy richer"
IF diff = 0 THEN PRINT " same"
IF p = 5 THEN GOTO 300
FOR t = 1 TO 24000
NEXT t
300
IF p = 5 THEN
LPRINT "x="; x; " Dyno="; dyno(x + clipd); " Kaw2="; kaw2(x + clipk); " Dy-K2=";
diff;
IF diff > 0 THEN LPRINT " K2 richer"
IF diff < 0 THEN LPRINT " Dy richer"
IF diff = 0 THEN LPRINT " same"
END IF
NEXT x
PRINT " "
PRINT " "
PRINT " "
IF p = 5 THEN
LPRINT " "
LPRINT " "
LPRINT " "
END IF
INPUT "hit enter to run again"; a
RUN
-
7/28/2019 Programa Calculador de Rms
26/34
SCREEN 12
PRINT "This program creates a chart of dwell time as a function of dwell angle and
RPM."
PRINT ""
PRINT "This is best viewed on a printout."
PRINT "If you have a printer, enter P to print."
INPUT "If you do not have a printer, hit enter."; Cont$
IF Cont$ = "P" GOTO 2
IF Cont$ = "p" GOTO 2
GOTO 3
2
LPRINT " DWELL TIME"
LPRINT ""
LPRINT "This is Dwell time as a function of RPM and Dwell Angle."
LPRINT "Dwell time in msec. Dwell angle in crank degrees."
LPRINT "Dwell time = (Dwell Angle / RPM) * 166.6667 "
LPRINT "This is for one coil fired from the crank one time per revolution."
LPRINT ""
LPRINT "Left side is Dwell Angle. Top is RPM. Chart is Dwell time in msec. "
LPRINT ""
LPRINT "To get the Dwell Time for 4000 RPM, divide the dwell time for 400"
LPRINT "by 10."
LPRINT ""
LPRINT ""
LPRINT " RPM"
LPRINT " 100 200 300 400 500 600 700 800 900 1000"
LPRINT "--------|------|-----|-----|-----|-----|-----|-----|-----|-----|------"
FOR angle = 0 TO 360 STEP 10
LPRINT USING "###"; angle;
LPRINT " deg : ";
FOR rpm = 100 TO 1000 STEP 100
time = 166.6667 * angle / rpm
time = time * 10
time = CINT(time)
time = time / 10
LPRINT USING "###.#"; time;
LPRINT " ";
NEXT rpm
LPRINT ""NEXT angle
3
CLS
PRINT "To pause the screen: press CTRL & Break."
PRINT "Then hit F4 to view the output screen."
PRINT ""
INPUT "hit enter to continue"; zz
CLS
PRINT " DWELL TIME"
PRINT ""
PRINT "This is Dwell time as a function of RPM and Dwell Angle."PRINT "Dwell time in msec. Dwell angle in crank degrees."
PRINT "Dwell time = (Dwell Angle / RPM) * 166.6667 "
PRINT "This is for one coil fired from the crank one time per revolution."
PRINT ""
-
7/28/2019 Programa Calculador de Rms
27/34
PRINT "Left side is Dwell Angle. Top is RPM. Chart is Dwell time in msec. "
PRINT ""
PRINT "To get the Dwell Time for 4000 RPM, divide the dwell time for 400"
PRINT "by 10."
PRINT ""
PRINT ""
PRINT " RPM"
PRINT " 100 200 300 400 500 600 700 800 900 1000"
PRINT "--------|------|-----|-----|-----|-----|-----|-----|-----|-----|------"
FOR angle = 0 TO 360 STEP 10
FOR timedelay = 1 TO 70000
NEXT timedelay
PRINT USING "###"; angle;
PRINT " deg : ";
FOR rpm = 100 TO 1000 STEP 100
time = 166.6667 * angle / rpm
time = time * 10
time = CINT(time)
time = time / 10
PRINT USING "###.#"; time;
PRINT " ";
NEXT rpm
PRINT ""
NEXT angle
-
7/28/2019 Programa Calculador de Rms
28/34
PROGRAMA GENERADOR MEDIO
DECLARE SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM SHARED deg AS DOUBLE
DIM SHARED rad AS DOUBLE
DIM SHARED x1 AS DOUBLE
DIM SHARED y1 AS DOUBLE
DIM SHARED xx1 AS INTEGER
DIM SHARED yy1 AS INTEGER
DIM SHARED x2 AS DOUBLEDIM SHARED y2 AS DOUBLE
DIM SHARED xx2 AS INTEGER
DIM SHARED yy2 AS INTEGER
DIM SHARED dash AS INTEGER
CONST pi = 3.1415927#
'This is a degree wheel bitmap generator. Written by Lou Dudzik 12/2009.
'Screen 12 cannot set background color. Re-save as 24bit bitmap in paint, then invert
colors.
' this sets up the screen with graphics viewport and text area
CLS 'Clear screen.SCREEN 12 'Screen 12 is 640 by 480 pxl.
PRINT "This will save the image as a bitmap. It will be saved in the
PRINT "same folder this program resides in. Open it in paint and save"
PRINT "as a 24-bit bitmap. Then invert the colors. After that, copy and "
PRINT "paste as necessary to complete the wheel."
INPUT ""; g
CLS
VIEW (0, 0)-(479, 479)
WINDOW (0, 0)-(479, 479) 'x Scale will be 0 to +479. This way pxl location is
rounded off using CINT. Then a pxl is plotted with an exact pxl location, instead of
relying on the LINE function to round off pixl location.
LINE (0, 0)-(0, 479) 'vertical axisLINE (0, 0)-(479, 0) 'horizontal axis
LINE (350, 350)-(479, 479) 'diag upper right
FOR dash = 50 TO 350 STEP 50
LINE (dash, -5)-(dash, 5) 'draws hash marks on the axes.
LINE (-5, dash)-(5, dash)
NEXT dash
FOR deg = 0 TO 45 'only drawing 1/8 of the wheel. Use paint to copy and
past to complete the wheel. This way it will have symmetry in every way.
rad = deg * (pi / 180#) 'converts degrees to radians
IF CINT(deg / 45) = deg / 45 THEN 'plot the 45 degree increments
x1 = 350# * COS(rad) 'this determines the x position of the start point ofthe degree mark.
y1 = 350# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
x2 = 475# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 475# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
ELSEIF CINT(deg / 10) = deg / 10 THEN 'plot the 10 degree incrementsx1 = 100# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 100# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
-
7/28/2019 Programa Calculador de Rms
29/34
x2 = 479# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 479# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
ELSEIF CINT(deg / 5) = deg / 5 THEN 'plot the 5-degree increments
x1 = 440# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 440# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
x2 = 475# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 475# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
ELSE 'plot the 1-degree increments
x1 = 450# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 450# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
x2 = 470# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 470# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
END IF
NEXT deg
'END 'this is used for troubleshooting. it stops before the bitmap
is saved.
VIEW 'needed before saving the bitmap
WINDOW 'needed before saving the bitmap
FourBIT 0, 0, 639, 479, "DegWhlSml" 'this is the line to call the screen 12 bitmap
generator
'important to note, before the call, if a WINDOW or VIEW command was set, they should
be cancelled before calling the sub.
'This is done by a simple WINDOW and/or VIEW statement with no arguments.'They must be reinstated after returning from the sub if further screen printing will
be done.
SYSTEM
'------------------------this is the screen 12 bitmap generator---------------
SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM FileCOLORS%(1 TO 48)
DIM Colors4%(15)
IF INSTR(FileNAME$, ".BMP") = 0 THEN
FileNAME$ = RTRIM$(LEFT$(FileNAME$, 8)) + ".BMP"
END IF
FOR x = x1% TO x2%
FOR y = y1% TO y2%
Colors4%(POINT(x, y)) = 1
-
7/28/2019 Programa Calculador de Rms
30/34
NEXT y
NEXT x
FOR n = 0 TO 15
IF Colors4%(n) = 1 THEN SigCOLORS& = SigCOLORS& + 1
NEXT n
FileTYPE$ = "BM"
Reserved1% = 0
Reserved2% = 0
OffsetBITS& = 118
InfoHEADER& = 40
PictureWIDTH& = x2% - x1% + 1
PictureDEPTH& = y2% - y1% + 1
NumPLANES% = 1
BPP% = 4
Compression& = 0
WidthPELS& = 3780
DepthPELS& = 3780
NumCOLORS& = 16
IF PictureWIDTH& MOD 8 0 THEN
ZeroPAD$ = SPACE$((8 - PictureWIDTH& MOD 8) \ 2)
END IF
ImageSIZE& = (((ImageWIDTH& + LEN(ZeroPAD$)) * ImageDEPTH&) + .1) / 2
FileSIZE& = ImageSIZE& + OffsetBITS&
Colr = 0
FOR n = 1 TO 48 STEP 3
OUT &H3C7, Colr
FileCOLORS%(n) = INP(&H3C9)
FileCOLORS%(n + 1) = INP(&H3C9)
FileCOLORS%(n + 2) = INP(&H3C9)
Colr = Colr + 1
NEXT n
OPEN FileNAME$ FOR BINARY AS #1
PUT #1, , FileTYPE$
PUT #1, , FileSIZE&
PUT #1, , Reserved1% 'should be zero
PUT #1, , Reserved2% 'should be zero
PUT #1, , OffsetBITS&
PUT #1, , InfoHEADER&
PUT #1, , PictureWIDTH&
PUT #1, , PictureDEPTH&
PUT #1, , NumPLANES%
PUT #1, , BPP%
PUT #1, , Compression&
PUT #1, , ImageSIZE&PUT #1, , WidthPELS&
PUT #1, , DepthPELS&
PUT #1, , NumCOLORS&
PUT #1, , SigCOLORS&
u$ = " "
FOR n% = 1 TO 46 STEP 3
Colr$ = CHR$(FileCOLORS%(n% + 2) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n% + 1) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n%) * 4)
PUT #1, , Colr$PUT #1, , u$ 'Unused byte
NEXT n%
FOR y = y2% TO y1% STEP -1
-
7/28/2019 Programa Calculador de Rms
31/34
FOR x = x1% TO x2% STEP 2
HiX = POINT(x, y)
LoX = POINT(x + 1, y)
HiNIBBLE$ = HEX$(HiX)
LoNIBBLE$ = HEX$(LoX)
HexVAL$ = "&H" + HiNIBBLE$ + LoNIBBLE$
a$ = CHR$(VAL(HexVAL$))
PUT #1, , a$
NEXT x
PUT #1, , ZeroPAD$
NEXT y
CLOSE #1
END SUB '-------------------------Four Bit----------------
PROGRAMA GENERADOR PEQUEO
DECLARE SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM SHARED deg AS DOUBLEDIM SHARED rad AS DOUBLE
DIM SHARED x1 AS DOUBLE
DIM SHARED y1 AS DOUBLE
DIM SHARED xx1 AS INTEGER
DIM SHARED yy1 AS INTEGER
DIM SHARED x2 AS DOUBLE
DIM SHARED y2 AS DOUBLE
DIM SHARED xx2 AS INTEGER
DIM SHARED yy2 AS INTEGER
DIM SHARED dash AS INTEGER
CONST pi = 3.1415927#
'This is a degree wheel bitmap generator. Written by Lou Dudzik 12/2009.
'Screen 12 cannot set background color. Re-save as 24bit bitmap in paint, then invert
colors.
' this sets up the screen with graphics viewport and text area
CLS 'Clear screen.
SCREEN 12 'Screen 12 is 640 by 480 pxl.
PRINT "This will save the image as a bitmap. It will be saved in the
PRINT "same folder this program resides in. Open it in paint and save"
PRINT "as a 24-bit bitmap. Then invert the colors. After that, copy and "
PRINT "paste as necessary to complete the wheel."
INPUT ""; g
CLS
VIEW (0, 0)-(478, 478) 'Making the graphics veiwport square. In order to put a
zero point in the middle, need an odd number of pixels. Instead of 480 pxls, using 479
pxls. Therefore 0 to 478.
WINDOW (-239, -239)-(239, 239) 'Scale will be -239 to +239. This way pxl location is
rounded off using CINT. Then a pxl is plotted with an exact pxl location, instead of
relying on the LINE function to round off pixl location.
LINE (0, -239)-(0, 239) 'vertical axis
LINE (-239, 0)-(239, 0) 'horizontal axis
LINE (-180, -180)-(-239, -239) 'diag lower left
LINE (-180, 180)-(-239, 239) 'diag upper left
LINE (180, -180)-(239, -239) 'diag lower right
LINE (180, 180)-(239, 239) 'diag upper right
FOR dash = 25 TO 175 STEP 25
LINE (dash, -3)-(dash, 3) 'draws hash marks on the axes.
LINE (-3, dash)-(3, dash)
NEXT dash
-
7/28/2019 Programa Calculador de Rms
32/34
FOR deg = 0 TO 45 'only drawing 1/8 of the wheel. Use paint to copy and
past to complete the wheel. This way it will have symmetry in every way.
rad = deg * (pi / 180#) 'converts degrees to radians
IF CINT(deg / 45) = deg / 45 THEN 'plot the 45 degree increments
x1 = 190# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 190# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
x2 = 237# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 237# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
ELSEIF CINT(deg / 10) = deg / 10 THEN 'plot the 10 degree increments
x1 = 50# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 50# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
x2 = 239# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 239# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
ELSEIF CINT(deg / 5) = deg / 5 THEN 'plot the 5-degree increments
x1 = 219# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 219# * SIN(rad) 'this determines the y position of the start point of
the degree mark.
x2 = 237# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 237# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
ELSE 'plot the 1-degree increments
x1 = 225# * COS(rad) 'this determines the x position of the start point of
the degree mark.
y1 = 225# * SIN(rad) 'this determines the y position of the start point ofthe degree mark.
x2 = 235# * COS(rad) 'this determines the x position of the finish point
of the degree mark.
y2 = 235# * SIN(rad) 'this determines the y position of the finish point
of the degree mark.
xx1 = CINT(x1) 'rounds to the nearest pxl
yy1 = CINT(y1) 'rounds to the nearest pxl
xx2 = CINT(x2) 'rounds to the nearest pxl
yy2 = CINT(y2) 'rounds to the nearest pxl
LINE (xx1, yy1)-(xx2, yy2)
END IF
NEXT deg'END 'this is used for troubleshooting. it stops before the bitmap
is saved.
VIEW 'needed before saving the bitmap
-
7/28/2019 Programa Calculador de Rms
33/34
WINDOW 'needed before saving the bitmap
FourBIT 0, 0, 639, 479, "DegWhlSml" 'this is the line to call the screen 12 bitmap
generator
'important to note, before the call, if a WINDOW or VIEW command was set, they should
be cancelled before calling the sub.
'This is done by a simple WINDOW and/or VIEW statement with no arguments.
'They must be reinstated after returning from the sub if further screen printing will
be done.
SYSTEM
'------------------------this is the screen 12 bitmap generator---------------
SUB FourBIT (x1%, y1%, x2%, y2%, FileNAME$)
DIM FileCOLORS%(1 TO 48)
DIM Colors4%(15)
IF INSTR(FileNAME$, ".BMP") = 0 THEN
FileNAME$ = RTRIM$(LEFT$(FileNAME$, 8)) + ".BMP"
END IF
FOR x = x1% TO x2%
FOR y = y1% TO y2%
Colors4%(POINT(x, y)) = 1
NEXT y
NEXT x
FOR n = 0 TO 15
IF Colors4%(n) = 1 THEN SigCOLORS& = SigCOLORS& + 1
NEXT n
FileTYPE$ = "BM"
Reserved1% = 0
Reserved2% = 0
OffsetBITS& = 118
InfoHEADER& = 40
PictureWIDTH& = x2% - x1% + 1
PictureDEPTH& = y2% - y1% + 1
NumPLANES% = 1
BPP% = 4
Compression& = 0
WidthPELS& = 3780
DepthPELS& = 3780
NumCOLORS& = 16
IF PictureWIDTH& MOD 8 0 THEN
ZeroPAD$ = SPACE$((8 - PictureWIDTH& MOD 8) \ 2)
END IF
ImageSIZE& = (((ImageWIDTH& + LEN(ZeroPAD$)) * ImageDEPTH&) + .1) / 2
FileSIZE& = ImageSIZE& + OffsetBITS&
Colr = 0
FOR n = 1 TO 48 STEP 3
OUT &H3C7, Colr
FileCOLORS%(n) = INP(&H3C9)
FileCOLORS%(n + 1) = INP(&H3C9)
FileCOLORS%(n + 2) = INP(&H3C9)
Colr = Colr + 1
NEXT n
OPEN FileNAME$ FOR BINARY AS #1
PUT #1, , FileTYPE$
PUT #1, , FileSIZE&PUT #1, , Reserved1% 'should be zero
PUT #1, , Reserved2% 'should be zero
PUT #1, , OffsetBITS&
PUT #1, , InfoHEADER&
-
7/28/2019 Programa Calculador de Rms
34/34
PUT #1, , PictureWIDTH&
PUT #1, , PictureDEPTH&
PUT #1, , NumPLANES%
PUT #1, , BPP%
PUT #1, , Compression&
PUT #1, , ImageSIZE&
PUT #1, , WidthPELS&
PUT #1, , DepthPELS&
PUT #1, , NumCOLORS&
PUT #1, , SigCOLORS&
u$ = " "
FOR n% = 1 TO 46 STEP 3
Colr$ = CHR$(FileCOLORS%(n% + 2) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n% + 1) * 4)
PUT #1, , Colr$
Colr$ = CHR$(FileCOLORS%(n%) * 4)
PUT #1, , Colr$
PUT #1, , u$ 'Unused byte
NEXT n%
FOR y = y2% TO y1% STEP -1
FOR x = x1% TO x2% STEP 2
HiX = POINT(x, y)
LoX = POINT(x + 1, y)
HiNIBBLE$ = HEX$(HiX)
LoNIBBLE$ = HEX$(LoX)
HexVAL$ = "&H" + HiNIBBLE$ + LoNIBBLE$
a$ = CHR$(VAL(HexVAL$))
PUT #1, , a$
NEXT x
PUT #1, , ZeroPAD$
NEXT y
CLOSE #1
END SUB '-------------------------Four Bit----------------