From f32244351f8c95ef30f5c889cf859aa4f15b9b64 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 17 Aug 2025 10:07:43 +0800 Subject: Define function to measure battery level. --- main.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index beeb87a..a16101d 100644 --- a/main.c +++ b/main.c @@ -100,6 +100,28 @@ static inline void flash_led(void) } } +static inline uint16_t get_bat_volt(void) +{ + uint16_t vbg; + + ADMUX |= (1 << REFS0); + ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); /* clk: 50-200 kHz */ + + // https://www.sciencetronics.com/greenphotons/?p=1521 + _delay_us(500); + + ADCSRA |= (1 << ADSC); + while (ADCSRA & (1 << ADSC)) + ; + + ADCSRA &= ~(1 << ADEN); + vbg = 3300UL / 1024 * ADC + + ADCSRA &= ~(1 << ADEN); + + return vbg * 3; +} + int main(void) { uint16_t id; @@ -124,7 +146,7 @@ int main(void) TCCR1A |= (1 << COM1A1); SERVO_DDR |= (1 << SERVO_PIN); - /* battery check */ + /* bat check */ LED_DDR |= (1 << LED_PIN); LED_PORT &= ~(1 << LED_PIN); -- cgit v1.2.3 From 8bf93bfd50113ec09ec5cb231634527569c50c20 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 17 Aug 2025 11:34:04 +0800 Subject: Use 1.1V reference voltage. --- main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.c b/main.c index a16101d..ddf8f42 100644 --- a/main.c +++ b/main.c @@ -100,11 +100,11 @@ static inline void flash_led(void) } } -static inline uint16_t get_bat_volt(void) +static inline uint16_t getbat(void) { uint16_t vbg; - ADMUX |= (1 << REFS0); + ADMUX |= (1 << REFS1) | (1 << REFS0); ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); /* clk: 50-200 kHz */ // https://www.sciencetronics.com/greenphotons/?p=1521 @@ -115,11 +115,11 @@ static inline uint16_t get_bat_volt(void) ; ADCSRA &= ~(1 << ADEN); - vbg = 3300UL / 1024 * ADC - + vbg = (1100UL * ADC) / 1024; ADCSRA &= ~(1 << ADEN); - return vbg * 3; + // 56k/10k voltage divider + return (vbg * 66) / 10; } int main(void) -- cgit v1.2.3 From 768ae230f9f8100715533dab49a3cf49f839d6be Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 17 Aug 2025 11:58:58 +0800 Subject: Use MOSFET. --- main.c | 112 +++++++++++++++++------------------------------------------------ 1 file changed, 29 insertions(+), 83 deletions(-) diff --git a/main.c b/main.c index ddf8f42..6967083 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -19,6 +20,7 @@ #define LED_DDR DDRB #define LED_PORT PORTB +#define PWR_BATCHK PB2 #define PWR_SERVO PB3 #define PWR_FPM PB4 #define PWR_DDR DDRB @@ -100,10 +102,22 @@ static inline void flash_led(void) } } +static inline void pwr_batchk_on(void) +{ + PWR_PORT &= ~(1 << PWR_BATCHK); +} + +static inline void pwr_batchk_off(void) +{ + PWR_PORT |= (1 << PWR_BATCHK); +} + static inline uint16_t getbat(void) { uint16_t vbg; + pwr_batchk_on(); + ADMUX |= (1 << REFS1) | (1 << REFS0); ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); /* clk: 50-200 kHz */ @@ -117,6 +131,8 @@ static inline uint16_t getbat(void) ADCSRA &= ~(1 << ADEN); vbg = (1100UL * ADC) / 1024; ADCSRA &= ~(1 << ADEN); + + pwr_batchk_off(); // 56k/10k voltage divider return (vbg * 66) / 10; @@ -126,98 +142,28 @@ int main(void) { uint16_t id; - /* disable watchdog timer */ - cli(); - wdt_reset(); - MCUSR &= ~(1 << WDRF); - WDTCSR |= (1 << WDCE) | (1 << WDE); - WDTCSR = 0x00; - uart_init(); - PWR_DDR |= (1 << PWR_FPM) | (1 << PWR_SERVO); - pwron_fpm(); - fpm_init(); - - /* servo */ - TCCR1A |= (1 << WGM11); - TCCR1B |= (1 << WGM12) | (1 << WGM13); - TCCR1B |= (1 << CS11); - ICR1 = PWM_TOP; - TCCR1A |= (1 << COM1A1); - SERVO_DDR |= (1 << SERVO_PIN); + + PWR_DDR |= (1 << PWR_BATCHK); + pwr_batchk_off(); /* bat check */ LED_DDR |= (1 << LED_PIN); LED_PORT &= ~(1 << LED_PIN); - /* input ports */ - INPUT_DDR &= ~((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) | - (1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) | - (1 << ENROLL_PIN)); - - INPUT_PORT |= ((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) | - (1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) | - (1 << ENROLL_PIN)); - - EICRA = 0b00000000; - EIMSK = (1 << FPM_UNLOCK_INT); - - PCICR |= (1 << PCIE2); - PCMSK2 |= ((1 << FRONT_LOCK_INT) | (1 << ENROLL_INT) | - (1 << BACK_LOCK_INT) | (1 << BACK_UNLOCK_INT)); - flash_led(); + char s[5]; + s[4] = 0; + for (;;) { - switch(cmd) { - case LOCK_FRONT: - lock(); - fpm_led(FLASH, RED, 1); - break; - case LOCK_BACK: - lock(); - break; - case UNLOCK_FRONT: - if (fpm_match()) { - fpm_led(BREATHE, BLUE, 1); - unlock(); - } else { - fpm_led(BREATHE, RED, 1); - } - break; - case UNLOCK_BACK: - unlock(); - fpm_led(FLASH, BLUE, 1); - break; - case ENROLL: - id = fpm_match(); - if (id == 1 || id == 2) { - fpm_led(BREATHE, BLUE, 1); - _delay_ms(1000); - if (fpm_enroll()) - fpm_led(BREATHE, BLUE, 1); - else - fpm_led(BREATHE, RED, 1); - } - break; - default: - break; - } - - cmd = NONE; - _delay_ms(500); - - pwroff_fpm(); - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - sleep_enable(); - sleep_bod_disable(); - sei(); - sleep_cpu(); - - cli(); - sleep_disable(); - pwron_fpm(); - fpm_init(); + id = getbat(); + itoa(id, s, 10); + for (int i = 0; i < 4; i++) + uart_send((uint8_t)s[i]); + uart_send('\r'); + uart_send('\n'); + _delay_ms(1000); } return 0; -- cgit v1.2.3 From 8b5f69ea6f3516ac433bdbd98f3d1efe058b5861 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 17 Aug 2025 12:24:12 +0800 Subject: Restore main loop and add bat check. --- main.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 107 insertions(+), 22 deletions(-) diff --git a/main.c b/main.c index 6967083..5ecccb5 100644 --- a/main.c +++ b/main.c @@ -8,6 +8,8 @@ #include "fpm.h" #include "uart.h" +#define BATMIN 5300 + #define SERVO_PIN PB1 #define SERVO_DDR DDRB @@ -102,21 +104,23 @@ static inline void flash_led(void) } } -static inline void pwr_batchk_on(void) +static inline void pwron_batchk(void) { PWR_PORT &= ~(1 << PWR_BATCHK); } -static inline void pwr_batchk_off(void) +static inline void pwroff_batchk(void) { PWR_PORT |= (1 << PWR_BATCHK); } -static inline uint16_t getbat(void) +static void check_bat(void) { - uint16_t vbg; + char s[5]; + s[4] = 0; + uint16_t vbg, vcc; - pwr_batchk_on(); + pwron_batchk(); ADMUX |= (1 << REFS1) | (1 << REFS0); ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); /* clk: 50-200 kHz */ @@ -132,38 +136,119 @@ static inline uint16_t getbat(void) vbg = (1100UL * ADC) / 1024; ADCSRA &= ~(1 << ADEN); - pwr_batchk_off(); + pwroff_batchk(); // 56k/10k voltage divider - return (vbg * 66) / 10; + vcc = (vbg * 66) / 10; + + itoa(vcc, s, 10); + for (int i = 0; i < 4; i++) + uart_send((uint8_t)s[i]); + uart_send('\r'); + uart_send('\n'); + + if (vcc < BATMIN) + flash_led(); } int main(void) { uint16_t id; - uart_init(); - - PWR_DDR |= (1 << PWR_BATCHK); - pwr_batchk_off(); + /* disable watchdog timer */ + cli(); + wdt_reset(); + MCUSR &= ~(1 << WDRF); + WDTCSR |= (1 << WDCE) | (1 << WDE); + WDTCSR = 0x00; + + PWR_DDR |= (1 << PWR_BATCHK) | (1 << PWR_FPM) | (1 << PWR_SERVO); + pwroff_batchk(); - /* bat check */ + uart_init(); + pwron_fpm(); + fpm_init(); + + /* servo */ + TCCR1A |= (1 << WGM11); + TCCR1B |= (1 << WGM12) | (1 << WGM13); + TCCR1B |= (1 << CS11); + ICR1 = PWM_TOP; + TCCR1A |= (1 << COM1A1); + SERVO_DDR |= (1 << SERVO_PIN); + + /* battery check */ LED_DDR |= (1 << LED_PIN); LED_PORT &= ~(1 << LED_PIN); - flash_led(); + /* input ports */ + INPUT_DDR &= ~((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) | + (1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) | + (1 << ENROLL_PIN)); - char s[5]; - s[4] = 0; + INPUT_PORT |= ((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) | + (1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) | + (1 << ENROLL_PIN)); + + EICRA = 0b00000000; + EIMSK = (1 << FPM_UNLOCK_INT); + + PCICR |= (1 << PCIE2); + PCMSK2 |= ((1 << FRONT_LOCK_INT) | (1 << ENROLL_INT) | + (1 << BACK_LOCK_INT) | (1 << BACK_UNLOCK_INT)); for (;;) { - id = getbat(); - itoa(id, s, 10); - for (int i = 0; i < 4; i++) - uart_send((uint8_t)s[i]); - uart_send('\r'); - uart_send('\n'); - _delay_ms(1000); + check_bat(); + + switch(cmd) { + case LOCK_FRONT: + lock(); + fpm_led(FLASH, RED, 1); + break; + case LOCK_BACK: + lock(); + break; + case UNLOCK_FRONT: + if (fpm_match()) { + fpm_led(BREATHE, BLUE, 1); + unlock(); + } else { + fpm_led(BREATHE, RED, 1); + } + break; + case UNLOCK_BACK: + unlock(); + fpm_led(FLASH, BLUE, 1); + break; + case ENROLL: + id = fpm_match(); + if (id == 1 || id == 2) { + fpm_led(BREATHE, BLUE, 1); + _delay_ms(1000); + if (fpm_enroll()) + fpm_led(BREATHE, BLUE, 1); + else + fpm_led(BREATHE, RED, 1); + } + break; + default: + break; + } + + cmd = NONE; + _delay_ms(500); + + pwroff_fpm(); + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + sleep_enable(); + sleep_bod_disable(); + sei(); + sleep_cpu(); + + cli(); + sleep_disable(); + pwron_fpm(); + fpm_init(); } return 0; -- cgit v1.2.3 From c04e4c8672bcc2ef7ab65d3e6b0fc8c1ec77912a Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 17 Aug 2025 12:25:59 +0800 Subject: Remove debug code and clean up code. --- main.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/main.c b/main.c index 5ecccb5..229999c 100644 --- a/main.c +++ b/main.c @@ -116,8 +116,6 @@ static inline void pwroff_batchk(void) static void check_bat(void) { - char s[5]; - s[4] = 0; uint16_t vbg, vcc; pwron_batchk(); @@ -125,8 +123,7 @@ static void check_bat(void) ADMUX |= (1 << REFS1) | (1 << REFS0); ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); /* clk: 50-200 kHz */ - // https://www.sciencetronics.com/greenphotons/?p=1521 - _delay_us(500); + _delay_us(500); /* https://www.sciencetronics.com/greenphotons/?p=1521 */ ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)) @@ -138,15 +135,7 @@ static void check_bat(void) pwroff_batchk(); - // 56k/10k voltage divider - vcc = (vbg * 66) / 10; - - itoa(vcc, s, 10); - for (int i = 0; i < 4; i++) - uart_send((uint8_t)s[i]); - uart_send('\r'); - uart_send('\n'); - + vcc = (vbg * 66) / 10; /* 56k/10k divider */ if (vcc < BATMIN) flash_led(); } @@ -155,7 +144,7 @@ int main(void) { uint16_t id; - /* disable watchdog timer */ + /* disable wdt */ cli(); wdt_reset(); MCUSR &= ~(1 << WDRF); -- cgit v1.2.3 From 56abe66f1b1aa6e172b9aec916b87c60c08a94fe Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 17 Aug 2025 12:26:55 +0800 Subject: Set bat threshold to 5.1 V --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index 229999c..9efbffa 100644 --- a/main.c +++ b/main.c @@ -8,7 +8,7 @@ #include "fpm.h" #include "uart.h" -#define BATMIN 5300 +#define BATMIN 5100 #define SERVO_PIN PB1 #define SERVO_DDR DDRB -- cgit v1.2.3