Part Number:MSP430G2553
Tool/software: Code Composer Studio
Hello!
I have a trouble with my MSP.
Display's kathodes have direct connection to uC. Only Anodes have resistors.|
Problem: Timer doesn't count.
After upload a soft, there are four digits with all leds on (except dots) - there are four eights like : 8 8 8 8.
Nothing happened at all.
Under Debug session I can see, that program stops on while(1)...
I was trying many different codes, but still no effect.
I have no warnings at all, no troubles, no problems.
What is wrong with code?
Thanks in advance for help.
DETAILS:
Connection (Common anodes A-5649 display) looks like:
P1.0 - segm. A
P1.1 - segm. B
P1.2 - segm. C
P1.3 - Button - useless now...
P1.4 - segm. D
P1.5 - segm. E
P1.6 - segm. F
P1.7 - segm. G
P2.0 - Digit 0 //via resistor 220 ohm
P2.1 - Digit 1 //via resistor 220 ohm
P2.2 - Digit 2 //via resistor 220 ohm
P2.3 - Digit 3 //via resistor 220 ohm
P2.4 - segm. DP
CODE:
#include <msp430.h>
#define a 0x01 //00 0000 0000 0001
#define b 0x02 //00 0000 0000 0010
#define c 0x04 //00 0000 0000 0100
#define d 0x10 //00 0000 0000 1000
#define e 0x20 //00 0000 0001 0000
#define f 0x40 //00 0000 0010 0000
#define g 0x80 //00 0001 0000 0000
#define Dig_1 0x01 //P2.0
#define Dig_2 0x02 //P2.1
#define Dig_3 0x04 //P2.2
#define Dig_4 0x08 //P2.3
#define DP 0x10 //P2.4
//#define S2 0x20 //Button 2 P2.5
//#define S1 0x03 //Button 1 P1.3
int display_min[]={a+b+c+d+e+f, b+c, a+b+d+e+g, a+b+c+d+g, b+c+f+g, a+c+d+f+g, a+c+d+e+f+g, a+b+c, a+b+c+d+e+f+g, a+b+c+d+f+g};
int display_hour[]={a+b+c+d+e+f, b+c, a+b+d+e+g, a+b+c+d+g, b+c+f+g, a+c+d+f+g, a+c+d+e+f+g, a+b+c, a+b+c+d+e+f+g, a+b+c+d+f+g};
//clock variables
volatile unsigned int j;
volatile unsigned int TI_second = 0;
volatile unsigned int TI_minute = 0;
volatile unsigned int TI_hour = 0;
volatile unsigned int LoopCtr1;
volatile unsigned int dig_num = 0;
unsigned int flag_dp = 0x01;
void Get_time(void)
{
j++;
if (j==20) //50mS * 20 = 1sec.
{
j=0;
// P2OUT ^= DP;
TI_second++;
flag_dp = 1;
if (TI_second==60)
{
TI_second = 0;
TI_minute++;
if (TI_minute==60)
{
TI_minute = 0;
TI_hour++;
if (TI_hour==24)
{
TI_hour = 0;
}
}
}
}
}
void Display_time(void)
{
switch( dig_num )
{
case 0:
{
P1OUT = display_min[TI_minute/10]; //load first digit for minutes
P2OUT |= BIT0; //set dig#0
P2OUT &= ~0x0E; //clear dig#1, 2, 3
dig_num = 1;
}
break;
case 1:
{
P1OUT = display_min[TI_minute%10]; //load second digit for minutes
P2OUT |= BIT1; //set dig#1
P2OUT &= ~0x0D; //clear dig#0, 2, 3
if(flag_dp == 1)
{
flag_dp = 0;
P2OUT ^= DP;
}
dig_num = 2;
}
break;
case 2:
{
P1OUT = display_hour[TI_hour/10]; //load first digit for hours
P2OUT |= BIT2; //set dig#2
P2OUT &= ~0x0B; //clear dig#0, 1, 3
dig_num = 3;
}
break;
case 3:
{
P1OUT = display_hour[TI_hour%10]; //load second digit for hours
P2OUT |= BIT3; //set P2.3 - dig#3
P2OUT &= ~0x07; //clear dig#0, 1, 2
dig_num = 0;
}
break;
}
}
int main(void)
{
//initialization
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//----mcu clock settings------------------------------------------------------
DCOCTL=0x00;
BCSCTL1=0xC0;
BCSCTL2=0xC0; //MCLK source = LFXT1CLK
BCSCTL1 = XT2OFF + XTS + DIVA_0; // f/8
BCSCTL2 = SELM_3 | SELS | DIVS_3;
//----Ports settings----------------------------------------------------------
P1OUT = 0x00;
P2OUT = 0x1F;
P1DIR = 0xF7; // Set P1 Output dir Exclude Button S1
P2DIR = 0x1F; // Set P2 Output dir Exclude Button S2
//----TimerA settings---------------------------------------------------------
TA0CCTL1 |= CCIE; // CCR0 interrupt enabled
TA0CCTL2 |= CCIE; // CCR1 interrupt enabled
TA0CTL = TASSEL_1 + ID_3 + MC_2 + TAIE; // TimerA = ACLK!!!, 1:8, upmode, int enable
TA0CCR1 = 50000;
TA0CCR2 = 5000;
//---Interrupts settings--------------------------------------------------------
_EINT();
//---Variables settings---------------------------------------------------------
dig_num = 0;
//_BIS_SR(CPUOFF + GIE); // Enter LPM0 w/ interrupt
while(1)
{} // Infinity loop
} // end main
// Timer 0 A1 interrupt service routine
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR( void )
{
switch( TAIV )
{
case 2: // CCR1
{
TA0CCTL1 &= ~CCIFG;
Get_time();
TA0CCR1 += 50000; // Add Offset to CCR1
}
break;
case 4: // CCR2
{
TA0CCTL2 &= ~CCIFG;
Display_time();
TA0CCR2 += 5000;
}
break;
case 10:
break;
}
}