#ifndef _UART_H_ #define _UART_H_ // Helpful defines #define uart_buffer r_buffer #define uart_ready r_ready // RXC ISR variables unsigned char r_index; // current string index unsigned char r_buffer[16]; // input string unsigned char r_ready; // flag for receive done unsigned char r_char; // current character // TX ISR variables // Set up a circular buffer to output the strings to #ifndef TRANSMIT_BUFFER_SIZE #define TRANSMIT_BUFFER_SIZE 21 #endif unsigned char t_index; // current string index unsigned char t_end; // index of end unsigned char t_buffer[TRANSMIT_BUFFER_SIZE]; //output string unsigned char t_char; //current character // Instruction length #ifndef INST_LENGTH #define INST_LENGTH 6 #endif // XMIT output DDR #ifndef XMIT_DDR #define XMIT_DDR DDRD.4 #endif // XMIT output port #ifndef XMIT_OUT #define XMIT_OUT PORTD.4 #endif // UART receive byte ready interrupt interrupt [USART_RXC] void uart_rec(void) { // Set the XMIT line to recieve XMIT_OUT = 0; // Read in a character r_char=UDR; // Add the character to the receive buffer r_buffer[r_index++]=r_char; // If we have received a full instruction if (r_index == INST_LENGTH) { // Set the message ready flag r_ready=1; // Turn off the receive interrupt UCSRB.7=0; } } // UART data register empty interrupt interrupt [USART_DRE] void uart_tx(void) { // Set the XMIT line to transmit XMIT_OUT = 1; // Read in a char from the buffer t_char = t_buffer[t_index]; // Increase and mod the index, to make this a circular buffer t_index = (t_index + 1) % TRANSMIT_BUFFER_SIZE; // If we have reached the end of the string if (t_index == t_end) { // Turn off the transmit interrupt UCSRB.5 = 0; } // Otherwise write it to the UART else UDR = t_char; // Set the XMIT line back to receive XMIT_OUT = 0; } // Function to setup the receive interrupt void uart_gets_int(void) { // Reset the variables r_ready=0; r_index=0; // Enable the receive ISR UCSRB.7=1; } // Function to initialize the UART void uart_init(unsigned char newBPS) { // Setup the UART registers UCSRB = 0x18; UBRRL = newBPS; // Setup the XMIT line XMIT_DDR = 1; } #endif