Astable 555 timer calculator.
Ďalší z pomocných programčekov pre astabilný generátor s čipom 555. Použiť obvod 555 ako generátor pulzov je dodnes vec veľmi obľúbená a často používaná. Program som upravil pre SBC6502 (program samozrejme bez najmenších problémov funguje aj na UK101) a pridal som aj grafické znázornenie vlastného obvodového zapojenia 555. Boli prevedené niektoré zmeny v programe /napríklad v SBC6502 nemám k dispozícii prikaz IF THEN ELSE/, ale to sa dalo vyriešiť. Takže som to celé upravil a prekopal k obrazu svojmu. V zapojení (oproti pôvodnému) pribudli ďalšie dva kondenzátory C2 a C3, ich pripojenie síce nie je nevyhnutné, ale výrazne zlepšujú činnosť vlastného zapojenia, je to potom na výstupe stabilnejšie.
Program poskytuje dve možnosti výpočtu, samostatné zobrazenie zapojenia a ukončenie programu:
1.- zadáme hodnoty súčiastok R1, R2, C1 a program vypočíta frekvenciu a plnenie duty cycle
/dokáže zobraziť zapojenie s už vyrátanými hodnotami súčiastok/
2.- zadáme frekvenciu, duty cycle a hodnotu R2 a program spočíta potrebné hodnoty súčiastok
/dokáže zobraziť zapojenie s už vyrátanými hodnotami súčiastok/
3.- zobrazenie vlastnej schémy /tu nie sú k dispozícii hodnoty súčiastok/
4.- ukončenie programu
Listing programu:
100 REM --- 80column´s Hyperterminal ---
110 GOSUB 690:POKE 15,80:CLEAR:GOSUB 650
120 PRINT " * Astable 555 TIMER CALCULATION PROGRAM *"
130 PRINT " * original idea by James E. Tarchinski PE/1989/03 *"
140 PRINT " * modify program (+ circuit) by SBC6502 - Igi 14/09/2022 *"
150 GOSUB 650:PRINT
160 REM --- MENU ---
170 PRINT:PRINT " Would you like to:":G=0:C2=0:C3=0
180 PRINT " (1) - Calculate circuit data from component values"
190 PRINT " (2) - Calculate component values from circuit data"
200 PRINT " (3) - View to circuit
210 PRINT " (4) - Exit the program":PRINT
220 INPUT " Your choice:";Q
230 IF Q=1 THEN PRINT:GOTO 280
240 IF Q=2 THEN 440
250 IF Q=3 THEN GOSUB 690:GOSUB 700:GOTO 160
260 IF Q=4 THEN END
270 GOTO 160
280 PRINT SPC(8)"*************** CALCULATE CIRCUIT DATA ***************"
290 GOSUB 670:G=1:C2=10:C3=100
300 PRINT " (NOTE: R1 should be greater than 1000 ohms)"
310 P$=" R1 (ohms): ":GOSUB 610:R1=V
320 IF R1<1000 THEN GOTO 300
330 P$=" R2 (ohms): ":GOSUB 610: R2=V
340 P$=" C1 (uF) : ":GOSUB 610: C1=V/1000000:PRINT
350 IF R1*R2*C1=0 THEN PRINT "ERROR: Illegal value(s).":GOTO 160
360 TH=.693*C1*(R1+R2): PRINT"High time = ";TH;"seconds"
370 TL=.693*C1*R2: PRINT "Low time = ";TL;"seconds"
380 DC=100*(TH/(TH+TL)):PRINT "Duty cycle = ";DC;"%"
390 PERIOD=TH+TL:PRINT"Period = ";PERIOD;"seconds"
400 F=1/PERIOD: PRINT "Frequency = ";F;"Hz"
410 GOSUB 910
420 IF Q$="N" THEN 160
430 IF Q$="Y" THEN GOSUB 700:GOTO 160
440 REM --- CALCULATE COMPONENT VALUES ---
450 GOSUB 670:G=2:C2=10:C3=100
460 P$=" Frequency (Hz): ":GOSUB 610:F=V
470 IF F<>0 THEN 510
480 P$=" Period (seconds): ":GOSUB 610:T=V
490 IF F=0 AND T=0 THEN PRINT " ? ? ?":GOTO 160
500 IF F=0 THEN F=1/T
510 P$=" Duty cycle (in %, must be >50% and not be =>100%): "
520 GOSUB 610: DC=V/100
530 IF DC<=.5 OR DC=>1 THEN PRINT " Error duty cycle range !":GOTO 510
540 P$=" Value of R2 (ohms): ":GOSUB 610: R2=V
550 IF R2<1000 THEN PRINT "Note: R2 should be greater than 1000 ohms)"
560 R1=R2*(2*DC-1)/1-DC: PRINT " R1 = ";R1;"ohms"
570 C1=1440000/(F*(R1+2*R2)):PRINT " C1 = ";C1;"uF"
580 GOSUB 910:REM --- QUESTION ---
590 IF Q$="N" THEN 160
600 IF Q$="Y" THEN GOSUB 700:GOTO 160
610 REM --- INPUT SUBROUTINE ---
620 PRINT P$;:INPUT IN$
630 V=ABS(VAL(IN$))
640 RETURN
650 PRINT " **********************************************************"
660 RETURN
670 PRINT:PRINT " Enter the following components:":RETURN
680 REM --- CLS ---
690 PRINT CHR$(12):RETURN
700 REM --- CIRCUIT ---
710 GOSUB 690:IF G=2 THEN 730
720 C1=C1*1000000
730 W$=" NE555/5-15V ^ +Vcc":PRINT W$;SPC(14)"ASTABLE 555 TIMER"
740 W$=" 7555 /3-18V |":PRINT W$;SPC(23)"R1=";R1;"ohms"
750 W$=" +--------+--+-------+":PRINT W$;SPC(15)"R2=";R2;"ohms"
760 W$=" | | | |":PRINT W$;SPC(15)"F =";F;"Hertz"
770 W$=" R1 ------- |":PRINT W$;SPC(15)"C1=";C1;"uF"
780 W$=" +-----|7 8 4 | |":PRINT W$;SPC(15)"C2=";C2;"nF"
790 W$=" | +--|6 | | Output":PRINT W$;SPC(8)"C3=";C3;"nF"
800 W$=" R2 | | 555 3|-------------> ":PRINT W$
810 W$=" +--+--| | |":PRINT W$
820 W$=" +| |2 1 5|--+ |":PRINT W$
830 W$=" C1 ------- | |":PRINT W$
840 W$=" -| | C2 C3":PRINT W$
850 W$=" +---------+------+--+":PRINT W$;
860 IF G=0 THEN ?SPC(9)" No active input data ..."
870 IF G=1 OR G=2 THEN ?""
880 W$=" |":PRINT W$
890 W$=" Gnd ===":PRINT W$:RETURN
900 ---QUESTION ---
910 PRINT:PRINT " Circuit - (Y)es or (N)o:";:INPUT Q$:RETURN
Download programu:
Timer555_astable_n.txt (3,50 kb)
Nasledujú praktické ukážky z programu:
Úvodné menu - 4 možnosti.
Voľba č.3 - vlastné zapojenie obvodu 555, bez vstupných dát.
Voľba č.1, R1=10000Ω, R2=10000Ω, C1=10uF,
potom nasleduje voľba zobrazenia zapojenia (Y).
Zapojenie, voľba č.1 s už zobrazenými parametrami súčiastok.
Voľba č.2, F=50Hz, Duty cycle=55%, R2=12000Ω, ostatné hodnoty /R1, C1/vyráta program,
potom nasleduje voľba zobrazenia zapojenia (Y).
Zapojenie, voľba č.2 s už zobrazenými parametrami súčiastok.
Pre voľbu č.2 je tu ešte jedna vychytávka, pri zadaní Frequency=0 treba zadať číselne požadovanú periódu, potom výpočet zbieha pomocou tohoto údaja. Treba zadať aj Duty cycle a hodnotu odporu R2. Pretože pri nízkych frekvenciách (dlhej perióde) treba použiť elektrolytické kondenzátory tak v schéme je tiež naznačená jeho polarita (C1), platí pre všetky výpočty.
Ak zadáte periódu=0 tak sa sa vrátite do menu.
Prajem príjemnú zábavu !
(Nech je čím prevetrať 8-bit ...)
_________________________________________________________________________________
21.11.2022
Dnes som dostal od Stana Havrana zaujímavý mail:
Ahoj, Igor,
videl som na Tvojich stránkach o ATARI program na výpočet obvodu 555 pre SBC6502. Mal som chvíľu čas, a tak som ho prepísal pre PC ako batch. Zbúchal som to za jeden večer, možno sú tam aj nejaké chyby, ale je to funkčné.
Zachoval som celú štruktúru programu aj s odkazmi na riadky v basicu, aby sa v tom dalo lepšie orientovať, hoci by sa dal aj optimalizovať a zdokonaliť, výsledky, premenné atď. ukladať na disk (čítať z disku) a podobné parádičky. Viac sa tomu nemienim venovať. Je to len taká sranda.
Súbor 555.txt treba premenovať na 555.cmd
Z príkazového riadku treba spustiť 555.cmd (stačí aj 555)
Stano
Program:
@rem Stanislav Havran
@rem date nov-20-2022
@echo off
title Astable 555 TIMER CALCULATION PROGRAMM
color e0
::begin
cls
call :starline
echo * Astable 555 TIMER CALCULATION PROGRAMM *
echo * original idea by James E. Tarchinski PE/1989/03 *
echo * modify programm by SBC6502 - Igi 14/09/2022 *
echo * second modify for command line PC as batch by (Sh) 20/11/2022 *
call :starline
:menu
echo.
echo.
set G=0
set C2=0
set C3=0
echo (1) - Calculate circuit data from component values
echo (2) - Calculate component values from circuit data
echo (3) - view to circuit
echo (4) - Exit the programm
echo.
choice /C 1234 /M "Would you like to:" /N
if %errorlevel% equ 4 goto :eof
if %errorlevel% equ 3 (
call :line690
call :line700
goto :menu
)
if %errorlevel% equ 2 goto :line440
if %errorlevel% equ 1 (
echo.
goto :line280
)
goto :menu
:line280
echo ************ CALCULATE CIRCUITS DATA ******************
call :line670
set G=1
set C2=10
set C3=100
:loop
echo (NOTE: R1 should be greater than 1000 ohms)
set /P P=" R1 (ohms): ? "
call :line610
set R1=%V%
if %R1% lss 1000 goto :loop
set /P P=" R2 (ohms): ? "
call :line610
set R2=%V%
set /P P=" C1 (nF): ? "
call :line610
set /A C1=%V%/1000
echo.
if %R1% equ 0 (
echo ERROR: Ilegal value R1
goto :menu
)
if %R2% equ 0 (
echo ERROR: Ilegal value R2
goto :menu
)
if %C1% equ 0 (
echo ERROR: Ilegal value C1
goto :menu
)
SET /A TH=693*%C1%*(%R1%+%R2%)/1000
echo High time = %TH% msec
set /A TL=693*%C1%*%R2%/1000
echo Low time = %TL% msec
set /A DC=(100*%TH%)/(%TH%+%TL%)
echo Duty cycle = %DC% %%
set /A PERIOD=%TH%+%TL%
echo Period = %PERIOD% usec
set /A F=1000000/%PERIOD%
echo Frequency = %F% Hz
:line410
call :line910
if /I %Q%==N goto :menu
if /I %Q%==Y call :line700 && goto :menu
:line440
rem -- CALCULATE COMPONENT VALUES ---
call :line670
set G=2
set C2=10
set C3=100
set /P P=" Frequency (Hz): "
call :line610
set /A F=%V%
if %F% neq 0 goto :line510
if /P P=" Period (seconds): "
call :line610
set /A T=%V%
if %F%==0 (
if %T%==0 (
echo ???
goto :menu
)
)
if %F%==0 set /A F=1/%T%
:line510
set /P P=" Duty cycle (in %%, must be >50 %% and not be =<100 %%): "
call :line610
set /A DC=%V%
if %DC% leq 50 echo Error duty cycle range ! && goto :line510
if %DC% geq 100 echo Error duty cycle range ! && goto :line510
set /P P=" Value of R2 (ohms): "
call :line610
set /A R2=%V%
if %R2% lss 1000 echo Note: R2 should be greater than 1000 ohms)
set /A R1=(%R2%*2*%DC%-100*%R2%)/(100-%DC%)
echo R1 = %R1% ohms
set /A C1=1440000000/(%F%*(%R1%+2*%R2%))
echo C1 = %C1% nF
goto :line410
:line610
rem --- INPUt SUBROUTINE ---
set /A V=%P%
exit /B
:line670
echo.
echo Enter the following components:
exit /B
:line690
cls
exit /B
:line700
rem --- CIRCUIT ---
call :line690
if %G% equ 2 goto :jump
set /A C1=%C1%*1000000
:jump
echo NE555/5-15V ^^ +Vcc ASTABLE 555 TIMER
echo 7555 /3-18V ^| R1=%R1% ohms
echo +--------+--+-------+ R2=%R2% ohms
echo ^| ^| ^| ^| F =%F% Hertz
echo R1 ------- ^| C1=%C1% nF
echo +-----^|7 8 4 ^| ^| C2=%C2% uF
echo ^| +--^|6 ^| ^| Output C3=%C3% nF
echo R2 ^| ^| 555 3^|-------------^>
echo +--+--^| ^| ^|
echo +^| ^|2 1 5^|--+ ^|
echo C1 ------- ^| ^|
echo -^| ^| C2 C3
echo +---------+------+--+
echo ^|
echo Gnd ===
echo.
if %G%==0 echo No active input data ...
:: if %G% equ 1 echo ?
:: if %G% equ 2 echo ?
pause >null
exit /B
:line910
echo.
set /P Q=" Circuit - (Y)es or (N)o: "
exit /B
:starline
echo *****************************************************************************
exit /b
Je to tu priamo aj ako txt súbor:
555.txt (4,22 kb)
Stano, vďaka za túto zrealizovanú "srandu" !!! Batchfile je to skutočne šikovný - teda ak niekto s ním vie poriadne narábať.
_____________________________________________________
Návrat do všetkých pokračovaní o SBC6502:
http://blog.3b2.sk/igi/post/Directory-SBC6502.aspx
____________________________________________________________
Vaše hodnotenie, Rate post: