mirror of https://github.com/zrafa/xinu-avr.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.0 KiB
89 lines
2.0 KiB
#include <xinu.h> |
|
|
|
#include <avr/interrupt.h> |
|
|
|
typedef struct |
|
{ |
|
uint8_t status_control_a; /* ucsr0a USART Control and Status A */ |
|
|
|
uint8_t status_control_b; /* ucsr0b USART Control and Status B */ |
|
uint8_t status_control_c; /* ucsr0c USART Control and Status C */ |
|
uint8_t _reserved; /* espacio sin utilizar */ |
|
uint8_t baud_rate_l; /* ubrr0l baud rate low */ |
|
uint8_t baud_rate_h; /* ubrr0h baud rate high */ |
|
|
|
uint8_t data_es; /* udr0 i/o data */ |
|
|
|
} volatile uart_t; |
|
|
|
/* puntero a la estructura de los registros del periferico */ |
|
// volatile uart_t *puerto_serial = (uart_t *) (0xc0); |
|
|
|
char letra_start = 'R'; |
|
|
|
#define F_CPU 16000000UL |
|
|
|
#define USART_BAUDRATE 9600 |
|
#define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*16UL)))-1) |
|
#define INIT 0x06 |
|
#define EN_RX_TX 0x18 |
|
#define UART_RXCIE0 7 |
|
|
|
#define EN_TX 0x20 |
|
#define EN_RX 0x80 |
|
|
|
|
|
|
|
volatile uart_t *puerto_serial = (uart_t *) (0xc0); |
|
|
|
void serial_init() { |
|
|
|
/* Configurar los registros High y Low con BAUD_PRESCALE */ |
|
|
|
puerto_serial->baud_rate_h = (unsigned char) (BAUD_PRESCALE>>8); |
|
puerto_serial->baud_rate_l = (unsigned char) (BAUD_PRESCALE); |
|
/* Configurar un frame de 8bits, con un bit de paridad y bit de stop */ |
|
puerto_serial->status_control_c = (unsigned char)(INIT); |
|
|
|
/* Activar la recepcion y transmicion e interrupcion de recepcion */ |
|
puerto_serial->status_control_b = (unsigned char)(EN_RX_TX | (1<<UART_RXCIE0)); |
|
|
|
/* test */ |
|
// while(!((puerto_serial->status_control_a) & (EN_TX))); |
|
// puerto_serial->data_es = 'R'; |
|
} |
|
|
|
|
|
void serial_put_char (char outputChar) |
|
{ |
|
|
|
while(!((puerto_serial->status_control_a) & (EN_TX))); |
|
puerto_serial->data_es = outputChar; |
|
} |
|
|
|
char value; |
|
|
|
/* |
|
* RX interrupt service rutine |
|
*/ |
|
ISR(USART_RX_vect){ |
|
value = UDR0; //read UART register into value |
|
ttyhandler (1, value, 0); |
|
|
|
} |
|
|
|
char serial_get_char(void) |
|
{ |
|
/* Wait for the next character to arrive. */ |
|
while(!((puerto_serial->status_control_a) & (EN_RX))); |
|
return (puerto_serial->data_es); |
|
} |
|
|
|
void serial_put_str (char * mensaje) |
|
{ |
|
while (*mensaje) { |
|
serial_put_char(*mensaje); |
|
mensaje++; |
|
}; |
|
} |
|
|
|
|