Вид на жительство
Регистрация: 19.05.2005
Сообщений: 478
Сказал спасибо: 0
Сказали Спасибо 21 раз(а) в 16 сообщении(ях)
|
вот прога для сенсорного упраления светом лампы вырезать ничего не стал лень.
.DEVICE AT90S1200 ; Use the AT90S1200
.EQU t1=256-2
.EQU t2=256-12
.EQU t3=256-15
.EQU t4=256-18
.EQU t5=256-20
.EQU t6=256-22
.EQU t7=256-24
.EQU t8=256-27
.EQU t9=256-31
.EQU t10=256-37; max 39
.EQU tau=5
.EQU startt=5 ; c*1024
.EQU stopt=0 ; stop timer
.EQU timer=0x32
.EQU st_time=0x33
.EQU timsk=0x39
.EQU pd=0x12 ;port d
.EQU pind=0x10;input d
.EQU ddrd=0x11 ;dir of pd
.EQU mcucr=0x35
.EQU sreg=0x3f
.EQU acsr=0x8
.DEF power=r2;old stat of power wave
.DEF sensor=r3;old stat of sensor
.DEF lamp_on=R5;
.DEF sec1=R24 ; inc ref pulse if 20 - 1sec then r5=1
.DEF sec2=R25 ; loock if r5=1 if sens pressed (r7)› 5 times r5=0
.DEF sens_pres=R26 ; and r6=1 if r7‹2 sens not pressed and r6=0
.DEF sens_tims=R27 ;
.DEF ZZ=R30
.DEF dir=R29
.EQU ext_int=0x3b;ext iterrupt mask
.EQU d_out=3; 0 & 1 bit d --› out
.EQU test_puls=1; d0
.EQU gate_puls=2; d1
.EQU gate=10 ; ›2 mks 4mks/Tclk/3 cikl
.EQU press=30; 0,3 sec - sens pressed
.equ short=5; 0,05short - lamp on-off
.CSEG
.org 0
rjmp start_prog ; Reset Handler
reti; rjmp ref ; IRQ0 Handler
rjmp timer_subr ; Timer0 Overflow Handler
reti; rjmp comp_sub ; Analog Comparator Handler
.org 0x10
start_prog: ; load t1-t10 to r10 - r19
ldi r21,t1;
mov r10,r21;
ldi r21,t2;
mov r11,r21;
ldi r21,t3;
mov r12,r21;
ldi r21,t4
mov r13,r21;
ldi r21,t5
mov r14,r21;
ldi r21,t6
mov r15,r21;
ldi r16,t7
ldi r17,t8
ldi r18,t9
ldi r19,t10
ldi r31,0
ldi r30,10;
ldi dir,1;up
ldi sec1,100
ldi sec2,0
ldi r21,0x2b;ddrd
out ddrd,r21;0,1,3,5 out
clr r2
clr r3
clr r4
clr r5
clr r27
out acsr,r27;
wait_comp: in r21,acsr;
andi r21,0x20;
breq wait_comp; wait 1 from comp
mov sensor,r21; save
ldi r21,1
mov lamp_on,r21;switch on
;-------- iterrupt enable
;------------timer
ldi r21,stopt
out st_time,r21
ldi r21,2; int enabl
out timsk,r21
ldi r21,0x80; global
out sreg,r21
mp1: ; -scan portd---
in r21,pind
andi r21,0x04; d2
breq mp1; wait 1
mov power,r21; save
mp2: ;-------- wait changes of power
in r21,pind
andi r21,0x04; d2
eor r21,power;r2 zero if not chenged 1 if changed
breq mp3; wait changes
com power
and power,r21; power inversed old
rcall ref;
;--------- scan sensor
mp3: in r21,acsr;
andi r21,0x20;
eor r21,sensor;r3 0 not ch 1 - ch-ed
breq mp2; wait changes
com sensor
and sensor,r21;sensor inversed old
rcall comp_sub
nop
rjmp mp2; cikle work
;----------- front of power puls is locked--
;coun 100 puls then set sec2 to 1
; if lamp_on start timer with (Z) val
ref: in r21,pd
ori r21,test_puls
out pd,r21; test puls - subrutine of power puls
;-------------
dec sec1;if sec1=100 then sec2=1
brpl ref1;
ldi sec2, 1 ;sec2
ldi sec1, 100;
ref1: tst lamp_on;
breq no_on; not lite
ld r21,Z ; curent val of time Z - current addres t
out timer,r21 ; load timer
;--
ldi r21,startt;
out st_time,r21; start timer
no_on: ;-------------
in r21,pd
andi r21,0xfe; stop test puls - end power subrutine
out pd,r21
ret ; return
;----------------
;delay end set gate puls
timer_subr:
ldi r21,stopt
out st_time,r21; stop timer
in r21,pd
ori r21,8
out pd,r21; ----set d3 for lucking timer interrupt
;----------------------------------
tst lamp_on
breq timer_end ;not lite
;------lite
in r21,pd
ori r21,gate_puls; set gate puls
out pd,r21
ldi r21,gate; long gate puls ›2mks 4
delay: dec r21 ; /1
brpl delay; cykle 4 mks /2
in r21,pd
andi r21,0xfd
out pd,r21; stop gate puls
timer_end: ;------------------------------
in r21,pd
andi r21,0xf7
out pd,r21;stop d3 power iterrupt end
reti; return
;----------------------
; count sens_tims
;if sec2 =0 return
; if sec2=1 then
; if sens_tims ‹2 set not_pressed
; if sens_tims ‹ short - set lamp_on/off
;if sens_tims › pres - next (Z+-) intensity
; if sec2=1 then clr sec2
comp_sub: inc sens_tims
in r21,pd
ori r21,0x20; d5 - comparator subrutine
out pd,r21
;-----------------------------------
tst sec2; 0 or 1 - 1sec
breq np1 ; if sec2=0
;----
sensor: cpi sens_tims,2; not pressed
brmi np
cpi sens_tims,short; 0,15‹ poroga
brmi pr_short; short
cpi sens_tims,press; ›0,75 sec
brmi np ; ‹0,5sec
;------- all conditions
ldi sens_tims,0
ldi r21,1
mov lamp_on,r21; if pressed sw on
add ZZ,dir ; Z + or - 1
cpi ZZ,10; min registr
brpl Z19;
ldi ZZ,10;
ldi dir,1; up
Z19: cpi ZZ,20; max registr
brmi np; Z‹19
ldi ZZ,19
ldi dir,-1; down
; ---sw lamp off rjmp np
pr_short: inc lamp_on
ldi r21,1
and lamp_on,r21;lamp sw on/off
np: ldi sec2,0 ; 0
ldi sec1,100; initial next time slot
np1: in r21,pd
andi r21,0xdf;d5 - reset comp puls out
out pd,r21
ret;
;-------------------
phaz: .db t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; start phase of pulse
.exit
|