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
/* 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;
}