X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=firmware%2Ffirmware.c;h=bbba9874c0231bf0467e01c249495dc264e52b9d;hb=2f5956f3e324eb12fa3c20f0f4383a1e745bbe78;hp=ce4a91486cda276c43235dca59fd77b373af6bd3;hpb=21e8a8ac43a7de8539e40ef6dfe7e2b7c731176c;p=openparking.git diff --git a/firmware/firmware.c b/firmware/firmware.c old mode 100755 new mode 100644 index ce4a914..bbba987 --- a/firmware/firmware.c +++ b/firmware/firmware.c @@ -2,9 +2,11 @@ #include #include #include +#include "clock.h" #include "modbus.h" -#define TIMEOUT 0x2FF +#define ECHO_TIMEOUT (CLOCK_HZ/10) // 10 ms +#define MEASUREMENT_WAIT (CLOCK_HZ/3) // three triggers per second #define N_TRIGGERS 3 #define N_SENSORS 12 @@ -48,13 +50,13 @@ static void do_measurement(unsigned char trig) pull_trigger(trig); - starttime = TCNT1; + starttime = get_clock(); while (to_start || to_measure) { uint8_t bits = 0; - uint16_t now = TCNT1; + uint16_t now = get_clock(); - if (now-starttime >= TIMEOUT) + if (now-starttime >= ECHO_TIMEOUT) break; bits = get_pin(trig); @@ -83,39 +85,66 @@ static void do_measurement(unsigned char trig) distances[trig*N_TRIG_SENSORS + i] = 0; } -static void do_measurements() -{ - uint8_t trig; - - for (trig = 0; trig < N_TRIGGERS; trig++) { - do_measurement(trig); - _delay_ms(200); - } -} - static void led_set(uint8_t led, uint8_t state) { if (led == 0) { - if (state) { - PORTD |= _BV(PD4); - // PORTC |= _BV(PC5); - led_bitmap |= 1; - } else { - PORTD &= ~_BV(PD4); - // PORTC &= ~_BV(PC5); + switch (state) { + case 0: led_bitmap &= ~1; + led_bitmap &= ~2; + break; + case 1: + led_bitmap |= 1; + led_bitmap &= ~2; + break; + default: // error + led_bitmap |= 2; + break; } } else { - if (state) { - PORTB |= _BV(PB5); - led_bitmap |= 2; - } else { - PORTB &= ~_BV(PB5); - led_bitmap &= ~2; + switch (state) { + case 0: + led_bitmap &= ~4; + led_bitmap &= ~8; + break; + case 1: + led_bitmap |= 4; + led_bitmap &= ~8; + break; + default: + led_bitmap |= 8; + break; } } } +static void leds_update() +{ + if (led_bitmap & 1) { + PORTC |= _BV(PC5); + } else { + PORTC &= ~_BV(PC5); + } + + if (led_bitmap & 2) { + DDRC &= ~_BV(PC5); + } else { + DDRC |= _BV(PC5); + } + + if (led_bitmap & 4) { + PORTB |= _BV(PB5); + } else { + PORTB &= ~_BV(PB5); + } + + if (led_bitmap & 8) { + DDRB |= _BV(PB5); + } else { + DDRB &= ~_BV(PB5); + } +} + static void eval_bitmaps() { uint16_t free_b = 0, err_b = 0, mask; @@ -137,7 +166,9 @@ static void eval_bitmaps() err_bitmap = err_b; if (led1_sensors) { - if (led1_sensors & free_bitmap) { + if (led1_sensors & err_bitmap) { + led_set(0, 2); + } else if (led1_sensors & free_bitmap) { led_set(0, 1); } else { led_set(0, 0); @@ -145,7 +176,9 @@ static void eval_bitmaps() } if (led2_sensors) { - if (led2_sensors & free_bitmap) { + if (led2_sensors & err_bitmap) { + led_set(1, 2); + } else if (led2_sensors & free_bitmap) { led_set(1, 1); } else { led_set(1, 0); @@ -169,8 +202,6 @@ int main() DDRD |= _BV(PD7); // Trig D DDRB |= _BV(PB4) | _BV(PB5); // Trig B, LED 2 DDRC |= _BV(PC4) | _BV(PC5); // Trig C, LED 1 - // temporary LED - DDRD |= _BV(PD4); // set up the timer TCCR1A = 0; @@ -184,12 +215,13 @@ int main() for (trig = 0; trig < N_TRIGGERS; trig++) { uint16_t now; do_measurement(trig); - now = TCNT1; - while (TCNT1-now < 200) + now = get_clock(); + while (get_clock()-now < MEASUREMENT_WAIT) modbus_poll(); } eval_bitmaps(); + leds_update(); // might be written from modbus // led_set(0, // distances[4] > 100 || distances[11] > 100); }