// // hello.bluetooth.c // // 16E5 dac // #include #include #include #define output(directions,pin) (directions |= pin) // set port direction for output #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define bit_delay_time 8.5 // bit delay for 115200 with overhead #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay #define char_delay() _delay_ms(10) // char delay #define VPORTA VPORT0 // pre-mapped virtual port A #define VPORTC VPORT1 // pre-mapped virtual port C #define VPORTD VPORT2 // pre-mapped virtual port D #define VPORTR VPORT3 // pre-mapped virtual port R #define serial_port VPORT2.OUT #define serial_direction VPORT2.DIR #define serial_pins VPORT2.IN #define serial_pin_in PIN6_bm //RX #define serial_pin_out PIN7_bm //TX #define blue_port VPORT1.OUT #define blue_direction VPORT1.DIR #define blue_pins VPORT1.IN #define blue_pin_in PIN2_bm //RX #define blue_pin_out PIN3_bm //TX #define max_buffer 25 void setUpSerialBT() { // // Configure UART // // Baud rate selection for 115200 // BSEL = (32000000 / (2^-7 * 16*115200) -1 = 221.22 -> BSCALE = 2221 // FBAUD = ( (32000000)/(2^-7*16(2221+1)) = 115212.0 -> it's alright USARTC0_BAUDCTRLB = 0b11010000;// BSCALE OF -3: 0011->1100->1101 ->D with 0.1% error, see p. 292 USARTC0_BAUDCTRLA = 0x83;// BSEL OF 131, which is 83 in hex //Disable interrupts, just for safety USARTC0_CTRLA = 0; //8 data bits, no parity and 1 stop bit USARTC0_CTRLC = USART_CHSIZE_8BIT_gc; //Enable receive and transmit USARTC0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode /* //pins PC3 and PC2 of port c (for the bluetooth) */ PORTC_OUTSET = blue_pin_out; //Let's make PC3 as TX PORTC_DIRSET = blue_pin_out; //TX pin as output PORTC_OUTCLR = blue_pin_in; PORTC_DIRCLR = blue_pin_in; //PC2 as RX } void setUpSerialCable() { // // Configure UART // // Baud rate selection for 115200 // BSEL = (32000000 / (2^-7 * 16*115200) -1 = 221.22 -> BSCALE = 2221 // FBAUD = ( (32000000)/(2^-7*16(2221+1)) = 115212.0 -> it's alright USARTD0_BAUDCTRLB = 0b11010000;// BSCALE OF -3: 0011->1100->1101 ->D with 0.1% error, see p. 292 USARTD0_BAUDCTRLA = 0x83;// BSEL OF 131, which is 83 in hex //Disable interrupts, just for safety USARTD0_CTRLA = 0; //8 data bits, no parity and 1 stop bit USARTD0_CTRLC = USART_CHSIZE_8BIT_gc; //Enable receive and transmit USARTD0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode /* //pins PD6 and PD7 of port d (for the cable) */ PORTD_REMAP |= 0b00011100; //See page 152 in datasheet, remaps the USART0 from 2,3 to 6,7 PORTD_OUTSET = serial_pin_out; //Let's make PD7 as TX PORTD_DIRSET = serial_pin_out; //TX pin as output PORTD_OUTCLR = serial_pin_in; PORTD_DIRCLR = serial_pin_in; //PD6 as RX } void sendCharBT(char c) { while( !(USARTC0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty USARTC0_DATA = c; } void sendStringBT(char *text) { while(*text) { sendCharBT(*text++); } } void sendCharCable(char c) { while( !(USARTD0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty USARTD0_DATA = c; } void sendStringCable(char *text) { while(*text) { sendCharCable(*text++); //Remove this when not needed } } char usart_receiveByteBT() { while( !(USARTC0_STATUS & USART_RXCIF_bm) ); return USARTC0_DATA; } void receiveStringBT(char* c) { int maxlength=max_buffer; int i=0; while (USARTC0_STATUS & USART_RXCIF_bm) { c[i]=USARTC0_DATA;//Remove this when not needed if ((c[i]=="\r") || (i==maxlength)) { break; } i++; } c[i]=0; } int main(void) { // static char chr; static char buffer[max_buffer] = {0}; // uint8_t btconnect=0; // // set up clock // OSC.CTRL = OSC_RC32MEN_bm; // enable 32MHz clock while (!(OSC.STATUS & OSC_RC32MRDY_bm)); // wait for clock to be ready CCP = CCP_IOREG_gc; // enable protected register change CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // switch to 32MHz clock setUpSerialBT(); setUpSerialCable(); sendStringCable("\r"); sendStringBT("$$$"); char_delay(); sendStringBT("\r"); char_delay(); sendStringBT("+\r"); char_delay(); sendStringBT("SS,C0\r"); char_delay(); sendStringBT("R,1\r"); char_delay(); while(1) { // _delay_ms(500); receiveStringBT(buffer); sendStringCable(buffer); if (strncmp("hi",buffer, 1)==0) { sendStringBT("Hi, how are you?\r"); } } }