summaryrefslogtreecommitdiffstats
path: root/lock/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'lock/util.c')
-rw-r--r--lock/util.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/lock/util.c b/lock/util.c
index 4f63625..ebcf9fe 100644
--- a/lock/util.c
+++ b/lock/util.c
@@ -21,3 +21,26 @@ void xor(const char *k, const char *s, char *d, uint8_t n)
d[i] = s[i] ^ k[i];
}
+/* Measure vcc by measuring known internal 1.1v bandgap
+ * reference voltage against AVCC.
+ * Place a 100nF bypass capacitor on AREF.
+ */
+uint16_t getvcc(void)
+{
+ uint16_t vcc;
+
+ ADMUX |= (1 << REFS0);
+ ADMUX |= (1 << MUX3) | (1 << MUX2) | (1 << MUX1);
+ ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS0);
+
+ // https://www.sciencetronics.com/greenphotons/?p=1521
+ _delay_us(500);
+
+ ADCSRA |= (1 << ADSC);
+ while (ADCSRA & (1 << ADSC))
+ ;
+ vcc = (1100UL * 1023 / ADC);
+
+ ADCSRA &= ~(1 << ADEN);
+ return vcc;
+}