??? 04/22/10 18:50 Read: times Msg Score: +1 +1 Good Answer/Helpful |
#175286 - so try something safely Responding to: ???'s previous message |
1)Clamp diodes You can add at start and remove after firs success.
I believe that micro will survive. BUT MAKE EVERYTHING FOR YOUR SAFETY. For example - use isolating transformer. Even You do not have such one (1:1 )- You can construct one by 2 transformers connected in "series" - Mains 220V->(T1=220:12) ->(T2= 12V:220V) -> Your dimmer. This is safe than direct connection to mains for first tests. BUT NOT VERY SAVE, CARE IS NEEDED. 2)1 Mohm ZCD to 8051 will have different behavior than in PIC or some AVR: a) usually 8xx51 has pull-up circuit b) input impedance is different. My expirience is not enough to predict result, You must try. 3) Using Timer instead second ZCD interrupt. At start - - wait falling edge on ZCD-pin (disable INT0') . - clear TL0,TR0 , set Timer in 16 bit mode, external gated , incremented by OSC/12 , enable TR0, clear TF0, disable ET0. - wait next falling edge on ZCD-pin. Now Timer0 is un-gated , contents X=TH0TL0 shows length of positive half-wave. If Your XTAL=12MHz , then this number is in microseconds . Note - 2*X can be more , less or equal to period. To measure period You must be very fast (disable interrupts): - clear timer Tr0=0, th0tl0=0 - wait for high on ZCD-pin - wait for low - enable timer with TR0=1 , gate=1 (do not use external gate) .Here You will lose some microseconds. - wait for high - enable external gating - now relax and wait for low. At falling edge You can read TH0TL0= period. If You want - repeat some times and average results. So You can go further - to mainloop. You will use Int0 on falling edge to detect ZC in (let say) negative direction . Using any timer You can still track (by controlling timer in INT0 ISR) length of period. You have Period measured already. On INT0_ISR start Timer1 - TR1=0 ;TH1TL1=65536-Period , timer mode, TR1=1 enabled,ET1=1 - interrupt enabled. So After half of period Timer1 ISR will be started - at start of second semi-wave. Good thinked code will have error (relative to real Zero cross) less than 10 microseconds. Other way - You do not need to search for second ZeroCross. What i mean: - On INT0 You detect ZeroCrossing. After some already calculated time AngleTime1 You must fire lamp. So start Timer1=65536 - AngleTime1. Enable TR1, ET1. - After AngleTime1 Timer1 will invoke ISR_TIMER1. Fire lamp. If You use incandescent lamp and triac - few microseconds fire pulse is enough for triac. You are somewhere in negative semiwave. Now reload Timer1=65536-HalfPeriod. Clear TF1, keep ET1=1; Unfire triac now. Exit ISR. - After Half period Timer1 will invoke Timer1_isr. Fire triac again. Wait few microsecond and un-fire . - And now next INT0 interrupt is coming. So , i think i should take a beer, and let You to understand what i mean. Good luck |