]> defiant.homedns.org Git - ros_wild_thumper.git/blobdiff - avr/nano/main.c
avr/nano: move avcc as adc reference
[ros_wild_thumper.git] / avr / nano / main.c
index 5418055daaf734023e65215f000ce8156d064300..0ca6e83313a173fc1d20a0526da6a28674b56588 100644 (file)
@@ -18,6 +18,8 @@
  * 0x06 Distance forward LSB
  * 0x07 Distance backward MSB
  * 0x08 Distance backward LSB
+ * 0x09 Voltage MSB
+ * 0x0A Voltage LSB
  *
  * 0xff Bootloader
  */
@@ -35,6 +37,7 @@ static volatile uint16_t dist_forward=0;
 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)
 {
@@ -103,6 +106,15 @@ ISR(TWI_vect)
                                        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;
@@ -123,7 +135,7 @@ uint16_t ReadChannel(uint8_t mux) {
        // 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" */
@@ -159,6 +171,11 @@ static unsigned short get_distance(uint8_t i) {
 }
 
 
+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;
@@ -221,6 +238,9 @@ int main(void) {
                        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();