summaryrefslogtreecommitdiff
path: root/src/micropeak/ao_async.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-01-10 21:48:12 -0800
committerKeith Packard <keithp@keithp.com>2013-01-10 21:48:12 -0800
commit1ed6b13e87c1cc2d6618b6ba3a293ea6e3b5752e (patch)
tree10adf6f3c6b6c1ed2bf7540a9972fe72253cfa81 /src/micropeak/ao_async.c
parentacff2f466031fd1a8533fc315411c3734a8bacc6 (diff)
parentd409417ff8e9ed9d406bf1c04542a4ecb574768b (diff)
Merge remote-tracking branch 'origin/micropeak-logging'
Diffstat (limited to 'src/micropeak/ao_async.c')
-rw-r--r--src/micropeak/ao_async.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/micropeak/ao_async.c b/src/micropeak/ao_async.c
index 04bba9e8..3556f54c 100644
--- a/src/micropeak/ao_async.c
+++ b/src/micropeak/ao_async.c
@@ -21,20 +21,51 @@
#define AO_ASYNC_BAUD 38400l
#define AO_ASYNC_DELAY (uint8_t) (1000000l / AO_ASYNC_BAUD)
+#define LED_PORT PORTB
+
+void
+ao_async_start(void)
+{
+ LED_PORT |= (1 << AO_LED_SERIAL);
+}
+
+void
+ao_async_stop(void)
+{
+ LED_PORT &= ~(1 << AO_LED_SERIAL);
+}
+
void
ao_async_byte(uint8_t byte)
{
uint8_t b;
uint16_t w;
- /* start bit */
-
- /* start data stop */
- w = 0x001 | (byte << 1) | 0x000;
+ /* start data stop */
+ w = (0x000 << 0) | (byte << 1) | (0x001 << 9);
+ ao_arch_block_interrupts();
for (b = 0; b < 10; b++) {
- ao_led_set((w & 1) << AO_LED_SERIAL);
+ uint8_t v = LED_PORT & ~(1 << AO_LED_SERIAL);
+ v |= (w & 1) << AO_LED_SERIAL;
+ LED_PORT = v;
w >>= 1;
- ao_delay_us(26);
+
+ /* Carefully timed to hit around 9600 baud */
+ asm volatile ("nop");
+ asm volatile ("nop");
+
+ asm volatile ("nop");
+ asm volatile ("nop");
+ asm volatile ("nop");
+ asm volatile ("nop");
+ asm volatile ("nop");
+
+ asm volatile ("nop");
+ asm volatile ("nop");
+ asm volatile ("nop");
+ asm volatile ("nop");
+ asm volatile ("nop");
}
+ ao_arch_release_interrupts();
}