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

From Class Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
<nowiki>/* This program asks you for the password, and then tells
<nowiki>
/* This program asks you for the password, and then tells
* you if you typed it right. You need to set the bluetooth
* 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
* terminal to send \r\n, at the end of a send. The app
Line 173: Line 171:
return a;
return a;
}
}



<\nowiki>
<\nowiki>

Revision as of 11:45, 29 November 2016

<nowiki>/* 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.
*/
  1. include <msp430.h>
  2. define RedLed BIT0
  3. 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

  1. if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  2. pragma vector=USCI_A0_VECTOR

__interrupt void USCI_A0_ISR(void)

  1. elif defined(__GNUC__)

void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)

  1. else
  2. error Compiler not supported!
  3. 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; }

<\nowiki>