blob: ebcf9fe62a035442f37815b09187478b7a29f2ce (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "util.h"
int is_btn_pressed(uint8_t pin, uint8_t btn)
{
if (!((pin >> btn) & 0x01)) {
_delay_ms(100);
return !((pin >> btn) & 0x01);
}
return 0;
}
void xor(const char *k, const char *s, char *d, uint8_t n)
{
int i;
for (i = 0; i < n; i++)
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;
}
|