SBC6502 - 57 - basic programs - Astable 555 timer calculator.

By Administrator at septembra 14, 2022 10:50
Filed Under: SBC6502

 

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ť.

______________________________________________________

Vaše hodnotenie, Rate post:

Comments

14. 9. 2022 10:52:56 #

trackback

Directory SBC6502

Directory SBC6502

Igi blog |

Info o autorovi

Volám sa Igor Gramblička, bydlisko: Bratislava, Slovakia. Môj nick: Igi. Blog je o mojich záujmoch, predtým som pracoval ako IT špecialista na počítačové siete a redakčné systémy pre viaceré denníky - až som pred rokmi nakoniec v jednom z nich zakotvil a kde som to potiahol až do konca mojej profesnej kariéry.

Rok, mesiac, počet článkov: