; Program Vytah - pro 3 patra. ; Mikrokontroler 8051 (napr. AT89C51) ; Krystalovy oscilator 12MHz, vnitrni preddelicka procesoru je 12x ; Program slouzi pro ovladani vytahu pro 3 patra (oznacena jako 1, 2 a 3). ; Jedna se o klasicky stary vytah, ktery se dodatecne modernizuje ; pripojenim ridiciho mikrokontroleru s timto programem. ; Kabina vytahu obsahuje ctyri tlacitka: ; stop STOP tlacitko ; do1 jizda do 1. patra ; do2 jizda do 2. patra ; do3 jizda do 3. patra ; V kazdem patre je jedno tlacitko pro privolavani vytahu ; privo1 privolani z 1. patra ; privo2 privolani z 2. patra ; privo3 privolani z 3. patra ; Poloha kabiny se zjistuje pomoci 5 snimacu: ; V kazdem patre je snimac, ktery je sepnuty pokud je kabina v poloze ; pro otevreni dveri a take pokud se kabina nachazi v oblasti, kde je ; nutne pred zastavenim zpomalit (budu ji rikat brzdna oblast). ; Zbyle dva snimace slouzi pro detekci vytahu mezi patry a jejich pracovni ; oblast rovnez obsahuje i brzdnou oblast. ; polo1 vytah je v 1. patre (nebo v brzdne oblasti) ; polo2 vytah je v 2. patre (nebo v brzdne oblasti) ; polo3 vytah je v 3. patre ( ... ) ; polo12 vytah je mezi 1. a 2. patrem ( ... ) ; polo23 vytah je mezi 2. a 3. patrem ( ... ) ; Motor vytahu se ovlada tremi logickymi signaly ; nahoru jizda nahoru ; dolu jizda dolu ; rychle rychly pohyb (do stanic se zajizdi pomalu) ; Zamky dveri se odemykaji automaticky, pokud vytah stoji a kabina je ve ; spravne poloze. Nahozenim signalu nahoru nebo dolu se pri zavrenych ; dverich aktivuje zamek a o jeho spravne funkci je mikrokontroler ; informovan signalem: ; ok vsechny dvere jsou zajistene => vytah je v pohybu ; Teprve pokud je vse v poradku, vytah se rozjede. Signaly nahoru a dolu ; tedy primo neovladaji motor, ale jsou hradlovany se signalem ok. ; program by v Pascalu vypadal asi takto: ; program Vytah; ; var do3, do2, do1, stop, privo3, privo2, privo1, ok, ; polo3, polo23, polo2, polo12, polo1, ; nahoru, dolu, rychle, ; poloA, poloB, poloC, poloD: boolean; ; procedure pozor; ; begin ; if do1 then do1 := true; ; if do2 then do2 := true; ; if do3 then do3 := true; ; if privo1 then privo1 := true; ; if privo2 then privo2 := true; ; if privo3 then privo3 := true; ; if stop or ((not ok) and (nahoru or dolu)) then begin ; do1 := false; do2 := false; do3 := false; ; privo1 := false; privo2 := false; privo3 := false; ; asm pop a; pop a; end; // smazu navratovou adresu ; goto smycka; ; end; ; end; ; begin ; smycka: ; nahoru := false; ; dolu := false; ; poloA := polo3 or polo23; ; poloB := poloA or polo2 or polo12; ; poloC := polo1 or polo12; ; poloD := poloC or polo2 or polo23; ; pozor; ; if not (polo12 or polo23) then begin ; if polo1 then begin do1 := false; privo1 := false; end; ; if polo2 then begin do2 := false; privo2 := false; end; ; if polo3 then begin do3 := false; privo3 := false; end; ; end; ; if poloA and do2 then goto jedDolu; ; if poloB and do1 then goto jedDolu; ; if poloC and do2 then goto jedNahoru; ; if poloD and do3 then goto jedNahoru; ; if poloA and privo2 then goto jedDolu; ; if poloB and privo1 then goto jedDolu; ; if poloC and privo2 then goto jedNahoru; ; if poloD and privo3 then goto jedNahoru; ; goto smycka; ; jedDolu: ; rychle := not ( (polo2 and polo23 and (do2 or privo2)) ; or polo1 ); ; dolu := true; ; if not ok then delay(100); // zamknu dvere ; if not ok then goto smycka; ; if rychle then begin ; while (polo2 or polo3) do pozor; // opustim stanici ; while (not polo1) and (not polo2) do pozor; // vjedu do stanice ; goto jedDolu; ; end ; else ; goto brzdi; ; jedNahoru: ; rychle := not ( ( polo2 and polo12 and ; (do2 or (privo2 and (not do3))) ; ) ; or polo3 ); ; nahoru := true; ; if not ok then delay(100); // zamknu dvere ; if not ok then goto smycka; ; if rychle then begin ; while (polo1 or polo2) do pozor; // opustim stanici ; while (not polo2) and (not polo3) do pozor; // vjedu do stanice ; goto jedNahoru; ; end ; else ; goto brzdi; ; brzdi: ; while (polo23 or polo12) do pozor; ; nahoru := false; ; dolu := false; ; for i := 1 to 50 do begin // pauza 5 sekund ; delay(100); ; pozor; ; end; ; goto smycka; ; end. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Program v as51 se od toho Pascaloveho lisi tim, ze logicka hodnota true ; je na vstupech a vystupech reprezentovana hodnotou "0" a naopak. ; Proto jsou i logicke operatory psany inverzne (misto or je and, ...) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; vstupy do3 bit p3.7 do2 bit p3.6 do1 bit p3.5 stop bit p3.4 privo3 bit p3.3 privo2 bit p3.2 privo1 bit p3.1 ok bit p3.0 polo3 bit p1.7 polo23 bit p1.6 polo2 bit p1.5 polo12 bit p1.4 polo1 bit p1.3 ; vystupy nahoru bit p1.2 dolu bit p1.1 rychle bit p1.0 ; pomocne promenne poloA bit 0 poloB bit 1 poloC bit 2 poloD bit 3 pom bit 4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0 ; vsechny piny nastavim na "1" mov p1, #255 mov p3, #255 jmp smycka ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pozor: jb do1, pozor01 clr do1 pozor01: jb do2, pozor02 clr do2 pozor02: jb do3, pozor03 clr do3 pozor03: jb privo1, pozor04 clr privo1 pozor04: jb privo2, pozor05 clr privo2 pozor05: jb privo3, pozor06 clr privo3 pozor06: mov c, ok cpl c mov pom, c mov c, nahoru anl c, dolu orl c, pom anl c, stop jc nestop setb do1 setb do2 setb do3 setb privo1 setb privo2 setb privo3 pop acc pop acc jmp smycka nestop: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; pauza 100 milisekund pauza100: mov R6, #200 ; 200 * 0.5ms = 100ms pauza6: mov R7, #248 ; 2*248+4 = 500 instrukcnich cyklu = 0.5ms nop pauza7: djnz R7, pauza7 djnz R6, pauza6 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; nekonecna smycka smycka: setb nahoru setb dolu mov C, polo3 anl C, polo23 mov poloA, C anl C, polo2 anl C, polo12 mov poloB, C mov C, polo1 anl C, polo12 mov poloC, C anl C, polo2 anl C, polo23 mov poloD, C mov C, polo12 anl C, polo23 jnc zrus3 jb polo1, zrus1 setb do1 setb privo1 zrus1: jb polo2, zrus2 setb do2 setb privo2 zrus2: jb polo3, zrus3 setb do3 setb privo3 zrus3: call pozor mov C, poloA orl C, do2 jnc jedDolu mov C, poloB orl C, do1 jnc jedDolu mov C, poloC orl C, do2 jnc jedNahoru mov C, poloD orl C, do3 jnc jedNahoru mov C, poloA orl C, privo2 jnc jedDolu mov C, poloB orl C, privo1 jnc jedDolu mov C, poloC orl C, privo2 jnc jedNahoru mov C, poloD orl C, privo3 jnc jedNahoru jmp smycka ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; jedDolu: mov C, do2 anl C, privo2 orl C, polo23 orl C, polo2 anl C, polo1 cpl C mov rychle, C clr dolu jnb ok, doluOk1 call pauza100 doluOk1: jnb ok, doluOk2 jmp smycka doluOk2: jb rychle, brzdi doluOpustit: call pozor mov C, polo2 anl C, polo3 jnc doluOpustit doluVjed: call pozor mov C, polo1 anl C, polo2 jc doluVjed jmp jedDolu jedNahoru: mov C, do3 cpl C orl C, privo2 anl C, do2 orl C, polo2 orl C, polo12 anl C, polo3 cpl C mov rychle, C clr nahoru jnb ok, nahoOk1 call pauza100 nahoOk1: jnb ok, nahoOk2 jmp smycka nahoOk2: jb rychle, brzdi nahoruOpustit: call pozor mov C, polo1 anl C, polo2 jnc nahoruOpustit nahoruVjed: call pozor mov C, polo2 anl C, polo3 jc nahoruVjed jmp jedNahoru ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; brzdi: call pozor mov C, polo23 anl C, polo12 jnc brzdi setb nahoru setb dolu mov R5, #50 ; 50 * 100ms = 5 sekund pauza5: call pozor call pauza100 djnz R5, pauza5 jmp smycka ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END