Quantcast
Channel: MSP430 Technical Forums
Viewing all articles
Browse latest Browse all 2077

Newbie having problems with interrupts and inputs.

$
0
0

Hello, 

 

I am basically new to msp430 and CCS, and I am having a hard time trying to understand code, interrupts and timers.

 

Background info:

 

Goal.- read and interpret a dual 7 segment LED display with 10 pins.

 

So after playing around with this part I found out that the way this works is the driver pins (9, 6) toggle each other really fast ~4khz, 9 is on while 6 is of etc.

My idea was to use the MSP430G2553 to read  A-G on PORT1 and the 2 drivers (9, 6) on PORT2. 

 

I read on interrupts and saw that there is a way to set up an interrupt for when your input signal (in this case 9 or 6 on the diagram) goes from high to low or low to high.

 

SO if I could read all A-G segments when 9 is "on" it would correspond to digit 1, when 9 goes to "off" and 6 turns "on" i would read all A-G segments again and that would correspond to digit 2... I thought it would be easy but apparently there is a lot that I am overlooking.

 

Here is my attempt to code: (worked from an example from TI Resource Explorer)

#include <msp430.h>
volatile int flag = 0;

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                  // Stop Watchdog timer

	if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
	{
	  while(1);						//trap for the Digitally controlled O.
	}

	BCSCTL1 = CALBC1_1MHZ;					//set range for the O.
	DCOCTL = CALDCO_1MHZ;					//set DCO step  modulation 1MHZ

	P1DIR = 0; 						// Set P1.0 - P1.7 as input
	P2DIR = 0XF9; 						// set P2.1 AND P2.2 as inputs
	P2OUT = BIT4;						// set P2.4 to start as on
	P2IE |= BIT2; 						// P2.2 interrupt enabled
	P2IES = 1;						// Flag is set with a high-to-low transition 

	P2IFG &= ~BIT2; 						// P2.2 interrupt flag cleared

	__bis_SR_register(GIE);					 // Enable all interrupts

   while(1) //Loop forever
   {
   }
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
	if(P1IN == 0x79)  					//check if P1IN= 01111001 means, p1.0=1, p1.1=0, p1.2=0, p1.3=1... etc
			     {
			     	P2OUT = 0;  			// turn off bit 4 on port 2 (added to see if i recognize 01111001)
			     }
    P2IFG &= ~BIT2; // P2.1 interrupt flag cleared
}

I am attempting to read all inputs in PORT1 and check if they match 01111001 which corresponds to the digit displaying "1" inverted so my zeros mean the segment is "on"

so for example if i wanted to display "7" segments a, b, and c should be 0 the rest 1. or (01111000) I am ignoring the DP.

 

 

The code compiles but my LED at BIT4  never turns off which means the interrupt is never happening?

 

 

Any feedback is very much appreciated.

 

 

 

 

 

 

Attached Thumbnails

  • Capture.PNG
  • download.jpg

Viewing all articles
Browse latest Browse all 2077

Trending Articles