<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>S12 / MagniV Microcontrollers中的主题 Multiple Interrupts</title>
    <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178247#M6344</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have enabled the input capture interrupts on rising edge and its working fine.&lt;/P&gt;&lt;P&gt;I now want to add a second interrupt (Timer Overflow Interrupt). The initialization below works fine.&lt;/P&gt;&lt;P&gt;I'm having problems when I enable the timer over flow interrupt on the TSCR2 register by changing its value to TSCR2 = 0x82. I've tried stepping through the code and after a few steps, True time simulator looses connection with board and my PORTB LED's stop working.&lt;/P&gt;&lt;P&gt;If I change TSCR2 back to TSCR2 = 0x02; everything works fine again.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;void input_capture_initialize(void)
{
&amp;nbsp; TSCR1=0x90; /* enable timer and fast clear, rather than writing to bit0 of TFLG1 */
&amp;nbsp; TSCR2=0x02; /* prescale to 4&amp;nbsp; 6000000 pps, longest pulse width measured using*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; TIOS|=0xFE;&amp;nbsp; /* select input capture (all channels) */
&amp;nbsp; TCTL3=0x00; /* capture disabled on channels 4 to 7 */
&amp;nbsp; TCTL4=0x01; /*PORTT0 capture on rising edge, channels 1 to 3 disabled */
&amp;nbsp; TIE=0x01;&amp;nbsp;&amp;nbsp; /* enable timer interrupt on C0 */
&amp;nbsp; TFLG2=0x80;
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;I think i'm not initializing something properly and the problem is somewhere in the initialization of the above registers.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, here is the complete code (I don't expect anyone to go through it)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;#include &amp;lt;hidef.h&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* common defines and macros */
#include "derivative.h"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* derivative-specific definitions */

volatile unsigned int rising, frequency_int, set_point;
volatile unsigned int flag;
float actual_period, frequency, period, average, Speed_RPM=0, frequency_actual;
unsigned int old_TC0, x, count, Speed_RPM2=0, i=0;
volatile int error;

void Set_Clock(void);
void PWM0_ini(unsigned char prescale_factor, unsigned char period, unsigned char init_duty);

#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module.
Placement will be in NON_BANKED area. */

/* Interrupt on a rising edge of waveform connected to PT0 */
interrupt void toc0_isr(void)
{&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag ==0)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; old_TC0 = TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; period = x - old_TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; old_TC0 = TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; average += period;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count ++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (count == 20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; period = (average/20);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; average = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual_period = period/6000000;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frequency = 1/actual_period;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frequency_int = (unsigned int)frequency/100;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frequency_actual = (unsigned int)frequency;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTB = Speed_RPM2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; error = set_point - frequency_int;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; 
}
#pragma CODE_SEG DEFAULT

void input_capture_initialize(void); /* prototype to initialize input capture */

void main(void)
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRB = 0xFF;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTB as output since LEDs are connected to it
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRJ = 0xFF;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PTJ as output to control Dragon12+ LEDs
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRT = 0xFE;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* PT0 is input, all the rest are unchanged */
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRH = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTH as input
&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set_Clock();
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWM0_ini(0x03,255,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; input_capture_initialize();
&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableInterrupts; /* clear I bit of CCR */
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set_point = PTH;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error &amp;gt; 8) error = 8;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error &amp;lt; -8) error = -8;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMDTY0 = 15*(error+8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Speed_RPM = frequency_actual*0.6666666;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Speed_RPM &amp;lt; 300) Speed_RPM = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Speed_RPM2 = (unsigned int)Speed_RPM/10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTB = Speed_RPM2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
void input_capture_initialize(void)
{
&amp;nbsp; TSCR1=0x90; /* enable timer and fast clear, rather than writing to bit0 of TFLG1 */
&amp;nbsp; TSCR2=0x82; /* prescale to 4&amp;nbsp; 6000000 pps, longest pulse width measured using*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; TIOS|=0xFE;&amp;nbsp; /* select input capture (all channels) */
&amp;nbsp; TCTL3=0x00; /* capture disabled on channels 4 to 7 */
&amp;nbsp; TCTL4=0x01; /*PORTT0 capture on rising edge, channels 1 to 3 disabled */
&amp;nbsp; TIE=0x01;&amp;nbsp;&amp;nbsp; /* enable timer interrupt on C0 */
&amp;nbsp; TFLG2=0x80;
}


