author | Tero Marttila <terom@paivola.fi> |
Wed, 08 Oct 2014 23:21:01 +0300 | |
changeset 5 | 5c86d54080c1 |
parent 4 | d0f29c45fe52 |
permissions | -rw-r--r-- |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
#include <avr/interrupt.h> |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
#include <avr/io.h> |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
|
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
4 |
#include "stdlib.h" |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
5 |
|
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
#define DEBUG_DDR DDRB |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
#define DEBUG_PIN 5 |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
#define DEBUG_PORT PORTB |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
|
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
10 |
/* Relay outputs */ |
2 | 11 |
#define RELAY_DDR DDRC |
12 |
#define RELAY_PORT PORTC |
|
13 |
#define RELAY_PIN PINC |
|
14 |
#define RELAY_PINS 4 |
|
15 |
||
16 |
#define RELAY_DOWN1 0 |
|
17 |
#define RELAY_DOWN2 1 |
|
18 |
#define RELAY_LEFT 2 |
|
19 |
#define RELAY_RIGHT 3 |
|
20 |
||
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
21 |
/* Switch inputs */ |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
22 |
static ioport_t *const SWITCH_DDR = &DDRD; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
23 |
static ioport_t *const SWITCH_PORT = &PORTD; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
24 |
static ioport_t *const SWITCH_PIN = &PIND; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
25 |
static ioport_t *const SWITCH_PCMSK = &PCMSK2; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
26 |
static const byte SWITCH_PCIE = PCIE2; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
27 |
static const byte SWITCH_PCIF = PCIF2; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
28 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
29 |
enum switch_bits { |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
30 |
SWITCH_LEFT = 0b00000100, |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
31 |
SWITCH_RIGHT = 0b00001000, |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
32 |
SWITCH_HORN1 = 0b00010000, |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
33 |
SWITCH_HORN2 = 0b00100000, |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
34 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
35 |
SWITCH_MASK = 0b00111100, |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
36 |
}; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
37 |
|
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
38 |
#include "adxl345.h" |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
#include "debug.h" |
2 | 40 |
#include "relay.h" |
1 | 41 |
#include "serial.h" |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
42 |
#include "spi.h" |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
43 |
#include "switch.h" |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
#include "timer.h" |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
|
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
int main (void) |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
{ |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
48 |
adxl345_init(); |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
debug_init(); |
2 | 50 |
relay_init(RELAY_PINS); |
1 | 51 |
serial_init(SERIAL_BAUD_9600, SERIAL_PARITY_N, SERIAL_STOPBITS_1); |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
52 |
spi_init(); |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
53 |
switch_init(); |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
timer_init(); |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
|
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
// init |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
57 |
unsigned char c = '.'; |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
58 |
byte s; |
1 | 59 |
unsigned short timeout = 8000; |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
60 |
int16_t adxl; |
1 | 61 |
|
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
debug_set(); |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
sei(); |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
|
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
65 |
adxl345_setup(); |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
66 |
|
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
// start |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
while (true) { |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
69 |
c = s = 0; |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
70 |
adxl = 0; |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
71 |
|
1 | 72 |
if (timer_sleep(timeout)) { |
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
73 |
c = 0; |
1 | 74 |
} else if ((c = serial_read())) { |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
75 |
switch (c) { |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
76 |
case 'L': relay_open(RELAY_LEFT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
77 |
case 'R': relay_open(RELAY_RIGHT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
78 |
case 'B': |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
79 |
relay_open(RELAY_DOWN1); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
80 |
relay_open(RELAY_DOWN2); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
81 |
break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
82 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
83 |
case 'l': relay_toggle(RELAY_LEFT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
84 |
case 'r': relay_toggle(RELAY_RIGHT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
85 |
case 'b': |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
86 |
relay_close(RELAY_DOWN1); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
87 |
relay_close(RELAY_DOWN2); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
88 |
break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
89 |
|
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
90 |
case 'd': c = adxl345_read_devid(); break; |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
91 |
case 'x': adxl = adxl345_read_x(); break; |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
92 |
case 'y': adxl = adxl345_read_y(); break; |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
93 |
case 'z': adxl = adxl345_read_z(); break; |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
94 |
|
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
95 |
default: |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
96 |
c = '!'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
97 |
break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
98 |
} |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
99 |
} else if (switch_read(&s)) { |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
100 |
c = '*'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
101 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
102 |
if (s & SWITCH_LEFT) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
103 |
c = 'l'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
104 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
105 |
if (s & SWITCH_RIGHT) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
106 |
c = 'r'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
107 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
108 |
if (s & SWITCH_HORN1) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
109 |
c = 'h'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
110 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
111 |
if (s & SWITCH_HORN2) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
112 |
c = 'h'; |
1 | 113 |
|
114 |
} else { |
|
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
115 |
// XXX: for some reason this occasionally gets stuck in an interrupt loop here after some switch events.. |
1 | 116 |
c = '?'; |
117 |
} |
|
118 |
||
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
119 |
// out |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
120 |
debug_toggle(); |
1 | 121 |
|
5
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
122 |
if (c == 'x' || c == 'y' || c == 'z') { |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
123 |
int8_t v = adxl / 255; |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
124 |
|
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
125 |
/* |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
126 |
if (adxl > 0) |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
127 |
serial_write('+'); |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
128 |
else if (adxl < 0) |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
129 |
serial_write('-'); |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
130 |
else |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
131 |
serial_write(' '); |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
132 |
*/ |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
133 |
serial_write(v); |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
134 |
} else if (c) { |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
135 |
serial_write(c); |
5c86d54080c1
carboard: use adxl for x/y/z readings and data; signed sensor values are still completely broken
Tero Marttila <terom@paivola.fi>
parents:
4
diff
changeset
|
136 |
} |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
137 |
} |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
138 |
} |