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.
93 lines
1.8 KiB
93 lines
1.8 KiB
/** @file ir_uart.c
|
|
@author Michael Hayes
|
|
@date 10 December 2004
|
|
*/
|
|
#include "system.h"
|
|
#include "ir_uart.h"
|
|
#include "usart1.h"
|
|
#include "timer0.h"
|
|
#include "pio.h"
|
|
|
|
|
|
/* Return non-zero if there is a character ready to be read. */
|
|
bool
|
|
ir_uart_read_ready_p (void)
|
|
{
|
|
return usart1_read_ready_p ();
|
|
}
|
|
|
|
|
|
/* Read character from IR_UART. This blocks if nothing
|
|
is available to read. */
|
|
int8_t
|
|
ir_uart_getc (void)
|
|
{
|
|
return usart1_getc ();
|
|
}
|
|
|
|
|
|
/* Return non-zero if a character can be written without blocking. */
|
|
bool
|
|
ir_uart_write_ready_p (void)
|
|
{
|
|
return usart1_write_ready_p ();
|
|
}
|
|
|
|
|
|
/* Return non-zero if transmitter finished. */
|
|
bool
|
|
ir_uart_write_finished_p (void)
|
|
{
|
|
return usart1_write_finished_p ();
|
|
}
|
|
|
|
|
|
/* Write character to IR_UART. This returns zero if
|
|
the character could not be written. */
|
|
int8_t
|
|
ir_uart_putc (char ch)
|
|
{
|
|
usart1_putc (ch);
|
|
|
|
/* Gobble echoed character. The echoing is due to an electrical
|
|
common-path interference problem caused by a poor PCB layout of the
|
|
track powering the IR receiver. */
|
|
ir_uart_getc ();
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/* Write string to IR_UART. */
|
|
void
|
|
ir_uart_puts (const char *str)
|
|
{
|
|
usart1_puts (str);
|
|
}
|
|
|
|
|
|
/* Initialise ir_uart and set baud rate. */
|
|
uint8_t
|
|
ir_uart_init (void)
|
|
{
|
|
usart1_cfg_t usart1_cfg =
|
|
{
|
|
.baud_divisor = USART1_BAUD_DIVISOR (IR_UART_BAUD_RATE),
|
|
.bits = 8
|
|
};
|
|
|
|
|
|
/* Need to configure DDR so pin is an output.
|
|
The state is controlled by the timer. */
|
|
pio_config_set (IR_TX_HIGH_PIO, PIO_OUTPUT_HIGH);
|
|
timer0_init ();
|
|
|
|
timer0_period_set (F_CPU / (IR_MODULATION_FREQ * 2));
|
|
timer0_mode_set (TIMER0_MODE_CTC);
|
|
timer0_output_set (TIMER0_OUTPUT_B, TIMER0_OUTPUT_MODE_TOGGLE);
|
|
|
|
timer0_start ();
|
|
|
|
return usart1_init (&usart1_cfg);
|
|
}
|