void Set_Clock(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; CLKSEL &amp;amp;= 0x7F;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PLLCTL |= 0x40;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SYNR&amp;nbsp; = 0x05;
&amp;nbsp;&amp;nbsp;&amp;nbsp; REFDV = 0x01;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(0x08 &amp;amp; CRGFLG));
&amp;nbsp;&amp;nbsp;&amp;nbsp; CLKSEL |= 0x80;
}

void PWM0_ini(unsigned char prescale_factor, unsigned char period, unsigned char init_duty)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMPRCLK = prescale_factor; /* choose 8-bit PWM, set clock A prescaler to prescale_factor */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* choose clock A as clock source, PWM channel 0 output high
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at the beginning of the period */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMPOL = 0x01;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMCAE = 0x00; /* The next statements selects left-aligned */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMCTL = 0x80; /* halt PWM clock in wait mode */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMPER0 = period; /* set period of PWM0 to 0.1 ms */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* period in sec = 1/(bus clock / prescale_factor) * PWMPER0 */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* (PWMPER0-PWMDTY0)/PWMPER0*100% */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMDTY0 = init_duty; /* set duty cycle to (period-init_duty) /period *100% */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWME |= 0x01; /* enable PWM0 channel */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module.
Placement will be in NON_BANKED area. */
interrupt void TimerOverflow_ISR(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; TFLG2=0x80; /* clear Timer Interrupt Flag bit by a write*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i&amp;lt;500)
&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = 0xFF;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(i&amp;gt;500)
&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = 0x00;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 1000)
&amp;nbsp;&amp;nbsp;&amp;nbsp; i=0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 
}
#pragma CODE_SEG DEFAULT
&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 29 Oct 2020 09:27:29 GMT</pubDate>
    <dc:creator>MO_84</dc:creator>
    <dc:date>2020-10-29T09:27:29Z</dc:date>
    <item>
      <title>Multiple Interrupts</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178247#M6344</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have enabled the input capture interrupts on rising edge and its working fine.&lt;/P&gt;&lt;P&gt;I now want to add a second interrupt (Timer Overflow Interrupt). The initialization below works fine.&lt;/P&gt;&lt;P&gt;I'm having problems when I enable the timer over flow interrupt on the TSCR2 register by changing its value to TSCR2 = 0x82. I've tried stepping through the code and after a few steps, True time simulator looses connection with board and my PORTB LED's stop working.&lt;/P&gt;&lt;P&gt;If I change TSCR2 back to TSCR2 = 0x02; everything works fine again.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;void input_capture_initialize(void)
{
&amp;nbsp; TSCR1=0x90; /* enable timer and fast clear, rather than writing to bit0 of TFLG1 */
&amp;nbsp; TSCR2=0x02; /* prescale to 4&amp;nbsp; 6000000 pps, longest pulse width measured using*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; TIOS|=0xFE;&amp;nbsp; /* select input capture (all channels) */
&amp;nbsp; TCTL3=0x00; /* capture disabled on channels 4 to 7 */
&amp;nbsp; TCTL4=0x01; /*PORTT0 capture on rising edge, channels 1 to 3 disabled */
&amp;nbsp; TIE=0x01;&amp;nbsp;&amp;nbsp; /* enable timer interrupt on C0 */
&amp;nbsp; TFLG2=0x80;
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;I think i'm not initializing something properly and the problem is somewhere in the initialization of the above registers.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, here is the complete code (I don't expect anyone to go through it)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;#include &amp;lt;hidef.h&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* common defines and macros */
#include "derivative.h"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* derivative-specific definitions */

volatile unsigned int rising, frequency_int, set_point;
volatile unsigned int flag;
float actual_period, frequency, period, average, Speed_RPM=0, frequency_actual;
unsigned int old_TC0, x, count, Speed_RPM2=0, i=0;
volatile int error;

void Set_Clock(void);
void PWM0_ini(unsigned char prescale_factor, unsigned char period, unsigned char init_duty);

#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module.
Placement will be in NON_BANKED area. */

/* Interrupt on a rising edge of waveform connected to PT0 */
interrupt void toc0_isr(void)
{&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag ==0)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; old_TC0 = TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; period = x - old_TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; old_TC0 = TC0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; average += period;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count ++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (count == 20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; period = (average/20);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; average = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual_period = period/6000000;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frequency = 1/actual_period;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frequency_int = (unsigned int)frequency/100;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frequency_actual = (unsigned int)frequency;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTB = Speed_RPM2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; error = set_point - frequency_int;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; 
}
#pragma CODE_SEG DEFAULT

