CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

phase control light dimmer

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
bonhome



Joined: 04 Mar 2011
Posts: 4
Location: DZ

View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger ICQ Number

phase control light dimmer
PostPosted: Fri Mar 04, 2011 4:56 am     Reply with quote

Hello, I have been working on a phase control light dimmer project with pic 16f877 microcontroller with ccs pic c compiler driving a MOC3021 optotriac controlling a lamp 220 v 50 Hz .
I can say that I know the principle well, so I wrote this c code, and for some reason it does not work.
Well in this case I am trying to control the lamp at 3 different phases 100, 75, 50%.
Code:

int porcentage=100;

#int_EXT
EXT_isr()
{
if(porcentage==50)
 {
 delay_us(4990);
 output_high(PIN_C0);
 delay_us(100);
 output_low(PIN_C0);
// set_timer1(5000);
 }
 else if(porcentage==75)
 {
 delay_us(2480);
 output_high(PIN_C0);
 delay_us(100);
 output_low(PIN_C0);
// set_timer1(2500);
 }
 else if(porcentage==100)
 {
 output_high(PIN_C0);
 delay_us(100);
 output_low(PIN_C0);
 }

}


void main()
{
   port_b_pullups(FALSE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_EXT);
   ext_int_edge( H_TO_L );
   enable_interrupts(GLOBAL);
   set_tris_c(0b11111110);

   while(1){
   }

}

So if anyone could help me I would appreciate it. Thank you. Rolling Eyes
Rosmaninho



Joined: 16 Jan 2011
Posts: 23

View user's profile Send private message

PostPosted: Fri Mar 04, 2011 7:04 am     Reply with quote

I'm only a beginner, but, your program will be arrested inside your While(1), and it won't do nothing more.

This is the error I find.
bonhome



Joined: 04 Mar 2011
Posts: 4
Location: DZ

View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger ICQ Number

PostPosted: Fri Mar 04, 2011 7:26 am     Reply with quote

an external interruption caused by a zeros cross circuit will execute that ISr
_________________
hi
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Fri Mar 04, 2011 8:10 am     Reply with quote

Can you tell us what you code DOES do? Do you get any output at all? Is it erratic? What does it NOT do?
_________________
The search for better is endless. Instead simply find very good and get the job done.
bonhome



Joined: 04 Mar 2011
Posts: 4
Location: DZ

View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger ICQ Number

PostPosted: Fri Mar 04, 2011 1:26 pm     Reply with quote

The code trigger a optotriac with a small impulse of 100us.
_________________
hi
sseidman



Joined: 14 Mar 2005
Posts: 159

View user's profile Send private message

PostPosted: Fri Mar 04, 2011 1:46 pm     Reply with quote

What does "won't work" mean??
gpsmikey



Joined: 16 Nov 2010
Posts: 588
Location: Kirkland, WA

View user's profile Send private message

PostPosted: Sun Mar 06, 2011 12:22 am     Reply with quote

One thing I would suggest if you have a spare pin is at the start of your ISR, set it high, wait 50 us or so then set it low. That would give you a test of your zero crossing detector as well as letting you view the delay between zero crossing and the trigger point if you have a dual channel scope. If I have any spare pins, I always try to do something with that pin during the ISR so I can tell that it is a) getting executed and b) gives me a reference timing signal.

mikey
_________________
mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
bonhome



Joined: 04 Mar 2011
Posts: 4
Location: DZ

View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger ICQ Number

PostPosted: Sun Mar 06, 2011 10:20 am     Reply with quote

thanks that's a good idea
_________________
hi
Ttelmah



Joined: 11 Mar 2010
Posts: 19328

View user's profile Send private message

PostPosted: Sun Mar 06, 2011 10:40 am     Reply with quote

As an alternative, just toggle a pin in the ISR. This way, if the detector is working perfectly, you should get a square wave in sync with the incoming signal, If a crossing is missed, the phase will shift, giving an instant 'diagnosis', and doing this removes the need for any delay in the ISR.

On a further comment, does the trigger really need a pulse as long as 100uSec. In most cases 1uSec is adequate. Are you in a 50Hz, or 100Hz country?. 50% power, on a full wave system, should imply triggering after 1/2 of 1/2 wave, so in a 60Hz country, after 4.16mSec, or in a 50Hz country, after 5mSec, neither of which correspond to the delay values you have, though possibly you are allowing 10uSec to get into the ISR, and the value then looks reasonable for a system on 50Hz. However if you are allowing 10uSec to get into the ISR, why does this increase to 20, for the 75% power timings?.
Are you sure you have got the chips crystal delays setup right - obviously nothing here will work if this is wrong.

Best Wishes
gpsmikey



Joined: 16 Nov 2010
Posts: 588
Location: Kirkland, WA

View user's profile Send private message

PostPosted: Sun Mar 06, 2011 6:20 pm     Reply with quote

Ttelmah wrote:
As an alternative, just toggle a pin in the ISR. This way, if the detector is working perfectly, you should get a square wave in sync with the incoming signal, If a crossing is missed, the phase will shift, giving an instant 'diagnosis', and doing this removes the need for any delay in the ISR.

[snip]

Best Wishes


That's probably a better idea. What I usually do is set a pin at the start of the ISR then clear it again at the end of the ISR - lets me see just how much time is being spent in an ISR. I had not suggested that for this one because you had a variable delay in the ISR, but simply toggle the pin each time through the ISR as Ttelmah suggests is a good idea. Either way, one of the things you learn to do with embedded things like this is put some sort of "test points" in the system that allows you to see what is going on. Makes life much easier (usually).

mikey
_________________
mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group