X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fnano%2Fmain.c;h=16a316cd655688767528f4d2763634f24ed1fcfe;hp=0ca6e83313a173fc1d20a0526da6a28674b56588;hb=da459c585c5e76c08dab0ef8d31be63a95e99ed1;hpb=d63dbc679f47b3d479e6e46fea01e5ee04bbd7ca diff --git a/avr/nano/main.c b/avr/nano/main.c index 0ca6e83..16a316c 100644 --- a/avr/nano/main.c +++ b/avr/nano/main.c @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include #include "uart.h" /* @@ -14,48 +17,61 @@ * 0x02 Distance left LSB * 0x03 Distance right MSB * 0x04 Distance right LSB - * 0x05 Distance forward MSB - * 0x06 Distance forward LSB + * 0x05 Distance forward1 MSB + * 0x06 Distance forward1 LSB * 0x07 Distance backward MSB * 0x08 Distance backward LSB * 0x09 Voltage MSB * 0x0A Voltage LSB + * 0x0B Distance forward2 MSB + * 0x0C Distance forward2 LSB + * + * 0x15 Distance forward1 MSB (read only) + * 0x16 Distance forward1 LSB (read only) + * 0x17 Distance backward MSB (read only) + * 0x18 Distance backward LSB (read only) + * 0x19 Distance forward2 MSB (read only) + * 0x1A Distance forward2 LSB (read only) * * 0xff Bootloader */ -#define TWI_ACK TWCR = (1<>8; TWI_ACK; break; - case 0x06: // Distance forward LSB + case 0x06: // Distance forward1 LSB TWDR = tmp16; TWI_ACK; break; @@ -115,12 +131,51 @@ ISR(TWI_vect) TWDR = tmp16; TWI_ACK; break; + case 0x0B: // Distance forward2 MSB + tmp16 = dist_forward2; + TWDR = tmp16>>8; + TWI_ACK; + break; + case 0x0C: // Distance forward2 LSB + TWDR = tmp16; + TWI_ACK; + break; + case 0x15: // Distance forward1 MSB + tmp16 = dist_forward1; + TWDR = tmp16>>8; + TWI_ACK; + break; + case 0x16: // Distance forward1 LSB + TWDR = tmp16; + TWI_ACK; + break; + case 0x17: // Distance backward MSB + tmp16 = dist_backward; + TWDR = tmp16>>8; + TWI_ACK; + break; + case 0x18: // Distance backward LSB + TWDR = tmp16; + TWI_ACK; + break; + case 0x19: // Distance forward2 MSB + tmp16 = dist_forward2; + TWDR = tmp16>>8; + TWI_ACK; + break; + case 0x1A: // Distance forward2 LSB + TWDR = tmp16; + TWI_ACK; + break; default: TWDR = 0; TWI_NAK; } ireg++; break; + case TW_SR_STOP: + TWI_ACK; + break; default: TWI_RESET; } @@ -186,9 +241,9 @@ ISR(INT0_vect) { t_start = t_now; } else { t_diff = t_now - t_start; - dist_forward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm + dist_forward1 = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm // disable this interrupt - EIMSK |= (1 << INT0); + EIMSK &= ~(1 << INT0); } } @@ -205,8 +260,31 @@ ISR(INT1_vect) { t_diff = t_now - t_start; dist_backward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm // disable this interrupt - EIMSK |= (1 << INT1); + EIMSK &= ~(1 << INT1); + } +} + + +ISR(PCINT2_vect) { + uint8_t pind_cur = PIND; + + if ((pind_cur ^ pind_pre) & (1<<4)) { // PCINT20 + static uint16_t t_start=0; + uint16_t t_now = TCNT1; + uint16_t t_diff; + + if (bit_is_set(pind_cur, 4)) { // high level + // start timer + t_start = t_now; + } else { + t_diff = t_now - t_start; + dist_forward2 = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm + // disable this interrupt + PCMSK2 &= ~(1 << PCINT20); + } } + + pind_pre = pind_cur; } @@ -217,7 +295,7 @@ int main(void) { // I2C TWAR = 0x52; - TWI_RESET; + TWI_ACK; // Timer 1: Normal mode, Top: 0xffff, Prescaler: F_CPU/256=62500Hz TCCR1A = 0x0; @@ -225,6 +303,7 @@ int main(void) { // External Interrupts EICRA = (1 << ISC10) | (1 << ISC00); + PCICR = (1 << PCIE2); printf("\r\nStart\r\n"); @@ -244,17 +323,18 @@ int main(void) { case 0xff: // Magic reg that starts the bootloader if (bootloader == 0xa5) { cli(); - { - void (*start)(void) = (void*)0x1800; - start(); - } + // write mark to first area in eeprom + eeprom_write_byte((uint8_t*)0, 123); + eeprom_busy_wait(); + // Use watchdog to restart + wdt_enable(WDTO_15MS); } break; } - if (start_dist_fwd) { - start_dist_fwd = 0; - dist_forward = 0; + if (start_dist_fwd1) { + start_dist_fwd1 = 0; + dist_forward1 = 0; DDRD |= (1 << 2); PORTD |= (1 << 2); @@ -262,6 +342,7 @@ int main(void) { PORTD &= ~(1 << 2); DDRD &= ~(1 << 2); // wait for interrupt + EIFR &= (1 << INTF0); // clear old interrupt before enabling EIMSK |= (1 << INT0); } if (start_dist_bwd) { @@ -274,8 +355,23 @@ int main(void) { PORTD &= ~(1 << 3); DDRD &= ~(1 << 3); // wait for interrupt + EIFR &= (1 << INTF1); // clear old interrupt before enabling EIMSK |= (1 << INT1); } + if (start_dist_fwd2) { + start_dist_fwd2 = 0; + dist_forward2 = 0; + + // PD4 = PCINT20 + DDRD |= (1 << 4); + PORTD |= (1 << 4); + _delay_us(10); + PORTD &= ~(1 << 4); + DDRD &= ~(1 << 4); + // wait for interrupt + pind_pre = PIND; + PCMSK2 |= (1 << PCINT20); + } sleep_mode(); }