```
include ¶
include ¶
include ¶
define output(directions,pin) (directions |= pin) // set port direction for output¶
define set(port,pin) (port |= pin) // set port pin¶
define clear(port,pin) (port &= (~pin)) // clear port pin¶
define pin_test(pins,pin) (pins & pin) // test for port pin¶
define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set¶
define bit_delay_time 8.5 // bit delay for 115200 with overhead¶
define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay¶
define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay¶
define char_delay() _delay_ms(10) // char delay¶
define serial_port PORTA¶
define serial_direction DDRA¶
define serial_pins PINA¶
define serial_pin_in (1 << PA0)¶
define serial_pin_out (1 << PA1)¶
define max_buffer 25¶
void get_char(volatile unsigned char pins, unsigned char pin, char rxbyte) {
//
// read character into rxbyte on pins pin
// assumes line driver (inverts bits)
//
rxbyte = 0;
while (pin_test(pins,pin))
//
// wait for start bit
//
;
//
// delay to middle of first data bit
//
half_bit_delay();
bit_delay();
//
// unrolled loop to read data bits
//
if pin_test(pins,pin)
rxbyte |= (1 << 0);
else
rxbyte |= (0 << 0);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 1);
else
rxbyte |= (0 << 1);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 2);
else
rxbyte |= (0 << 2);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 3);
else
rxbyte |= (0 << 3);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 4);
else
rxbyte |= (0 << 4);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 5);
else
rxbyte |= (0 << 5);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 6);
else
rxbyte |= (0 << 6);
bit_delay();
if pin_test(pins,pin)
rxbyte |= (1 << 7);
else
rxbyte |= (0 << 7);
//
// wait for stop bit
//
bit_delay();
half_bit_delay();
}
```