Introduction: MSP430 Seconds Counter
Welcome! Making of Seconds Counter: Using CCStudio 8 and MSP430F5529 for the project.
C language to code the micro controller. Applying Low Power Modes, Timers and Interrupts.The output is displayed via 7 Segment.
Step 1: Insight
Let's Begin!
Initialize the watchdog timer to OFF state using the required password for the watchdog timer (It helps to keep check of infinite loops , keeping the processor safe).
#include
/** * main.c */
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
return 0;
}
Step 2: Port Initialization
{
P3DIR=0xFF; // P3DIR=0x00;
P6DIR=0xFF;
P4DIR |=0x00;
P4REN |=0xFF;
P4OUT |=0xFF;
}
P3DIR |=0x00 tells us that the whole of PORT-3 is initialized to take inputs.
P3DIR |=0xFF tells us that the whole of PORT-3 is initialized to give outputs.
P3DIR |=0x01 only the pin P3.0 is initialized to output in PORT-3. This follows a Hexadecimal Port mapping.
P4REN |=0xFF , this indicates that the pins of PORT-4 have their pull up/down resistors enabled.
To select them between Pull UP or Pull DOWN, the instruction P$OUT |=0xFF is used.
If 0xFF is used they configure as Pull UP resistors and if 0x00 they configure as Pull DOWN.
Step 3: Ultra Low Power
MSP430F5529 allows us to reduce power loss from the processor. This is useful in standalone applications.
This calls for declaration of all pin or Ports to output.
{
P7DIR |= 0xFF;
P6DIR |= 0xFF;
P5DIR |= 0xFF;
P4DIR |= 0xFF;
P3DIR |= 0xFF;
P2DIR |= 0xFF;
P1DIR |= 0xFF;
}
Step 4: TIMER
Usage of timer for Delay generation of one second. This uses the SMCLK of 1MHz , also timer runs in Low power Mode (in the next step, after its count its interrupted from LPM). This process saves power and burden on the processor
TA0CCTL0=CCIE;
TA0CCR0=999;
TA0CTL = TASSEL_2 + MC_1;
Values is 999, as the takes one more count to roll back to zero in the timer register.
Step 5: Low Power Mode
_BIS_SR(LPM0_bits+GIE);
This enables General interrupt Enable (GIE), and puts the CPU to LPM0 , where MCLK that supports the cpu is off , and SMCLK and ACLK run that keeps the timer running. so we can see CPU is turned off , there by saving power.
Step 6: ISR-Timer
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
z++;
if(z>delay)
{
P3OUT=code[x];
P6OUT=code1[y];
x++;
if(x==10)
{
x=0;
y++;
}
if(y==6)
y=0;
z=0;
}
}
pragma vector is for ISR representation in C embd.
code[x] and code1[y] are the arrays that contain output values for the two seven segments, for displaying 60 seconds counter.
Step 7: Hardware Interrupt
P2DIR=0x00;
P2REN=0x02;
P2OUT=0x02;
P2IE |=BIT1 ;
P2IES |=BIT1 ;
P2IFG &= ~BIT1 ;
Here P2.1 is declared as a hardware interrupt, if the button is pressed , the counter resets to the value.
the rest program is written inside the ISR of this interrupt.
Step 8: ISR- Reset/ Push Button
#pragma vector=PORT2_VECTOR
__interrupt void port_2(void)
{
P2IFG &=~BIT1 ;
x=0; y=0;
P3OUT=code[x];
P6OUT=code1[y];
v++;
for(i=0;i
{
P1OUT |= BIT0; //P1.0 = toggle
__delay_cycles(1048576);
P1OUT &=~BIT0; // P1.0 = toggle
__delay_cycles(1048576);
}
This ISR resets the counter , and keeps a count on how many times the rest was pressed.
(Here is display is made via led toggle , can also use another array and timer , to show those values as output in 7 segment).
Step 9: CODE
#include
#define delay 1000
char code[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6};
char code1[]={0x7E,0x30,0x6D,0x79,0x33,0x5B};
volatile unsigned int x=0,y=0,z=0;
volatile unsigned int v=0,i=0;
void main()
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P7DIR |= 0xFF;
P7OUT |= 0x00;
P8DIR |= 0xFF;
P8OUT |= 0x00;
P4DIR |= 0xFF;
P4OUT |= 0x00;
P5DIR |= 0xFF;
P5OUT |= 0x00;
P1DIR=0xFF;
P3DIR=0xFF;
P6DIR=0xFF;
P2DIR=0x00;
P2REN=0x02;
P2OUT=0x02;
P2IE |=BIT1 ;
P2IES |=BIT1 ;
P2IFG &= ~BIT1 ;
TA0CCTL0=CCIE;
TA0CCR0=999;
TA0CTL = TASSEL_2 + MC_1;
_BIS_SR(LPM0_bits+GIE);
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
z++;
if(z>delay)
{
P3OUT=code[x];
P6OUT=code1[y];
x++;
if(x==10)
{
x=0;
y++;
}
if(y==6)
y=0;
z=0;
}
}
// Hardware interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void port_2(void)
{
P2IFG &=~BIT1 ;
x=0;
y=0;
P3OUT=code[x];
P6OUT=code1[y];
v++;
for(i=0;i
{
P1OUT |= BIT0; // P1.0 = toggle
__delay_cycles(1048576);
P1OUT &=~BIT0; // P1.0 = toggle
__delay_cycles(1048576);
}
}