??? 02/06/06 02:47 Modified: 02/06/06 03:00 Read: times |
#109257 - schematic and code Responding to: ???'s previous message |
Suresh said:
I too prefer doing it with a microcontroller for accuracy.
But, to my knowledge i thought, i could use an interrupt to start dispensing. and i can program the timer. But iam not aware of how the Timing could be adjusted manually when a microcontroller is used. Any suggestions. You could try the following circuit: (Pin1 of ISP header goes to P1.7) This could be the code (not tested so far): $nomod51 $include (89s52.mcu) org 0 sjmp begin org 002bh ;initialize begin: mov auxr,#00011001b ;reset pin is input mov tmod,#00000001b ;timer 0 in modus 1 ;Total delay is ;number 'z' (BCD- ;switches) times ;10msec delay of ;timer 0 ;reads 'start' and ;BCD switches start_pressed?: clr p1.4 ;strobe watchdog mov c,p0.2 ;read 'start' setb p1.4 ;strobe watchdog ;'start' pressed? jc start_pressed? ;No! ;'start' is pressed: mov a,p0 ;read "1" swap a ;eases layout cpl a ;true data anl a,#00001111b ;low nibble needed mov r0,a ;store "1" in r0 mov a,p2 ;read "10","100" cpl a ;true data mov r1,a ;store it in r1 swap a ;eases layout anl a,#00001111b ;low nibble needed mov b,#10 ;load #10 into b mul ab ;a = "10" x 10 add a,r0 ;add r0 ("1") mov r0,a ;store it in r0 mov a,r1 ;now we need "100" anl a,#00001111b ;low nibble needed mov b,#100 ;load #100 into b mul ab ;a = "100" x 100 add a,r0 ;add r0 mov r0,a ;low byte in r0 mov a,#0 ;carry? addc a,b ;add carry to b mov r1,a ;high byte in r1 ;r1=0? jnz activate_relay ;r1<>0! ;r1=0! mov a,r0 ;r0=0? jz start_released? ;r0=0 and r1=0! ;means z=0! ;r0<>0 or r1<>0! ;means z<>0! activate_relay: clr p0.0 ;turn on relay ;initialize timer timer_delay: mov th0,#220 ;reload high byte mov tl0,#15 ;reload low byte setb tr0 ;start timer 0 clr p1.4 ;strobe watchdog ;timer busy? timer_busy?: jnb tf0,timer_busy? ;timer busy! ;10msec delay over clr tr0 ;stop timer 0 clr tf0 ;clear overfl. flag setb p1.4 ;strobe watchdog ;decrement z mov a,r0 ; clr c ; subb a,#1 ;a=r0-1 mov r0,a ;low byte of z=z-1 ;into r0 mov a,r1 ;carry? subb a,#0 ; mov r1,a ;high byte of z= ;z-1 into r1 ;r1=0? jnz timer_delay ;r1<>0! ;r1=0! mov a,r0 ;r0=0? jnz timer_delay ;r0<>0! ;r0=0 and r1=0! ;means z=0! setb p0.0 ;turn off relay start_released?: clr p1.4 ;strobe watchdog mov c,p0.2 ;read 'start' setb p1.4 ;strobe watchdog ;'start' released? jnc start_released? ;No! ;'start' released! ;initialize waiting ;loop mov r1,#103 ;'start' released waiting_loop_1: mov r0,#255 ;for 0.2 sec? waiting_loop_2: clr p1.4 ;strobe watchdog mov c,p0.2 ;read 'start' setb p1.4 ;strobe watchdog ;still released? jnc start_released? ;No! ;still released! djnz r0,waiting_loop_2 ;repeat loop 2 djnz r1,waiting_loop_1 ;repeat loop 1 ljmp start_pressed? ;'start' released ;for at least ;0.2sec! end Kai |