Project

General

Profile

Statistics
| Revision:

root / trunk / toolbox / uart.c @ 139

History | View | Annotate | Download (2.45 KB)

1
/********
2
 * This file is part of Tooltron.
3
 *
4
 * Tooltron is free software: you can redistribute it and/or modify
5
 * it under the terms of the Lesser GNU General Public License as published by
6
 * the Free Software Foundation, either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * Tooltron is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * Lesser GNU General Public License for more details.
13
 * You should have received a copy of the Lesser GNU General Public License
14
 * along with Tooltron.  If not, see <http://www.gnu.org/licenses/>.
15
 *
16
 * Copyright 2009 Kevin Woo <kwoo@2ndt.com>
17
 *
18
 ********/
19
/** @file uart.c
20
 *        
21
 *        @brief Implements UART functionality in hardware
22
 *
23
 *        @author Kevin Woo (kwoo)
24
 */
25

    
26
#include "uart.h"
27
#include <avr/delay.h>
28
#include <stdint.h>
29

    
30
uint8_t received_byte;     //Byte received
31
uint8_t byte_ready;        //New byte has been received
32

    
33
void init_uart(uint16_t baud) {
34
        // Set baud rate
35
        UBRRH = (uint8_t)(baud>>8);
36
        UBRRL = (uint8_t)baud;
37
        
38
        // Enable RX/TX and RX/TX Interrupt
39
        UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXCIE) | _BV(TXEN);
40
 
41
        // Enable the TXEN pin as output
42
        DDRD |= TX_EN;
43

    
44
    // Initialize receive variables
45
    byte_ready = 0;
46
    received_byte = 0x0;
47
}
48

    
49
int8_t uart_get_byte(uint8_t *output_byte) {
50
        if (byte_ready) {
51
                byte_ready = 0;
52
                *output_byte = received_byte;
53
                return 0;
54
        } else {
55
                return -1;
56
        }
57
}
58

    
59
void uart_send_byte(uint8_t data) {
60
        //Waits until current transmit is done
61
    while (!(UCSRA & _BV(UDRE)));
62

    
63
    // Enable writes and send
64
        uart_toggle_transmit(UART_TX_ON);
65
    UDR = data;
66
        return;
67
}
68

    
69
char usb_puti(int value ) {
70
  unsigned char usb_data[6]={'0','0','0','0','0','0' }, position=sizeof(usb_data), radix=10; 
71

    
72
  /* convert int to ascii  */ 
73
  if(value<0) { 
74
    uart_send_byte('-'); 
75
    value=-value; 
76
  }    
77
  do { 
78
    position--; 
79
    *(usb_data+position)=(value%radix)+'0'; 
80
    value/=radix;  
81
  } while(value); 
82

    
83
    
84
  /* start displaying the number */
85
  for(;position<=(sizeof(usb_data)-1);position++) {
86
            
87
    uart_send_byte(usb_data[position]);
88
  }
89

    
90
  return 0;
91
}
92

    
93
void uart_toggle_transmit(uint8_t state) {
94
        if (state == UART_TX_ON) {
95
                PORTD |= TX_EN;
96
        } else {
97
                PORTD &= ~TX_EN;
98
        }
99
}
100

    
101
ISR(USART_RX_vect) {
102
    received_byte = UDR;
103
    byte_ready = 1;    
104
}
105

    
106
ISR(USART_TX_vect) {
107
    // Re-enable reads
108
    uart_toggle_transmit(UART_TX_OFF);
109
}