author | Tero Marttila <terom@paivola.fi> |
Thu, 25 Sep 2014 00:56:54 +0300 | |
changeset 3 | 87dd3b72b024 |
parent 2 | 2687fbd14fd9 |
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 |
|
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
#include "debug.h" |
2 | 39 |
#include "relay.h" |
1 | 40 |
#include "serial.h" |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
41 |
#include "switch.h" |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
#include "timer.h" |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
|
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
int main (void) |
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 |
debug_init(); |
2 | 47 |
relay_init(RELAY_PINS); |
1 | 48 |
serial_init(SERIAL_BAUD_9600, SERIAL_PARITY_N, SERIAL_STOPBITS_1); |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
49 |
switch_init(); |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
timer_init(); |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
|
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
// init |
1 | 53 |
char c = '.'; |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
54 |
byte s; |
1 | 55 |
unsigned short timeout = 8000; |
56 |
||
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
debug_set(); |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
sei(); |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
|
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
// start |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
while (true) { |
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
62 |
c = s = 0; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
63 |
|
1 | 64 |
if (timer_sleep(timeout)) { |
65 |
c = '.'; |
|
66 |
} else if ((c = serial_read())) { |
|
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
67 |
switch (c) { |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
68 |
case 'L': relay_open(RELAY_LEFT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
69 |
case 'R': relay_open(RELAY_RIGHT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
70 |
case 'B': |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
71 |
relay_open(RELAY_DOWN1); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
72 |
relay_open(RELAY_DOWN2); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
73 |
break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
74 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
75 |
case 'l': relay_toggle(RELAY_LEFT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
76 |
case 'r': relay_toggle(RELAY_RIGHT); break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
77 |
case 'b': |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
78 |
relay_close(RELAY_DOWN1); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
79 |
relay_close(RELAY_DOWN2); |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
80 |
break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
81 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
82 |
default: |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
83 |
c = '!'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
84 |
break; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
85 |
} |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
86 |
} else if (switch_read(&s)) { |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
87 |
c = '*'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
88 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
89 |
if (s & SWITCH_LEFT) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
90 |
c = 'l'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
91 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
92 |
if (s & SWITCH_RIGHT) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
93 |
c = 'r'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
94 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
95 |
if (s & SWITCH_HORN1) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
96 |
c = 'h'; |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
97 |
|
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
98 |
if (s & SWITCH_HORN2) |
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
99 |
c = 'h'; |
1 | 100 |
|
101 |
} else { |
|
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
102 |
// XXX: for some reason this occasionally gets stuck in an interrupt loop here after some switch events.. |
1 | 103 |
c = '?'; |
104 |
} |
|
105 |
||
3
87dd3b72b024
read switch input, output on serial
Tero Marttila <terom@paivola.fi>
parents:
2
diff
changeset
|
106 |
// out |
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
debug_toggle(); |
1 | 108 |
|
109 |
serial_write(c); |
|
0
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
110 |
} |
cae83b7bfcf4
trivial avr-gcc hello skeleton using qmsk-arduino: debug timer
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
111 |
} |