From 6f55cbee1d6d73fd86967d4b9bc554fb4bb63827 Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 22 Feb 2013 09:53:46 +0900 Subject: [PATCH 1/4] Add initial files for PC98 --- protocol/serial_soft.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index beddc353..e0661c3a 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -106,11 +106,19 @@ ISR(SERIAL_RXD_VECT) SERIAL_RXD_INT_ENTER() uint8_t data = 0; + #ifdef SERIAL_BIT_ORDER_MSB uint8_t mask = 0x80; #else uint8_t mask = 0x01; #endif + +#ifdef SERIAL_PARITY_ODD + uint8_t parity = 0; +#else + uint8_t parity = 1; +#endif + /* to center of start bit */ _delay_us(WAIT_US/2); do { @@ -119,6 +127,7 @@ ISR(SERIAL_RXD_VECT) if (SERIAL_RXD_READ()) { data |= mask; + parity ^= 1; } #ifdef SERIAL_BIT_ORDER_MSB mask >>= 1; @@ -126,11 +135,18 @@ ISR(SERIAL_RXD_VECT) mask <<= 1; #endif } while (mask); + + /* to center of parity bit */ + _delay_us(WAIT_US); + parity ^= SERIAL_RXD_READ(); + /* to center of stop bit */ _delay_us(WAIT_US); + _delay_us(WAIT_US/2); + parity = 1; uint8_t next = (rbuf_head + 1) % RBUF_SIZE; - if (next != rbuf_tail) { + if (parity && next != rbuf_tail) { rbuf[rbuf_head] = data; rbuf_head = next; } From 11b25580cb333eabc4dba799dc6a687cda7fba72 Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 22 Feb 2013 15:48:35 +0900 Subject: [PATCH 2/4] Quick Fix: read scan code from PC98 --- protocol/serial_soft.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index e0661c3a..47b1e457 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -48,6 +48,23 @@ POSSIBILITY OF SUCH DAMAGE. #define WAIT_US (1000000/SERIAL_BAUD) +#if 1 +#define WAIT_TICK (1000000/SERIAL_BAUD) +#define WAIT4(tick) _delay_us(tick) +#else +#define WAIT_TICK ((16000000/SERIAL_BAUD)/4 - 5) +static inline void WAIT4(uint8_t tick) +{ + __asm__ __volatile__ ( + "1: dec %0" "\n\t" + "nop" "\n\t" + "brne 1b" + : + : "r" (tick) + ); +} +#endif + void serial_init(void) { SERIAL_RXD_INIT(); @@ -60,6 +77,7 @@ static uint8_t rbuf[RBUF_SIZE]; static uint8_t rbuf_head = 0; static uint8_t rbuf_tail = 0; + uint8_t serial_recv(void) { uint8_t data = 0; @@ -103,6 +121,7 @@ void serial_send(uint8_t data) /* detect edge of start bit */ ISR(SERIAL_RXD_VECT) { +PORTD ^= 1<<7; SERIAL_RXD_INT_ENTER() uint8_t data = 0; @@ -120,11 +139,15 @@ ISR(SERIAL_RXD_VECT) #endif /* to center of start bit */ - _delay_us(WAIT_US/2); + //_delay_us(WAIT_US/2); + WAIT4(WAIT_TICK/2); +PORTD ^= 1<<7; do { /* to center of next bit */ - _delay_us(WAIT_US); + //_delay_us(WAIT_US); + WAIT4(WAIT_TICK); +PORTD ^= 1<<7; if (SERIAL_RXD_READ()) { data |= mask; parity ^= 1; @@ -137,19 +160,22 @@ ISR(SERIAL_RXD_VECT) } while (mask); /* to center of parity bit */ - _delay_us(WAIT_US); - parity ^= SERIAL_RXD_READ(); + //_delay_us(WAIT_US); + WAIT4(WAIT_TICK); + if (SERIAL_RXD_READ()) { parity ^= 1; } +PORTD ^= 1<<7; /* to center of stop bit */ - _delay_us(WAIT_US); - _delay_us(WAIT_US/2); + //_delay_us(WAIT_US); + WAIT4(WAIT_TICK); - parity = 1; uint8_t next = (rbuf_head + 1) % RBUF_SIZE; - if (parity && next != rbuf_tail) { + //if (parity && next != rbuf_tail) { + if (next != rbuf_tail) { rbuf[rbuf_head] = data; rbuf_head = next; } SERIAL_RXD_INT_EXIT(); +PORTD ^= 1<<7; } From deebebf6144f57acd94d0b261e88c2e1e4b433ff Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 22 Feb 2013 19:38:06 +0900 Subject: [PATCH 3/4] Fix softwere serial --- protocol/serial.h | 1 + protocol/serial_soft.c | 44 ++++++++++++++++-------------------------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/protocol/serial.h b/protocol/serial.h index bd071bec..96913c86 100644 --- a/protocol/serial.h +++ b/protocol/serial.h @@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE. /* host role */ void serial_init(void); uint8_t serial_recv(void); +int16_t serial_recv2(void); void serial_send(uint8_t data); #endif diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index 47b1e457..af5110b4 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -48,23 +48,6 @@ POSSIBILITY OF SUCH DAMAGE. #define WAIT_US (1000000/SERIAL_BAUD) -#if 1 -#define WAIT_TICK (1000000/SERIAL_BAUD) -#define WAIT4(tick) _delay_us(tick) -#else -#define WAIT_TICK ((16000000/SERIAL_BAUD)/4 - 5) -static inline void WAIT4(uint8_t tick) -{ - __asm__ __volatile__ ( - "1: dec %0" "\n\t" - "nop" "\n\t" - "brne 1b" - : - : "r" (tick) - ); -} -#endif - void serial_init(void) { SERIAL_RXD_INIT(); @@ -90,6 +73,18 @@ uint8_t serial_recv(void) return data; } +int16_t serial_recv2(void) +{ + uint8_t data = 0; + if (rbuf_head == rbuf_tail) { + return -1; + } + + data = rbuf[rbuf_tail]; + rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE; + return data; +} + void serial_send(uint8_t data) { /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */ @@ -139,13 +134,11 @@ PORTD ^= 1<<7; #endif /* to center of start bit */ - //_delay_us(WAIT_US/2); - WAIT4(WAIT_TICK/2); + _delay_us(WAIT_US/2); PORTD ^= 1<<7; do { /* to center of next bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); PORTD ^= 1<<7; if (SERIAL_RXD_READ()) { @@ -160,18 +153,15 @@ PORTD ^= 1<<7; } while (mask); /* to center of parity bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); if (SERIAL_RXD_READ()) { parity ^= 1; } PORTD ^= 1<<7; /* to center of stop bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); uint8_t next = (rbuf_head + 1) % RBUF_SIZE; - //if (parity && next != rbuf_tail) { - if (next != rbuf_tail) { + if (parity && next != rbuf_tail) { rbuf[rbuf_head] = data; rbuf_head = next; } From 15feb7a8e3d895ad86d0dbc1b909dd5c2f3e5185 Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 23 Feb 2013 14:32:34 +0900 Subject: [PATCH 4/4] Fix debug code of serial_soft.c --- protocol/serial_soft.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index af5110b4..3c9c914e 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -48,8 +48,20 @@ POSSIBILITY OF SUCH DAMAGE. #define WAIT_US (1000000/SERIAL_BAUD) +/* debug for signal timing, see debug pin with oscilloscope */ +#ifdef SERIAL_SOFT_DEBUG + #define SERIAL_SOFT_DEBUG_INIT() (DDRD |= 1<<7) + #define SERIAL_SOFT_DEBUG_TGL() (PORTD ^= 1<<7) +#else + #define SERIAL_SOFT_DEBUG_INIT() + #define SERIAL_SOFT_DEBUG_TGL() +#endif + + void serial_init(void) { + SERIAL_SOFT_DEBUG_INIT(); + SERIAL_RXD_INIT(); SERIAL_TXD_INIT(); } @@ -116,7 +128,7 @@ void serial_send(uint8_t data) /* detect edge of start bit */ ISR(SERIAL_RXD_VECT) { -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() SERIAL_RXD_INT_ENTER() uint8_t data = 0; @@ -129,21 +141,23 @@ PORTD ^= 1<<7; #ifdef SERIAL_PARITY_ODD uint8_t parity = 0; -#else +#elif defined(SERIAL_PARITY_EVEN) uint8_t parity = 1; #endif /* to center of start bit */ _delay_us(WAIT_US/2); -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() do { /* to center of next bit */ _delay_us(WAIT_US); -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() if (SERIAL_RXD_READ()) { data |= mask; +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) parity ^= 1; +#endif } #ifdef SERIAL_BIT_ORDER_MSB mask >>= 1; @@ -152,20 +166,26 @@ PORTD ^= 1<<7; #endif } while (mask); +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) /* to center of parity bit */ _delay_us(WAIT_US); if (SERIAL_RXD_READ()) { parity ^= 1; } -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() +#endif /* to center of stop bit */ _delay_us(WAIT_US); uint8_t next = (rbuf_head + 1) % RBUF_SIZE; +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) if (parity && next != rbuf_tail) { +#else + if (next != rbuf_tail) { +#endif rbuf[rbuf_head] = data; rbuf_head = next; } SERIAL_RXD_INT_EXIT(); -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() }