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

Help for Timer0 interrupt

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



Joined: 01 Jun 2011
Posts: 19
Location: INDIA

View user's profile Send private message MSN Messenger

Help for Timer0 interrupt
PostPosted: Thu Sep 13, 2012 3:29 am     Reply with quote

I want to control AC phase angle controlling TRIAC gate signal. I am using timer0 interrupt with
Code:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);

and check adc value from trimpot.
I am using 16F684 with 4MHz internal oscillator,
I had read ADC in and drive MOC3001 using PWM.
ADC value converted from(0-1023) to (0-10) using conversion. As 0-10ms conversion, but I found flickerring at PWM output in oscilloscope & on Load lamp. Either problem from Timer0. Can anyone give any solution to resolve this problem ?

I had checked individually ADC & PWM output without detecting zero-cross detect of AC using optocoupler (EL817D).
& using software delay routine & PWM with zero-cross detect it worked properly. But using zerocross detect, with ADC & PWM, I'm stuck on this problem.


Last edited by Spradecom on Fri Sep 14, 2012 1:41 am; edited 2 times in total
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Thu Sep 13, 2012 9:39 am     Reply with quote

Quote:
I had checked individually ADC & PWM output without detecting zero-cross detect of AC using optocoupler (EL817D).
& using software delay routine & PWM with zero-cross detect it worked properly. But using zerocross detect, with ADC & PWM, I'm stuck on this problem.
I'm not sure about what you're saying does/doesn't work.

I need a lot more clear, concise detail about what you are actually doing in both hardware and software. You're the one with the board in front of you, we're all having to second guess.

Mike
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Thu Sep 13, 2012 4:27 pm     Reply with quote

got a SCHEMATIC??
and your FULL CODE ??

a faulty zero cross detector can make your whole thing bad -
but ???
Quote:

drive MOC3001 using PWM.


How do you SYNC to line rate zero-cross -
?? PWM alone is going to random trigger w/0
sync and isn't going to mean much !!

SO how do you know its the timer and not your program logic??

etc etc etc

better still -how can WE tell w/o any schematic or full code to review??
Spradecom



Joined: 01 Jun 2011
Posts: 19
Location: INDIA

View user's profile Send private message MSN Messenger

PostPosted: Fri Sep 14, 2012 1:42 am     Reply with quote

asmboy wrote:
got a SCHEMATIC??
and your FULL CODE ??

a faulty zero cross detector can make your whole thing bad -
but ???
Quote:

drive MOC3001 using PWM.


How do you SYNC to line rate zero-cross -
?? PWM alone is going to random trigger w/0
sync and isn't going to mean much !!

SO how do you know its the timer and not your program logic??

etc etc etc

better still -how can WE tell w/o any schematic or full code to review??


My modified code is

Code:
//------------------------------------------------------------------------------
unsigned int8 temp_port_a;
unsigned int8 buff[20]={};
void shift_buff(void);
void shift_adc_buff(void);
//------------------------------------------------------------------------------
#int_TIMER0
void  TIMER0_isr(void)
{
   disable_interrupts(INT_TIMER0);               //disable timer0 interrupt
   TRAIC_GATE = 0;
//   delay_us(350);
//   TRAIC_GATE = 1;
}
//------------------------------------------------------------------------------
#int_RA
void  RA_isr(void)
{   
   TRAIC_GATE = 1;
   set_timer0(firing_angle);
   enable_interrupts(INT_TIMER0);               //Enable timer0 interrupt
   temp_port_a = PORTA;
}
//------------------------------------------------------------------------------
void main()
   {
      setup_adc_ports(sAN5|VSS_VDD);
      setup_adc(ADC_CLOCK_DIV_64);
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
      setup_timer_1(T1_DISABLED);
      setup_timer_2(T2_DISABLED,0,1);
      setup_comparator(NC_NC_NC_NC);
      setup_vref(FALSE);
      enable_interrupts(INT_TIMER0);
      enable_interrupts(INT_RA);
      setup_oscillator(OSC_8MHZ);
      initialize_ports();
      initialize_variables();
      enable_interrupts(GLOBAL);
      while(TRUE)
      {
      STATUS_LED ^= 1;
      read_pot_position();
      }
   }
