Sometimes we often face situations like lesser GPIO pins when working on “peripheral optimized” microcontrollers like MSP430 which offer a perfect balance of cost to feature ratio. The MSP430G2231 which comes with the older version of launchpad (v 1.4) has 8 I/O on Port1 and the datasheet also says that the crystal pins(XIN and XOUT) can be used as I/O with an interrupt capability but there was a lot of ambiguity on how to actually use these pins as I/O.
Even the user`s guide which is very lucid and clear on all peripherals does not mention the way to use it. After failed searches over the web for the correct way to use them..I started experimenting with the launchpad to find it out.
I figured out that by default the pins for the crystal are initialized in the ” Reserved ” mode as mentioned in the user guide:
Its just a simple job but it took me sometime to figure it out.. 😀
So, now all you need to do is clear the PxSEL2 bit and what you get in return is a generous gift of two extra I/O`s. This is “critically” useful while interfacing 7segs using standard multiplexing techniques .
The code is given here as follows:
Using Crystal Pins as IO
author: Rohit Gupta
Email: rohit7gupta [at] gmail [dot] com
Compiler: Code Composer Studio on Windows 7 64bit Machine
Copyright (C) <2013> <Rohit Gupta>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
void delay_ms(unsigned int ms )
unsigned int i;
for (i = 0; i<= ms; i++)
__delay_cycles(1000); //Built-in function that suspends the execution for 1000 cycles
WDTCTL = WDTPW + WDTHOLD; //Stop the watchdog..bow..boww
P2SEL&=~(1<<7); //Clear the SEL bit to enable use as a IO pin
P2DIR|=(1<<7); //Output at pin2.7
P2OUT&=~(1<<7); //Turn On LED on Pin 2.7
They youtube video is being uploaded to see this in action.
So, Go ahead and grab those extra I/O`s being left unused :D.
Happy New Year 2013!