2023-01-14 05:13:45 +00:00
|
|
|
/*
|
|
|
|
* Author: Jake Goodwin
|
|
|
|
* Date: 2023
|
|
|
|
* Description: Small library to communicate with the AT-09 bluetooth module.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <avr/io.h>
|
|
|
|
#include <avr/interrupt.h>
|
|
|
|
#include <avr/sleep.h>
|
2023-01-14 20:59:34 +00:00
|
|
|
#include <stdint.h>
|
2023-01-14 05:13:45 +00:00
|
|
|
#include <util/delay.h>
|
2023-01-14 06:47:43 +00:00
|
|
|
#include "avr_usart.h"
|
2023-01-14 05:13:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
//#############################
|
|
|
|
//Globals
|
|
|
|
//#############################
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
|
|
|
led_blink();
|
|
|
|
led_blink();
|
|
|
|
led_blink();
|
|
|
|
_delay_ms(1000);
|
2023-01-14 06:47:43 +00:00
|
|
|
_delay_ms(1000);
|
2023-01-14 05:13:45 +00:00
|
|
|
|
|
|
|
init_usart0();
|
|
|
|
|
|
|
|
//enable interrupts
|
|
|
|
sei();
|
|
|
|
|
2023-01-14 19:51:31 +00:00
|
|
|
uint8_t buf_len = 12;
|
2023-01-14 20:03:16 +00:00
|
|
|
//unsigned char data[12] = "snd 12chars\0";
|
2023-01-14 20:59:34 +00:00
|
|
|
//unsigned char data[1] = "A";
|
2023-01-14 21:26:11 +00:00
|
|
|
unsigned char data[1] = "B";
|
2023-01-14 06:47:43 +00:00
|
|
|
|
2023-01-14 05:13:45 +00:00
|
|
|
while(1) {
|
2023-01-14 20:59:34 +00:00
|
|
|
//serial0_write(data, buf_len);
|
2023-01-14 21:26:11 +00:00
|
|
|
if(data[0] == 0) {
|
|
|
|
data[0] = '!';
|
|
|
|
}
|
|
|
|
tx_usart0(data[0]);
|
2023-01-14 20:59:34 +00:00
|
|
|
//serial0_read(data, buf_len);
|
|
|
|
//data = rx_usart0();
|
|
|
|
serial0_flush_rxbuf();
|
2023-01-14 21:26:11 +00:00
|
|
|
serial0_read_with_err_checking(data, 1);
|
2023-01-14 05:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#############################
|
|
|
|
//FUNCTIONS
|
|
|
|
//#############################
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Input: None
|
|
|
|
* Output: None
|
|
|
|
* Description: init usart0 hardware in async mode
|
|
|
|
*/
|
|
|
|
void init_usart0(void) {
|
2023-01-14 06:47:43 +00:00
|
|
|
//DDRB |= (1<<TX_DDR)|(0<<RX_DDR);
|
|
|
|
//PORTD |= (0<<TX_PIN)|(0<<RX_PIN);
|
2023-01-14 05:13:45 +00:00
|
|
|
|
|
|
|
//setup stuff for usart communications.
|
|
|
|
|
2023-01-14 06:47:43 +00:00
|
|
|
//set baud rate, this is 9600Baud with a 8Mhz clock
|
|
|
|
//UBRR0H |= (uint8_t) (BT_UBRR>>8);
|
|
|
|
//UBRR0L |= (uint8_t) BT_UBRR;
|
|
|
|
UBRR0H |= (uint8_t) (0x33>>8);
|
|
|
|
UBRR0L |= (uint8_t) 0x33;
|
|
|
|
|
2023-01-14 05:13:45 +00:00
|
|
|
//Enable recv and Transmit pins, overrides other uses.
|
|
|
|
//IN the usart control and status register 0B
|
|
|
|
UCSR0B = (1<<RXEN0) | (1<<TXEN0);
|
|
|
|
|
|
|
|
//setting the data frame format
|
|
|
|
//We leave the 2MSB zero for async serial. And we also don't enable
|
|
|
|
//parity bits for now. We set a 2bit stop bit and 8bit char size.
|
2023-01-14 21:26:11 +00:00
|
|
|
//UCSR0C = (1<<USBS0) | (3<<UCSZ00);
|
|
|
|
UCSR0C = (1<<USBS0) | (1<<UCSZ00) | (1<<UCSZ01) | (0<<UCSZ02);
|
2023-01-14 05:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Input: a 8bit char
|
|
|
|
* Output: None
|
|
|
|
* Description: Sends a char over usart0
|
|
|
|
*/
|
|
|
|
void tx_usart0(unsigned char data) {
|
|
|
|
//first wait for the transmit buffer to be empty
|
|
|
|
while(!(UCSR0A & (1<<UDRE0))) {
|
|
|
|
;//Equiv of continue
|
|
|
|
}
|
|
|
|
|
|
|
|
//now that it's empty, fill buffer with TX data.
|
|
|
|
UDR0 = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Input:None
|
|
|
|
* Output: a 8bit char
|
|
|
|
* Description: Recvs a char over usart0
|
|
|
|
*/
|
|
|
|
unsigned char rx_usart0(void) {
|
|
|
|
//first wait for the data to be received.
|
2023-01-14 20:59:34 +00:00
|
|
|
while( !(UCSR0A & (1<<RXC0)) ) {
|
2023-01-14 05:13:45 +00:00
|
|
|
;//Equiv of continue
|
|
|
|
}
|
|
|
|
|
|
|
|
//now return the data
|
2023-01-14 20:59:34 +00:00
|
|
|
return UDR0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void serial0_flush_rxbuf(void) {
|
|
|
|
uint8_t none;
|
2023-01-14 21:26:11 +00:00
|
|
|
while( UCSR0A & (1<<RXC0)) {
|
|
|
|
none = UDR0;
|
|
|
|
}
|
2023-01-14 05:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-01-14 19:36:13 +00:00
|
|
|
/*
|
|
|
|
* Inupt: None
|
|
|
|
* Output: None
|
2023-01-14 19:46:29 +00:00
|
|
|
* Description: Nothing right now.
|
2023-01-14 19:36:13 +00:00
|
|
|
*/
|
2023-01-14 19:46:29 +00:00
|
|
|
void serial0_enable_timeouts(uint8_t ms) {
|
|
|
|
;
|
|
|
|
}
|
2023-01-14 19:36:13 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Inupt: None
|
|
|
|
* Output: None
|
|
|
|
* Description:
|
|
|
|
*/
|
2023-01-14 20:03:16 +00:00
|
|
|
void serial0_write(unsigned char* buffer, uint8_t write_length) {
|
2023-01-14 19:44:48 +00:00
|
|
|
for(uint8_t i = 0; i < write_length; i++) {
|
|
|
|
tx_usart0(buffer[i]);
|
|
|
|
}
|
|
|
|
}
|
2023-01-14 19:36:13 +00:00
|
|
|
|
|
|
|
/*
|
2023-01-14 19:41:11 +00:00
|
|
|
* Inupt: A serialbuffer and length
|
2023-01-14 19:36:13 +00:00
|
|
|
* Output: None
|
2023-01-14 19:41:11 +00:00
|
|
|
* Description: Reads the serial data into a buffer of x length.
|
2023-01-14 19:36:13 +00:00
|
|
|
*/
|
2023-01-14 20:03:16 +00:00
|
|
|
void serial0_read(unsigned char* buffer, uint8_t buf_length) {
|
|
|
|
//clear buffer out?
|
2023-01-14 20:59:34 +00:00
|
|
|
//buffer = 0;
|
2023-01-14 19:41:11 +00:00
|
|
|
for(uint8_t i = 0; i < buf_length; i++) {
|
|
|
|
buffer[i] = rx_usart0();
|
|
|
|
}
|
|
|
|
}
|
2023-01-14 19:36:13 +00:00
|
|
|
|
|
|
|
|
2023-01-14 20:59:34 +00:00
|
|
|
/*
|
|
|
|
* Inupt: A serialbuffer and length
|
|
|
|
* Output: None
|
|
|
|
* Description: Reads the serial data into a buffer of x length,
|
|
|
|
* it does error checking from the register first.
|
|
|
|
*/
|
|
|
|
void serial0_read_with_err_checking(unsigned char* buffer, uint8_t buf_length) {
|
|
|
|
//first wait for the data to be received.
|
|
|
|
while( !(UCSR0A & (1<<RXC0)) ) {
|
|
|
|
;//Equiv of continue
|
|
|
|
}
|
|
|
|
|
|
|
|
//check for errors in the register.
|
|
|
|
//Check for frame error.
|
|
|
|
if(UCSR0A & (1<<FE0)) {
|
|
|
|
led_blink();
|
|
|
|
}
|
|
|
|
//check for data over-run
|
|
|
|
else if(UCSR0A & (1<<DOR0)) {
|
|
|
|
led_blink();
|
|
|
|
led_blink();
|
|
|
|
}
|
|
|
|
//check for parity error
|
|
|
|
else if(UCSR0A & (1<<UPE0)) {
|
|
|
|
led_blink();
|
|
|
|
led_blink();
|
|
|
|
led_blink();
|
|
|
|
}
|
|
|
|
|
|
|
|
//now return the data
|
|
|
|
buffer[0] = UDR0;
|
|
|
|
}
|
|
|
|
|
2023-01-14 19:36:13 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Inupt: BUAD RATE as uint8_t
|
|
|
|
* Output: None
|
|
|
|
* Description: Sets the baud rate of the serial usart0
|
|
|
|
* VALUES @ 1Mhz:
|
|
|
|
* 207 --> 300bps
|
|
|
|
* 103 --> 600bps
|
|
|
|
* 51 --> 1200bps
|
|
|
|
* 25 --> 2400bps
|
|
|
|
* 12 --> 4800bps
|
|
|
|
* 6 --> 9600bps !!! 7% error rate
|
|
|
|
*/
|
|
|
|
|
2023-01-14 20:03:16 +00:00
|
|
|
void serial0_set_baud(uint8_t baud) {
|
2023-01-14 19:36:13 +00:00
|
|
|
UBRR0H |= (uint8_t) (baud>>8);
|
|
|
|
UBRR0L |= (uint8_t) baud;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-01-14 05:13:45 +00:00
|
|
|
/*
|
|
|
|
* Input: None
|
|
|
|
* Output: None
|
|
|
|
* Description: Toggles the pin for the LED indicator.
|
|
|
|
*/
|
|
|
|
static void led_blink(void) {
|
|
|
|
//Set the DDR for output.
|
|
|
|
DDRC |= (1<<LED_PIN);
|
|
|
|
|
|
|
|
PORTC ^= (1<<LED_PIN);
|
|
|
|
_delay_ms(250);
|
|
|
|
PORTC ^= (1<<LED_PIN);
|
|
|
|
_delay_ms(250);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|