//------------------------------------------------------------------------------
void initialize_ports(void)
   {
   output_float(PIN_A0);
   output_float(PIN_A1);
   output_float(PIN_A2);
   output_float(PIN_A3);
   output_float(PIN_A4);
   output_float(PIN_A5);

   output_high(PIN_C0);
   output_float(PIN_C1);
   output_high(PIN_C2);
   output_float(PIN_C3);
   output_float(PIN_C4);
   output_float(PIN_C5);
   }
//------------------------------------------------------------------------------
void initialize_variables(void)
{
   unsigned int8 i;
   firing_angle = MINIMUM_FIRING_ENGLE;
   for(i=0;i<20;i++)
   {
      buff[i]=firing_angle;
   }
}
//------------------------------------------------------------------------------
void read_pot_position(void)
   {
   unsigned int32 adc_output_data;
   unsigned int16 i;
   unsigned int8 temp_data;
   unsigned int8 fire_data;
   unsigned int16 read_data;
   set_adc_channel(5);

   adc_output_data = 0;

   for(i = 0; i <100; i++)
    {
      adc_output_data += read_adc(ADC_START_AND_READ);
    }
      read_data=(unsigned int16)(adc_output_data/i);
   temp_data = (unsigned int8)(read_data / 7.8);
   fire_data = MINIMUM_FIRING_ENGLE + temp_data;
   firing_angle =buff[0];
   shift_buff();
   buff[19]=fire_data;
   }
//-----------------------------------------------------------------------------
void shift_buff(void)
{
   unsigned int8 j;
   for(j=0;j<19;j++)
   {
       buff[j]=buff[j+1]; 
   }
}
//------------------------------------------------------------------------------

& Configuration as following

#include "16F684.h"

#device adc=10

/********************************************************************************/
//                     Defining All FUSES
/********************************************************************************/

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES CPD                       //No EE protection
#FUSES PUT                      //Power Up Timer
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled

#use delay(clock=8000000)

/********************************************************************************/
//                     Defining All SFR's
/********************************************************************************/
#BYTE PORTA = 0x05
#BYTE PORTC = 0x07

/********************************************************************************/
//                     Defining All Ports
/********************************************************************************/
#BIT ICD_2_DATA         = PORTA.0               //INPUT
#BIT ICD_2_CLOCK       = PORTA.1               //INPUT
#BIT NC_1             = PORTA.2               //INPUT
#BIT ICD_2_RESET      = PORTA.3               //INPUT
#BIT ZERO_CROSSING       = PORTA.4               //OUTPUT
#BIT NC_2             = PORTA.5               //OUTPUT

#BIT STATUS_LED         = PORTC.0               //OUTPUT
#BIT ANALOG_INPUT      = PORTC.1               //OUTPUT
#BIT TRAIC_GATE         = PORTC.2               //OUTPUT
#BIT NC_3            = PORTC.3                //OUTPUT
#BIT NC_4            = PORTC.4                //INPUT
#BIT NC_5            = PORTC.5               //INPUT

/********************************************************************************/
//                     Defining All Data
/********************************************************************************/
#define MINIMUM_FIRING_ENGLE   115
#define MAXIMUM_FIRING_ENGLE   245
/********************************************************************************/
//                     Defining All Variables
/********************************************************************************/
unsigned int8 firing_angle;


/********************************************************************************/
//                     Defining All Functions
/********************************************************************************/
void initialize_ports(void);
void initialize_variables(void);
void read_pot_position(void);
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Fri Sep 14, 2012 2:35 am     Reply with quote

Still no schematic.

You're keeping us all in the dark.

Mike
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