As a first approach i wanted to find out how to count the time between two button presses. Based on this project I would use a one second watchdog timer in interrupt mode to increment a counter:
ISR(WDT_vect)
{
seconds++;
}Instead of the buttons being pooled, I also implemented a hardware pin interrupt. When the interrupt occours, the ISR function is called with the PCINT0 vector, as this:
ISR(PCINT0_vect)
{
unset_interrupt();
switch(button_press)
{
case START_P:
start_second = get_seconds();
blink(3);
break;
case STOP_P:
stop_second = get_seconds();
blink(2);
break;
default:
break;
}
button_press++;
duration = stop_second - start_second;
if(button_press>=3){
for (i=0; i <duration; i++)
{
blink(1);
}
button_press = START_P;
}
set_interrupt();
} The unset_interrupt() function stops the hardware interrupt, eliminating interference, and after running the code, we use set_interrupt() to re-enable the hardware interrupt.The function get_second() gets the current second, using atomic operation, from the seconds variable.
int get_seconds() { int current_second; ATOMIC_BLOCK(ATOMIC_FORCEON){ current_second = seconds; } return current_second; }
The next step I want to take is to eliminate the _delay_ms() functions of my code, do a little clean up and advance with the shutter part.
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.