Hello,
I have made the program in which i used timer to generate the pulse.
but now i don't want to use timer instead i want to use counter.
I have to generate the output pulse when my input counter is more than 200. if it is less than 200, don't want to generate the pulse.
I am pasting here my code, help me to generate the output pulse when input pulse is more than 200
input is in pin1.0 and output is from pin 2.0, pin 2.1, pin 2.2.
I am using msp430g2553 launchpad
#include "msp430G2553.h"
#include "stdint.h"
volatile uint16_t down_counter; // Variable for counting down
volatile uint8_t output_control = 0; // Variable controls output activity
volatile uint8_t input_state = 0; // Variable holds actual input state
volatile uint8_t counter = 0;
void main( void )
{
WDTCTL = (WDTPW | WDTHOLD); // Stop watchdog timer
#if defined(CALBC1_16MHZ_) && F_CPU >= 16000000L
BCSCTL1 = CALBC1_16MHZ; // Set range
DCOCTL = CALDCO_16MHZ; // Set DCO step and modulation
#endif
P2REN |= BIT4; // Enable resistor for P2.4
P2OUT |= (BIT0 | BIT1 | BIT2 | BIT4); // P2.0/1/2 high, pull-up resistor for P2.4
P2DIR |= (BIT0 | BIT1 | BIT2); // P2.0/1/2 to output direction
P2IES |= BIT4; // Interrupt on high->low transition
P2IFG &= ~BIT4; // Clear P2.4 IFG
P2IE |= BIT4; // Enable interrupts for P2.4
TA0CCR0 = 2000; // Timer value for 2ms interrupt
TA0CCTL0 = CCIE; // Enable compare interrupt
TA0CTL = (TASSEL_2 | ID_0 | MC_2 | TACLR); // SMCLK, divider 1, continuous mode, clear
// Input emulation
P1OUT |= BIT0; // P1.0 high
P1DIR |= BIT0; // P1.0 output - emulates output of sensor
TA1CCR0 = 62500; // Timer value for 500ms interrupt 62500
TA1CCTL0 = CCIE; // Enable compare interrupt
TA1CTL = (TASSEL_2 | ID_3 | MC_2 | TACLR); // SMCLK, divider 8, continuous mode, clear
// Input emulation
__bis_SR_register( GIE ); // Enable global interrupts
while( 1 ) // Main program
{
}
}
// Input emulation
// Timer 1 A0 interrupt service routine
#pragma vector = TIMER1_A0_VECTOR
__interrupt void Timer1_A0_ISR( void )
{
static uint8_t timer_state = 0; // Variable holds actual timer state
static uint8_t multiplier = 0; // Variable to extend timer interval
TA1CCR0 += 2000; // Timer value for next interrupt in 2ms
switch( timer_state ) // Determine actual timer state
{
case 0: // Delay between pulses
{
if( ++multiplier < 2 ) // Not 1s elapsed yet
{
TA1CCR0 += 62500; // Add 500ms 62500
}
else // 1s elapsed
{
TA1CCR0 += 12500; // Add 100ms 12500
P1OUT &= ~BIT0; // P1.0 low
multiplier = 0; // Reset multiplier
timer_state++; // Increment timer state
}
break;
}
case 1: // Signal was low for 100ms
{
TA1CCR0 += 50000; // Add 400ms 50000
P1OUT |= BIT0; // P1.0 high
timer_state++; // Increment timer state
break;
}
case 2: // Signal was high for 400ms
{
TA1CCR0 += 12500; // Add 100ms 12500
P1OUT &= ~BIT0; // P1.0 low
timer_state++; // Increment timer state
break;
}
case 3: // Signal was low for 100ms
{
TA1CCR0 += 62500; // Add 500ms 62500
P1OUT |= BIT0; // P1.0 high
timer_state = 0; // Reset timer state
break;
}
}
}
// Input emulation
// Timer 0 A0 interrupt service routine
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR( void )
{
static uint8_t state = 0; // Variable holds actual output state
// TA0CCR0 += 2000; // Timer value for next interrupt in 2ms
if(counter>200)
{
output_control = 1;
}
else
{
output_control = 0;
}
if( output_control = 1 ) // Test if down counter became 0 now
{
input_state = 0; // Reset input state
P2IE &= ~BIT4; // Disable interrupts for P2.4
P2IES |= BIT4; // Interrupt on high->low transition
P2IFG &= ~BIT4; // Clear P2.4 IFG
P2IE |= BIT4; // Enable interrupts for P2.4
}
if( output_control == 1 ) // Test if output is active
{
switch( state )
{
case 0: // State 0
{
P2OUT |= BIT2; // Set P2.2 high
P2OUT &= ~BIT0;
break;
}
case 1: // State 1
{
P2OUT |= BIT0; // Set P2.0 high
P2OUT &= ~BIT1; // Set P2.1 low
break;
}
case 2: // State 2
{
P2OUT |= BIT1; // Set P2.1 high
P2OUT &= ~BIT2; // Set P2.2 low
break;
}
}
if( ++state >= 3 ) // Increment state and test if >= 3
{
state = 0; // Reset state to 0
}
else (output_control == 0);
{
}
}
}
// Port 2 interrupt service routine
#pragma vector = PORT2_VECTOR
__interrupt void Port2_ISR( void )
{
switch( input_state ) // Determine actual input state
{
case 0: // State 0: High->low transition of first pulse
{
down_counter = 60; // Timeout of 120ms 60
input_state++; // Increment input state
P2IES &= ~BIT4; // Interrupt on low->high transition
break;
}
case 1: // State 1: Low->high transition of first pulse
{
down_counter = 225; // Timeout of 450ms 225
input_state++; // Increment input state
P2IES |= BIT4; // Interrupt on high->low transition
break;
}
case 2: // State 2: High->low transition of second pulse
{
down_counter = 60; // Timeout of 120ms 60
input_state++; // Increment input state
P2IES &= ~BIT4; // Interrupt on low->high transition
break;
}
case 3: // State 3: Low->high transition of second pulse
{
P2IES |= BIT4; // Interrupt on high->low transition
output_control = 1; // Activate output
P2IE &= ~BIT4; // Disable interrupts for P2.4
input_state = 0; // Reset input state
break;
}
}
P2IFG &= ~BIT4; // Clear P2.4 IFG
}