void input_capture_initialize(void); /* prototype to initialize input capture */

void main(void)
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRB = 0xFF;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTB as output since LEDs are connected to it
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRJ = 0xFF;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PTJ as output to control Dragon12+ LEDs
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRT = 0xFE;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* PT0 is input, all the rest are unchanged */
&amp;nbsp;&amp;nbsp;&amp;nbsp; DDRH = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTH as input
&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set_Clock();
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWM0_ini(0x03,255,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; input_capture_initialize();
&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableInterrupts; /* clear I bit of CCR */
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set_point = PTH;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error &amp;gt; 8) error = 8;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error &amp;lt; -8) error = -8;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMDTY0 = 15*(error+8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Speed_RPM = frequency_actual*0.6666666;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Speed_RPM &amp;lt; 300) Speed_RPM = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Speed_RPM2 = (unsigned int)Speed_RPM/10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTB = Speed_RPM2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
void input_capture_initialize(void)
{
&amp;nbsp; TSCR1=0x90; /* enable timer and fast clear, rather than writing to bit0 of TFLG1 */
&amp;nbsp; TSCR2=0x82; /* prescale to 4&amp;nbsp; 6000000 pps, longest pulse width measured using*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; TIOS|=0xFE;&amp;nbsp; /* select input capture (all channels) */
&amp;nbsp; TCTL3=0x00; /* capture disabled on channels 4 to 7 */
&amp;nbsp; TCTL4=0x01; /*PORTT0 capture on rising edge, channels 1 to 3 disabled */
&amp;nbsp; TIE=0x01;&amp;nbsp;&amp;nbsp; /* enable timer interrupt on C0 */
&amp;nbsp; TFLG2=0x80;
}


void Set_Clock(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; CLKSEL &amp;amp;= 0x7F;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PLLCTL |= 0x40;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SYNR&amp;nbsp; = 0x05;
&amp;nbsp;&amp;nbsp;&amp;nbsp; REFDV = 0x01;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(0x08 &amp;amp; CRGFLG));
&amp;nbsp;&amp;nbsp;&amp;nbsp; CLKSEL |= 0x80;
}

void PWM0_ini(unsigned char prescale_factor, unsigned char period, unsigned char init_duty)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMPRCLK = prescale_factor; /* choose 8-bit PWM, set clock A prescaler to prescale_factor */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* choose clock A as clock source, PWM channel 0 output high
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at the beginning of the period */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMPOL = 0x01;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMCAE = 0x00; /* The next statements selects left-aligned */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMCTL = 0x80; /* halt PWM clock in wait mode */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMPER0 = period; /* set period of PWM0 to 0.1 ms */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* period in sec = 1/(bus clock / prescale_factor) * PWMPER0 */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* (PWMPER0-PWMDTY0)/PWMPER0*100% */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWMDTY0 = init_duty; /* set duty cycle to (period-init_duty) /period *100% */
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWME |= 0x01; /* enable PWM0 channel */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module.
Placement will be in NON_BANKED area. */
interrupt void TimerOverflow_ISR(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; TFLG2=0x80; /* clear Timer Interrupt Flag bit by a write*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i&amp;lt;500)
&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = 0xFF;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(i&amp;gt;500)
&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = 0x00;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 1000)
&amp;nbsp;&amp;nbsp;&amp;nbsp; i=0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 
}
#pragma CODE_SEG DEFAULT
&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:27:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178247#M6344</guid>
      <dc:creator>MO_84</dc:creator>
      <dc:date>2020-10-29T09:27:29Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Interrupts</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178248#M6345</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;/* &lt;STRONG&gt;enable timer and fast clear&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;interrupt void TimerOverflow_ISR(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;TFLG2=0x80;&lt;/STRONG&gt; /* clear Timer Interrupt Flag bit by a write*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;^^ this won't clear overflow flag when TFFCA is set. You need to read or write TCNT to clear overflow flag.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 24 Jan 2011 14:41:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178248#M6345</guid>
      <dc:creator>kef</dc:creator>
      <dc:date>2011-01-24T14:41:41Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Interrupts</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178249#M6346</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;That was it.&lt;/P&gt;&lt;P&gt;Thank you Kef.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 26 Jan 2011 10:00:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Multiple-Interrupts/m-p/178249#M6346</guid>
      <dc:creator>MO_84</dc:creator>
      <dc:date>2011-01-26T10:00:31Z</dc:date>
    </item>
  </channel>
</rss>

