??? 02/07/06 14:55 Modified: 02/07/06 15:00 Read: times |
#109412 - Answers Responding to: ???'s previous message |
Suresh said:
I have not used an ISP Header. can i know about it. (Pin1 of header goes to P1.7) The ISP header allows you to connect the ATMEL ISP programmer (ISP cable), which we have discussed here a lot in the last days and weeks, to the AT89S52. To program the AT89S52 turn-off Vcc of micro, disconnect the reset line of micro from MAX1232's output by the help of shown jumper. Then, connect the 'ISP cable' to the header, turn-on Vcc of micro (target) and program it. After verification of proper programming, program the lock bits, turn-off Vcc of target, remove the 'ISP cable', set the jumper again to connect reset line of micro to MAX1232's output and turn-on Vcc of micro again. Now the micro will do its job. Suresh said:
description of this instruction is needed. ;initialize begin: mov auxr,#00011001b ;reset pin is input mov tmod,#00000001b ;timer 0 in modus 1 These two lines initialize the AT89S52. The first line configures the auxr-register, which is an additional SFR of AT89S52, not implemented with original 80C52. It allows you to switch-off the internal watchdog during idle, to switch-off ALE and to configure the reset pin as input only. Have a look at datasheet of AT89S52 to see more details. The second line configures timer0 to work in mode1. Suresh said:
Also, it would be helpful to understand the code if you could give a description of the operation that the software does for a particular switch setting.
i.e.,I mean to know the logic you have used in it to get the required time delay. The code, which I recall here again, is very simple: $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 You have three BCD switches: "1", "10" and "100". With these you can input numbers from 0 to 999. Multiply this number by 10msec and you have the possible turn-on times of dispenser, means 0 to 9.99sec. You can put a decimal point between "100" BCD switch and "10" BCD switch to optically visualize this range. After initialization of micro, the program waits for the start button being pressed. When logic low is detected at P0.2, the micro reads the BCD switches and and forms a binary number (z = 0...999), which then is temporarily stored in r0 (low byte) and r1 (high byte). Directly afterwards the program checks, whether z = 0. If so, the main delay routine is skipped. If z is not 0, then the main output (P0.0) gets activated, means the dispenser is turned-on. Immediately after that, the delay routine is invoked, which turns-on timer0 for z times. As timer0 produces a 10msec delay, looping this timer for z times gives the wanted turn-on time of dispenser. Correctly spoken the timer is not configured to exactly 10msec, because the additonal instructions in the delay loop also consume time. The timer was configured in that way, that timer0 delay plus cycle time of additional instructions yield 10msec. Timer0 setting is: 65536 - (220 x 256 + 15) = 65536 - 56335 = 9201. In combination with 11.0592MHz crystal this gives a time delay of 1 / 11.0592MHz x 12 x 9201 = 9.9837msec. With all this timing stuff, don't forget, that your relay turning-on the dispenser can show a turn-on and turn-off delay of many many miliseconds. So, don't expect very high precision, when you choose a dispensing time in the 10msec range. Choose a fast relay, with equal turn-on and turn-off time, if you need high precision. If the delay time is over, means if the loop, which activates timer0 has run through for z times, the main output (P0.0) gets deactivated, means the dispenser is turned-off again. If we would now jump to the start of program again, then we had trouble with switch bounce. Instead of that we need to do something which guarantees, that all further start button pressings done during the delay and all bounces are ignored and that a permanently pressed start button will not turn-on the dispenser again and again. So, we jump to the start only, if after the dispensing time the start button was released for a period of 0.2sec. Kai |