blob: 5a22ef1e984152ce0bd9b8a9fdc3ca0043fd959f (
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "util.h"
#define LOCK_LED PC3
#define UNLOCK_LED PC4
#define BATLOW_LED PC5
#define LED_DDR DDRC
#define LED_PORT PORTC
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;
}
void led_init(void)
{
LED_DDR |= (1 << LOCK_LED) | (1 << UNLOCK_LED);
LED_DDR |= (1 << BATLOW_LED);
LED_PORT &= ~(1 << LOCK_LED);
LED_PORT &= ~(1 << UNLOCK_LED);
LED_PORT &= ~(1 << BATLOW_LED);
}
void led_locked(void)
{
LED_PORT |= (1 << LOCK_LED);
_delay_ms(70);
LED_PORT &= ~(1 << LOCK_LED);
_delay_ms(70);
LED_PORT |= (1 << LOCK_LED);
_delay_ms(70);
LED_PORT &= ~(1 << LOCK_LED);
}
void led_unlocked(void)
{
LED_PORT |= (1 << UNLOCK_LED);
_delay_ms(70);
LED_PORT &= ~(1 << UNLOCK_LED);
_delay_ms(70);
LED_PORT |= (1 << UNLOCK_LED);
_delay_ms(70);
LED_PORT &= ~(1 << UNLOCK_LED);
}
void led_bat(void)
{
LED_PORT ^= (1 << BATLOW_LED);
}
|