* 0x06 Distance forward LSB
* 0x07 Distance backward MSB
* 0x08 Distance backward LSB
+ * 0x15 Distance forward MSB (read only)
+ * 0x16 Distance forward LSB (read only)
+ * 0x17 Distance backward MSB (read only)
+ * 0x18 Distance backward LSB (read only)
+ * 0x09 Voltage MSB
+ * 0x0A Voltage LSB
*
* 0xff Bootloader
*/
static volatile uint16_t dist_backward=0;
static volatile uint8_t start_dist_fwd=0;
static volatile uint8_t start_dist_bwd=0;
+static volatile uint16_t voltage=0;
ISR(TWI_vect)
{
TWDR = tmp16;
TWI_ACK;
break;
+ case 0x15: // Distance forward MSB
+ tmp16 = dist_forward;
+ TWDR = tmp16>>8;
+ TWI_ACK;
+ break;
+ case 0x16: // Distance forward 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 0x09: // Voltage MSB
+ tmp16 = voltage;
+ TWDR = tmp16>>8;
+ TWI_ACK;
+ break;
+ case 0x0A: // Voltage LSB
+ TWDR = tmp16;
+ TWI_ACK;
+ break;
default:
TWDR = 0;
TWI_NAK;
// setzen auf 8 (1) und ADC aktivieren (1)
ADMUX = mux; // Kanal waehlen
- ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
+ ADMUX |= (1<<REFS0);
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
}
+static unsigned short get_voltage(void) {
+ return ReadChannel(2)*1.46;
+}
+
+
ISR(INT0_vect) {
static uint16_t t_start=0;
uint16_t t_now = TCNT1;
case 0x03: // ir right
dist_right = get_distance(1);
break;
+ case 0x09: // voltage
+ voltage = get_voltage();
+ break;
case 0xff: // Magic reg that starts the bootloader
if (bootloader == 0xa5) {
cli();