Other Parts Discussed in Thread: ENERGIA
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; } }