MSP430 Seconds Counter
by AdiVivek in Circuits > Microcontrollers
4274 Views, 2 Favorites, 0 Comments
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.
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;
}
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.
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;
}
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.
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.
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.
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.
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).
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);
}
}