2 #include <avr/interrupt.h>
3 #include <util/delay.h>
11 #define N_TRIG_SENSORS 4
13 static int16_t distances[N_SENSORS];
15 static void pull_trigger(uint8_t trig)
18 case 0: PORTD |= _BV(PD7); _delay_us(10); PORTD &= ~_BV(PD7); break;
19 case 1: PORTB |= _BV(PB4); _delay_us(10); PORTB &= ~_BV(PB4); break;
20 case 2: PORTC |= _BV(PC4); _delay_us(10); PORTC &= ~_BV(PC4); break;
24 static uint16_t get_pin(uint8_t trig)
27 case 0: return (PIND & 0x78) >> 3;
28 case 1: return PINB & 0x0F;
29 default: return PINC & 0x0F;
33 static void do_measurement(unsigned char trig)
35 uint16_t starttimes[N_TRIG_SENSORS], starttime;
36 uint8_t to_start = (1 << N_TRIG_SENSORS) - 1;
37 uint8_t to_measure = 0, i;
43 while (to_start || to_measure) {
47 if (now-starttime >= TIMEOUT)
52 for (i = 0; i < N_TRIG_SENSORS; i++) {
53 uint8_t mask = 1 << i;
55 if ((to_start & mask) && (bits & mask)) {
60 } else if ((to_measure & mask) && !(bits & mask)) {
63 distances[trig*N_TRIG_SENSORS + i]
64 = now - starttimes[i];
69 for (i = 0; i < N_TRIG_SENSORS; i++)
70 if (to_start & (1 << i))
71 distances[trig*N_TRIG_SENSORS + i] = -1;
72 else if (to_measure & (1 << i))
73 distances[trig*N_TRIG_SENSORS + i] = 0;
76 static void do_measurements()
80 for (trig = 0; trig < N_TRIGGERS; trig++) {
86 static void led_set(uint8_t led, uint8_t state)
94 // PORTC &= ~_BV(PC5);
112 DDRD |= _BV(PD7); // Trig D
113 DDRB |= _BV(PB4) | _BV(PB5); // Trig B, LED 2
114 DDRC |= _BV(PC4) | _BV(PC5); // Trig C, LED 1
120 TCCR1B = _BV(CS12)|_BV(CS10); // CLK/1024
128 sprintf(obuf, "%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d\r\n",
129 distances[0], distances[1], distances[2],
130 distances[3], distances[4], distances[5],
131 distances[6], distances[7], distances[8],
132 distances[9], distances[10], distances[11]);
136 distances[4] > 100 || distances[11] > 100);