C example of using the USCI as a 9600 baud UART to communicate with the HC-06 bluetooth module for the MSP430F5529

From Class Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
/* This program asks you for the password, and then tells
 * you if you typed it right.  You need to set the bluetooth
 * terminal to send \r\n, at the end of a send.  The app
 * I used on my Android phone is from:
 * https://github.com/Sash0k/bluetooth-spp-terminal
 *
 * Originally from the textbook, modified for the MSP430F5529
 * by Rob Frohne 7/21/2015.
 *
 * The HC-06 bluetoooth module I used to test this is connected
 * to the +5V and GND on the launchpad.  The RXD of the HC-06 is
 * connected to P3.3 and TXD of the HC-06 is connected to P3.4.
 *
 * Note the changes to the interrupt as compared to the G2 Launchpad.
 */
#include <msp430.h>
#define RedLed BIT0
#define GreenLed BIT7
const char password[] = "12345"; //The Password
const char enter[] = "Enter Your Password\r\n";
const char correct[] = "Your password is correct\r\n";
const char incorrect[] = "Your password is incorrect\r\n";
const char reenter[] = "Please re-enter your password\r\n";
char input[100];
unsigned int RXByteCtr = 0;
int cnt = 0;
int inputlength, passwordlength;
int difference;
void transmit(const char *str);
int compare(const char *strin, const char *strpass);
int arraylength(const char *str);
int abs(int a);

/*
 * main.c
 */
void main(void)

{
	WDTCTL = WDTPW | WDTHOLD;
	/*	BCSCTL1 = CALBC1_1MHZ;//Adjust the clock
	 DCOCTL = CALDCO_1MHZ;*/
	P1DIR = RedLed; //Make P1.0 an output so we can use the red LED
	P4DIR = GreenLed; //Make P4.7 an output so we can use the red LED
	P1OUT &= ~RedLed;  //Clear the red LED
	P4OUT &= ~GreenLed;  //Clear the green LED

	P3SEL = BIT3 + BIT4;                        // P3.3,4 = USCI_A0 TXD/RXD
	UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
	UCA0CTL1 |= UCSSEL_2;                     // SMCLK
	UCA0BR0 = 6;                              // 1MHz 9600 (see User's Guide)
	UCA0BR1 = 0;                              // 1MHz 9600
	UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16;   // Modln UCBRSx=0, UCBRFx=0,
// over sampling
	UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
	transmit(enter);
	UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
	_enable_interrupts();
	while (1) {
		if (cnt == 1) {
			//Check if cnt is 1
			inputlength = arraylength(input);
			//Get your input length
			passwordlength = arraylength(password);
			//Get your password length
			{
				difference = compare(input, password);
			}
			//Compare the received password with your password
			if (difference == 0) {
				//Check if they match
				{
					transmit(correct);
				}
				//If they match, transmit correct string
				P1OUT &= ~RedLed;
				P4OUT |= GreenLed;
				//Turn on the green LED
				__delay_cycles(5000000);
				//Wait for 5 seconds
				P4OUT &= ~GreenLed;
				//WDTCTL = WDT_MRST_0_064; // Turns off the LED too.
				transmit(enter);
				//Reset the system
			} else {                         //If they do not match
				{
					transmit(incorrect);
				}
				//Transmit incorrect string
				P1OUT = RedLed;
				//Turn on the red LED
				__delay_cycles(2000000);
				//Wait for 2 seconds
				P4OUT &= ~RedLed;
				//Turn off the red LED
				{
					transmit(reenter);
				}
			}                         //Transmit reenter string
			cnt = 0;
			//Reset cnt
			RXByteCtr = 0;
		}
	}                         //Reset Receive Byte counter
}

//USCI A receiver interrupt
// The stuff immediately below is to make it compatible with GCC, TI or IAR
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{	//Check if the UCA0RXBUF is different from 0x0A
//(Enter key from keyboard)
	if(UCA0RXBUF != 0x0A) input[RXByteCtr++] = UCA0RXBUF;
//If it is, load received character
//to current input string element
	else {cnt = 1;
		//If it is not, set cnt
		input[RXByteCtr-1] = 0;
	}	//Add null character at the end of input string (on the /r)
}
void transmit(const char *str) {
	while (*str != 0) {	//Do this during current element is not
		//equal to null character
		while (!(UCTXIFG & UCA0IFG))
			;
		//Ensure that transmit interrupt flag is set
		UCA0TXBUF = *str++;
		//Load UCA0TXBUF with current string element
	}		//then go to the next element
}

int max(int a, int b) {
	if (a > b)
		return a;
	else
		return b;
} // Find the max between two numbers.

int compare(const char *strin, const char *strpass) {
	int i = 0;
	int result = 0; //Clear result
	int len = max((passwordlength), inputlength);
	for (i = len; i > 0; i--) {
		result = result + abs((*strin++) - (*strpass++));
	}  // abs used to make sure differences don't cancel
	return result;
}  //Return result value

int arraylength(const char *str) {
	int length = 0;
	//Clear length
	while (*str != 0) {
		//Until null character is reached
		str++;
		//Increase array address
		length++;
	}	//Increase length value
	return length;
}	//Return length value

int abs(int a) {
	if (a < 0)
		a = -a;
	return a;
}